RESPONSECODE IFDHCloseChannel (DWORD Lun) { RESPONSECODE r = vicc_eject(); if (vicc_exit() < 0) { Log1(PCSC_LOG_ERROR, "Could not close connection to virtual ICC"); return IFD_COMMUNICATION_ERROR; } return r; }
RESPONSECODE IFDHCloseChannel (DWORD Lun) { size_t slot = Lun & 0xffff; if (slot >= vicc_max_slots) { return IFD_COMMUNICATION_ERROR; } if (vicc_exit(ctx[slot]) < 0) { Log1(PCSC_LOG_ERROR, "Could not close connection to virtual ICC"); return IFD_COMMUNICATION_ERROR; } ctx[slot] = NULL; return IFD_SUCCESS; }
struct vicc_ctx * vicc_init(const char *hostname, unsigned short port) { struct vicc_ctx *r = NULL; struct vicc_ctx *ctx = malloc(sizeof *ctx); if (!ctx) { goto err; } ctx->hostname = NULL; ctx->io_lock = NULL; ctx->server_sock = -1; ctx->client_sock = -1; ctx->port = port; #ifdef _WIN32 WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); #endif ctx->io_lock = create_lock(); if (!ctx->io_lock) { goto err; } if (hostname) { ctx->hostname = strdup(hostname); if (!ctx->hostname) { goto err; } ctx->client_sock = connectsock(hostname, port); } else { ctx->server_sock = opensock(port); if (ctx->server_sock < 0) { goto err; } } r = ctx; err: if (!r) { vicc_exit(ctx); } return r; }