diff options
author | Harald Welte <laforge@gnumonks.org> | 2018-09-24 14:52:56 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-09-24 14:52:56 +0200 |
commit | 3e689874ff472c9e11660ad3938188d88a48bc27 (patch) | |
tree | 4aec5ba0974ecf4ac83069f6fe26555ace3f1f3d | |
parent | fd47119111375360265d2927c3a204066618d522 (diff) |
bankd: Handle errors during PC/SC open/connect
Change-Id: I304b4f73433d6027409aeef7faf04d4e8acd2e54
-rw-r--r-- | src/bankd_main.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/bankd_main.c b/src/bankd_main.c index f888e9a..7e650d3 100644 --- a/src/bankd_main.c +++ b/src/bankd_main.c @@ -255,10 +255,12 @@ static int worker_handle_connectClientReq(struct bankd_worker *worker, const Rsp { const struct ComponentIdentity *cid = &pdu->msg.choice.connectClientReq.identity; struct bankd_slot_mapping *slmap; + e_ResultCode res; + RsproPDU_t *resp; + int rc; OSMO_ASSERT(pdu->msg.present == RsproPDUchoice_PR_connectClientReq); - LOGW(worker, "connectClientReq(T=%lu, N='%s', SW='%s', VER='%s')\n", cid->type, cid->name.buf, cid->software.buf, cid->swVersion.buf); /* FIXME: store somewhere? */ @@ -282,6 +284,7 @@ static int worker_handle_connectClientReq(struct bankd_worker *worker, const Rsp worker->client.clslot.client_id, worker->client.clslot.slot_nr); worker_set_state(worker, BW_ST_CONN_CLIENT_WAIT_MAP); /* FIXME: how to update the map in case a map is installed later */ + res = ResultCode_cardNotPresent; } else { LOGW(worker, "slotmap found: C(%u:%u) -> B(%u:%u)\n", slmap->client.client_id, slmap->client.slot_nr, @@ -289,10 +292,15 @@ static int worker_handle_connectClientReq(struct bankd_worker *worker, const Rsp worker->slot = slmap->bank; worker_set_state(worker, BW_ST_CONN_CLIENT_MAPPED); /* actually open the mapped reader/card/slot */ - worker_open_card(worker); + rc = worker_open_card(worker); + if (rc == 0) + res = ResultCode_ok; + else + res = ResultCode_cardNotPresent; } - return 0; + resp = rspro_gen_ConnectClientRes(&worker->bankd->comp_id, res); + return worker_send_rspro(worker, resp); } static int worker_handle_tpduModemToCard(struct bankd_worker *worker, const RsproPDU_t *pdu) |