diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/kdc/network.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/kdc/network.c b/src/kdc/network.c index f471a3a70..f3b87a176 100644 --- a/src/kdc/network.c +++ b/src/kdc/network.c @@ -386,12 +386,19 @@ delete_fd (struct connection *xconn) free(xconn); } +static const int one = 1; + static int setnbio(int sock) { - static const int one = 1; return ioctlsocket(sock, FIONBIO, (const void *)&one); } + +static int +setkeepalive(int sock) +{ + return setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &one, sizeof(one)); +} static int setnolinger(int s) @@ -1251,7 +1258,7 @@ static void accept_tcp_connection(struct connection *conn, const char *prog, close(s); return; } - setnbio(s), setnolinger(s); + setnbio(s), setnolinger(s), setkeepalive(s); sockdata.prog = prog; sockdata.retval = 0; @@ -1570,7 +1577,8 @@ listen_and_process(const char *prog) err = krb5int_cm_call_select(&sstate, &sout, &sret); if (err) { - com_err(prog, err, "while selecting for network input(1)"); + if (err != EINTR) + com_err(prog, err, "while selecting for network input(1)"); continue; } if (sret == 0 && netchanged) { @@ -1601,6 +1609,7 @@ listen_and_process(const char *prog) service_conn(conns[i], prog, sflags); } } + krb5_klog_syslog(LOG_INFO, "shutdown signal received"); return 0; } |