From 4c6e7501108f002f78463c788cd4cc5907bb6455 Mon Sep 17 00:00:00 2001 From: Bron Gondwana Date: Fri, 15 May 2009 14:27:06 +1000 Subject: [PATCH] SIGQUIT patches from Paul Turgyan Adds SIGQUIT support to cyr_expire and idled as well. --- imap/cyr_expire.c | 31 +++++++++++++++++++++++++++++++ imap/idled.c | 22 +++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletions(-) diff --git a/imap/cyr_expire.c b/imap/cyr_expire.c index e3db589..fcdc47c 100644 --- a/imap/cyr_expire.c +++ b/imap/cyr_expire.c @@ -74,6 +74,7 @@ /* global state */ const int config_need_data = 0; +static int sigquit = 0; void usage(void) { @@ -156,6 +157,9 @@ int expire(char *name, int matchlen, int maycreate __attribute__((unused)), int mbtype; char *path, *mpath; + if (sigquit) { + return 1; + } /* Skip remote mailboxes */ r = mboxlist_detail(name, &mbtype, &path, &mpath, NULL, NULL, NULL); if (r) { @@ -301,6 +305,9 @@ int delete(char *name, char *path, *mpath; time_t timestamp; + if (sigquit) { + return 1; + } if (config_virtdomains && (p = strchr(name, '!'))) domainlen = p - name + 1; @@ -345,6 +352,11 @@ int delete(char *name, } return(0); } +static void sighandler (int sig) +{ + sigquit = 1; + return; +} int main(int argc, char *argv[]) { @@ -357,6 +369,7 @@ int main(int argc, char *argv[]) struct expire_rock erock; struct delete_rock drock; const char *deletedprefix; + struct sigaction action; if ((geteuid()) == 0 && (become_cyrus() != 0)) { fatal("must run as the Cyrus user", EC_USAGE); @@ -408,6 +421,13 @@ int main(int argc, char *argv[]) if (!expire_days) usage(); + sigemptyset(&action.sa_mask); + action.sa_flags = 0; + action.sa_handler = sighandler; + if (sigaction(SIGQUIT, &action, NULL) < 0) { + fatal("unable to install signal handler for %d: %m", SIGQUIT); + } + cyrus_init(alt_config, "cyr_expire", 0); global_sasl_init(1, 0, NULL); @@ -454,6 +474,7 @@ int main(int argc, char *argv[]) } else { strlcpy(buf, "*", sizeof(buf)); } + mboxlist_findall(NULL, buf, 1, 0, 0, &expire, &erock); syslog(LOG_NOTICE, "Expunged %lu out of %lu messages from %lu mailboxes", @@ -462,6 +483,9 @@ int main(int argc, char *argv[]) fprintf(stderr, "\nExpunged %lu out of %lu messages from %lu mailboxes\n", erock.deleted, erock.messages, erock.mailboxes); } + if (sigquit) { + goto finish; + } if ((delete_days != -1) && mboxlist_delayed_delete_isenabled() && (deletedprefix = config_getstring(IMAPOPT_DELETEDPREFIX))) { @@ -484,6 +508,9 @@ int main(int argc, char *argv[]) mboxlist_findall(NULL, buf, 1, 0, 0, &delete, &drock); for (node = drock.head ; node ; node = node->next) { + if (sigquit) { + goto finish; + } if (drock.verbose) { fprintf(stderr, "Removing: %s\n", node->name); } @@ -500,10 +527,14 @@ int main(int argc, char *argv[]) } syslog(LOG_NOTICE, "Removed %d deleted mailboxes", count); } + if (sigquit) { + goto finish; + } /* purge deliver.db entries of expired messages */ r = duplicate_prune(expire_days, &expire_table); +finish: free_hash_table(&expire_table, free); quotadb_close(); diff --git a/imap/idled.c b/imap/idled.c index 7bef695..19bdcfd 100644 --- a/imap/idled.c +++ b/imap/idled.c @@ -77,6 +77,7 @@ extern char *optarg; static int verbose = 0; static int debugmode = 0; static time_t idle_timeout; +static int sigquit = 0; struct ientry { pid_t pid; @@ -247,6 +248,12 @@ void idle_alert(char *key __attribute__((unused)), } } +static void sighandler (int sig) +{ + sigquit = 1; + return; +} + int main(int argc, char **argv) { char shutdownfilename[1024]; @@ -266,6 +273,7 @@ int main(int argc, char **argv) int fd; char *alt_config = NULL; const char *idle_sock; + struct sigaction action; p = getenv("CYRUS_VERBOSE"); if (p) verbose = atoi(p) + 1; @@ -320,6 +328,14 @@ int main(int argc, char **argv) mboxlist_close(); mboxlist_done(); + sigemptyset(&action.sa_mask); + + action.sa_flags = 0; + action.sa_handler = sighandler; + if (sigaction(SIGQUIT, &action, NULL) < 0) { + fatal("unable to install signal handler for %d: %m", SIGQUIT); + } + /* create idle table -- +1 to avoid a zero value */ construct_hash_table(&itable, nmbox + 1, 1); ifreelist = NULL; @@ -369,6 +385,11 @@ int main(int argc, char **argv) syslog(LOG_DEBUG, "IDLE_ALERT\n"); hash_enumerate(&itable, idle_alert, NULL); + break; + } + if (sigquit) { + hash_enumerate(&itable, idle_alert, NULL); + break; } /* timeout for select is 1 second */ @@ -408,7 +429,6 @@ int main(int argc, char **argv) cyrus_done(); - /* never gets here */ exit(1); } -- 1.5.6.5