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; }
int vicc_exit(struct vicc_ctx *ctx) { int r = vicc_eject(ctx); if (ctx) { free_lock(ctx->io_lock); free(ctx->hostname); if (ctx->server_sock > 0) { ctx->server_sock = close(ctx->server_sock); if (ctx->server_sock < 0) { r -= 1; } } #ifdef _WIN32 WSACleanup(); #endif } return r; }
ssize_t vicc_transmit(struct vicc_ctx *ctx, size_t apdu_len, const unsigned char *apdu, unsigned char **rapdu) { ssize_t r = -1; if (ctx && lock(ctx->io_lock)) { r = sendToVICC(ctx, apdu_len, apdu); if (r > 0) r = recvFromVICC(ctx, rapdu); unlock(ctx->io_lock); } if (r <= 0) vicc_eject(ctx); return r; }
static ssize_t sendToVICC(struct vicc_ctx *ctx, size_t length, const unsigned char* buffer) { ssize_t r; uint16_t size; if (!ctx || length > 0xFFFF) { errno = EINVAL; return -1; } /* send size of message on 2 bytes */ size = htons((uint16_t) length); r = sendall(ctx->client_sock, (void *) &size, sizeof size); if (r == sizeof size) /* send message */ r = sendall(ctx->client_sock, buffer, length); if (r < 0) vicc_eject(ctx); return r; }