diff --git a/src/bankd_main.c b/src/bankd_main.c index 55d7155..955a432 100644 --- a/src/bankd_main.c +++ b/src/bankd_main.c @@ -9,6 +9,9 @@ #include #include +#include +#include + #include #include @@ -288,6 +291,23 @@ static int worker_transceive_loop(struct bankd_worker *worker) return 0; } +/* obtain an ascii representation of the client IP/port */ +static int worker_client_addrstr(char *out, unsigned int outlen, const struct bankd_worker *worker) +{ + char hostbuf[32], portbuf[32]; + int rc; + + rc = getnameinfo((const struct sockaddr *)&worker->client.peer_addr, + worker->client.peer_addr_len, hostbuf, sizeof(hostbuf), + portbuf, sizeof(portbuf), NI_NUMERICHOST | NI_NUMERICSERV); + if (rc != 0) { + out[0] = '\0'; + return -1; + } + snprintf(out, outlen, "%s:%s", hostbuf, portbuf); + return 0; +} + /* worker thread main function */ static void *worker_main(void *arg) { @@ -308,6 +328,8 @@ static void *worker_main(void *arg) /* we continuously perform the same loop here, recycling the worker thread * once the client connection is gone or we have some trouble with the card/reader */ while (1) { + char buf[128]; + worker->client.peer_addr_len = sizeof(worker->client.peer_addr); worker_set_state(worker, BW_ST_ACCEPTING); @@ -318,6 +340,8 @@ static void *worker_main(void *arg) continue; } worker->client.fd = rc; + worker_client_addrstr(buf, sizeof(buf), worker); + LOGW(worker, "Accepted connection from %s\n", buf); worker_set_state(worker, BW_ST_CONN_WAIT_ID); /* run the main worker transceive loop body until there was some error */ @@ -327,6 +351,8 @@ static void *worker_main(void *arg) break; } + LOGW(worker, "Error %d occurred: Cleaning up state\n", rc); + /* clean-up: reset to sane state */ if (worker->reader.pcsc.hCard) { SCardDisconnect(worker->reader.pcsc.hCard, SCARD_UNPOWER_CARD);