static int openct_reader_connect(sc_reader_t *reader, sc_slot_info_t *slot) { struct driver_data *data = (struct driver_data *) reader->drv_data; int rc; SC_FUNC_CALLED(reader->ctx, 1); if (data->h) ct_reader_disconnect(data->h); if (!(data->h = ct_reader_connect(data->num))) { sc_error(reader->ctx, "ct_reader_connect socket failed\n"); return SC_ERROR_CARD_NOT_PRESENT; } rc = ct_card_request(data->h, slot->id, 0, NULL, slot->atr, sizeof(slot->atr)); if (rc < 0) { sc_error(reader->ctx, "openct_reader_connect read failed: %s\n", ct_strerror(rc)); return SC_ERROR_CARD_NOT_PRESENT; } if (rc == 0) { sc_error(reader->ctx, "openct_reader_connect recved no data\n"); return SC_ERROR_READER; } slot->atr_len = rc; return SC_NO_ERROR; }
static int openct_reader_connect(sc_reader_t *reader) { struct driver_data *data = (struct driver_data *) reader->drv_data; int rc; SC_FUNC_CALLED(reader->ctx, SC_LOG_DEBUG_VERBOSE); if (reader->ctx->flags & SC_CTX_FLAG_TERMINATE) return SC_ERROR_NOT_ALLOWED; if (data->h) ct_reader_disconnect(data->h); if (!(data->h = ct_reader_connect(data->num))) { sc_debug(reader->ctx, SC_LOG_DEBUG_NORMAL, "ct_reader_connect socket failed\n"); return SC_ERROR_CARD_NOT_PRESENT; } rc = ct_card_request(data->h, data->slot, 0, NULL, reader->atr.value, sizeof(reader->atr.value)); if (rc < 0) { sc_debug(reader->ctx, SC_LOG_DEBUG_NORMAL, "openct_reader_connect read failed: %s\n", ct_strerror(rc)); return SC_ERROR_CARD_NOT_PRESENT; } if (rc == 0) { sc_debug(reader->ctx, SC_LOG_DEBUG_NORMAL, "openct_reader_connect recved no data\n"); return SC_ERROR_READER; } reader->atr.len = rc; return SC_SUCCESS; }
/* * Reset the card - this is the same as "request icc" without parameters */ int ct_card_reset(ct_handle * h, unsigned int slot, void *atr, size_t atr_len) { return ct_card_request(h, slot, 0, NULL, atr, atr_len); }