diff -Naur fetchmail-5.9.1.orig/driver.c fetchmail-5.9.1/driver.c --- fetchmail-5.9.1.orig/driver.c Mon Sep 24 23:17:47 2001 +++ fetchmail-5.9.1/driver.c Wed Sep 26 13:17:03 2001 @@ -94,6 +94,22 @@ longjmp(restart, THROW_SIGPIPE); } +/* ignore SIGALRM signal indicating a timeout during cleanup */ +static void cleanup_timeout_handler (int signal) { } + +#define CLEANUP_TIMEOUT 60 /* maximum timeout during cleanup */ + +static int cleanupSockClose (int fd) +/* close sockets in maximum CLEANUP_TIMEOUT seconds during cleanup */ +{ + void (*alrmsave)(int); + alrmsave = signal(SIGALRM, cleanup_timeout_handler); + set_timeout(CLEANUP_TIMEOUT); + SockClose(fd); + set_timeout(0); + signal(SIGALRM, alrmsave); +} + #ifdef KERBEROS_V4 static int kerberos_auth(socket, canonical, principal) /* authenticate to the server host using Kerberos V4 */ @@ -768,9 +784,9 @@ /* try to clean up all streams */ release_sink(ctl); if (ctl->smtp_socket != -1) - SockClose(ctl->smtp_socket); + cleanupSockClose(ctl->smtp_socket); if (mailserver_socket != -1) - SockClose(mailserver_socket); + cleanupSockClose(mailserver_socket); } else { @@ -1315,7 +1331,7 @@ */ if (err == 0) err = (fetches > 0) ? PS_SUCCESS : PS_NOMAIL; - SockClose(mailserver_socket); + cleanupSockClose(mailserver_socket); goto closeUp; cleanUp: @@ -1325,7 +1341,7 @@ stage = STAGE_LOGOUT; (ctl->server.base_protocol->logout_cmd)(mailserver_socket, ctl); } - SockClose(mailserver_socket); + cleanupSockClose(mailserver_socket); } msg = (const char *)NULL; /* sacrifice to -Wall */