From: Timo Sirainen Date: Mon, 6 Jun 2011 15:26:45 +0000 (+0300) Subject: Use SA_RESTART flag for signals wherever possible. X-Git-Tag: 2.0.14~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5512d420d826a2f9d4e7cb4e4919e1864fe688b0;p=thirdparty%2Fdovecot%2Fcore.git Use SA_RESTART flag for signals wherever possible. Only SIGTERM (and SIGINT for standalone programs) shouldn't use it. --- diff --git a/src/auth/auth-cache.c b/src/auth/auth-cache.c index 5ad49a83b1..aa67508175 100644 --- a/src/auth/auth-cache.c +++ b/src/auth/auth-cache.c @@ -134,8 +134,10 @@ struct auth_cache *auth_cache_new(size_t max_size, unsigned int ttl_secs, cache->ttl_secs = ttl_secs; cache->neg_ttl_secs = neg_ttl_secs; - lib_signals_set_handler(SIGHUP, TRUE, sig_auth_cache_clear, cache); - lib_signals_set_handler(SIGUSR2, TRUE, sig_auth_cache_stats, cache); + lib_signals_set_handler(SIGHUP, LIBSIG_FLAGS_SAFE, + sig_auth_cache_clear, cache); + lib_signals_set_handler(SIGUSR2, LIBSIG_FLAGS_SAFE, + sig_auth_cache_stats, cache); return cache; } diff --git a/src/auth/mech-winbind.c b/src/auth/mech-winbind.c index 4299191c2b..9a08607fe6 100644 --- a/src/auth/mech-winbind.c +++ b/src/auth/mech-winbind.c @@ -152,7 +152,8 @@ winbind_helper_connect(const struct auth_settings *set, if (!sigchld_handler_set) { sigchld_handler_set = TRUE; - lib_signals_set_handler(SIGCHLD, TRUE, sigchld_handler, NULL); + lib_signals_set_handler(SIGCHLD, LIBSIG_FLAGS_SAFE, + sigchld_handler, NULL); } } diff --git a/src/doveadm/doveadm-mail.c b/src/doveadm/doveadm-mail.c index 90bfdb980d..23d7143a87 100644 --- a/src/doveadm/doveadm-mail.c +++ b/src/doveadm/doveadm-mail.c @@ -267,8 +267,8 @@ doveadm_mail_all_users(struct doveadm_mail_cmd_context *ctx, char *argv[], ctx->storage_service = mail_storage_service_init(master_service, NULL, service_flags); - lib_signals_set_handler(SIGINT, FALSE, sig_die, NULL); - lib_signals_set_handler(SIGTERM, FALSE, sig_die, NULL); + lib_signals_set_handler(SIGINT, 0, sig_die, NULL); + lib_signals_set_handler(SIGTERM, 0, sig_die, NULL); ctx->v.init(ctx, (const void *)argv); if (hook_doveadm_mail_init != NULL) diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index b5ebdea501..47fd07df99 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -334,6 +334,7 @@ static void master_status_error(void *context) void master_service_init_finish(struct master_service *service) { + enum libsig_flags sigint_flags = LIBSIG_FLAG_DELAYED; struct stat st; const char *value; unsigned int count; @@ -343,10 +344,12 @@ void master_service_init_finish(struct master_service *service) /* set default signal handlers */ lib_signals_init(); - lib_signals_set_handler(SIGINT, TRUE, sig_die, service); - lib_signals_set_handler(SIGTERM, TRUE, sig_die, service); + if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) + sigint_flags |= LIBSIG_FLAG_RESTART; + lib_signals_set_handler(SIGINT, sigint_flags, sig_die, service); + lib_signals_set_handler(SIGTERM, LIBSIG_FLAG_DELAYED, sig_die, service); if ((service->flags & MASTER_SERVICE_FLAG_TRACK_LOGIN_STATE) != 0) { - lib_signals_set_handler(SIGUSR1, TRUE, + lib_signals_set_handler(SIGUSR1, LIBSIG_FLAGS_SAFE, sig_state_changed, service); } diff --git a/src/lib/child-wait.c b/src/lib/child-wait.c index e9881f5529..c4cb935d56 100644 --- a/src/lib/child-wait.c +++ b/src/lib/child-wait.c @@ -91,7 +91,8 @@ void child_wait_init(void) child_pids = hash_table_create(default_pool, default_pool, 0, NULL, NULL); - lib_signals_set_handler(SIGCHLD, TRUE, sigchld_handler, NULL); + lib_signals_set_handler(SIGCHLD, LIBSIG_FLAGS_SAFE, + sigchld_handler, NULL); } void child_wait_deinit(void) diff --git a/src/log/main.c b/src/log/main.c index 92c2aa3b84..6ce114debb 100644 --- a/src/log/main.c +++ b/src/log/main.c @@ -18,7 +18,8 @@ sig_reopen_logs(const siginfo_t *si ATTR_UNUSED, void *context ATTR_UNUSED) static void main_init(void) { - lib_signals_set_handler(SIGUSR1, TRUE, sig_reopen_logs, NULL); + lib_signals_set_handler(SIGUSR1, LIBSIG_FLAGS_SAFE, + sig_reopen_logs, NULL); log_connections_init(); } diff --git a/src/master/main.c b/src/master/main.c index fbe720622d..a4cea8b2ee 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -440,11 +440,14 @@ static void main_init(const struct master_settings *set) lib_signals_init(); lib_signals_ignore(SIGPIPE, TRUE); lib_signals_ignore(SIGALRM, FALSE); - lib_signals_set_handler(SIGHUP, TRUE, sig_settings_reload, NULL); - lib_signals_set_handler(SIGUSR1, TRUE, sig_log_reopen, NULL); - lib_signals_set_handler(SIGCHLD, TRUE, sig_reap_children, NULL); - lib_signals_set_handler(SIGINT, TRUE, sig_die, NULL); - lib_signals_set_handler(SIGTERM, TRUE, sig_die, NULL); + lib_signals_set_handler(SIGHUP, LIBSIG_FLAGS_SAFE, + sig_settings_reload, NULL); + lib_signals_set_handler(SIGUSR1, LIBSIG_FLAGS_SAFE, + sig_log_reopen, NULL); + lib_signals_set_handler(SIGCHLD, LIBSIG_FLAGS_SAFE, + sig_reap_children, NULL); + lib_signals_set_handler(SIGINT, LIBSIG_FLAGS_SAFE, sig_die, NULL); + lib_signals_set_handler(SIGTERM, LIBSIG_FLAGS_SAFE, sig_die, NULL); create_pid_file(pidfile_path); create_config_symlink(set); diff --git a/src/ssl-params/main.c b/src/ssl-params/main.c index f646f45f13..71bbe6a092 100644 --- a/src/ssl-params/main.c +++ b/src/ssl-params/main.c @@ -109,7 +109,7 @@ static void sig_chld(const siginfo_t *si ATTR_UNUSED, void *context ATTR_UNUSED) static void main_init(const struct ssl_params_settings *set) { - lib_signals_set_handler(SIGCHLD, TRUE, sig_chld, NULL); + lib_signals_set_handler(SIGCHLD, LIBSIG_FLAGS_SAFE, sig_chld, NULL); ssl_params = buffer_create_dynamic(default_pool, 1024); param = ssl_params_init(PKG_STATEDIR"/"SSL_BUILD_PARAM_FNAME, diff --git a/src/util/maildirlock.c b/src/util/maildirlock.c index 5a23dbd721..f776de23fe 100644 --- a/src/util/maildirlock.c +++ b/src/util/maildirlock.c @@ -63,8 +63,8 @@ int main(int argc, const char *argv[]) lib_init(); lib_signals_init(); ioloop = io_loop_create(); - lib_signals_set_handler(SIGINT, TRUE, sig_die, NULL); - lib_signals_set_handler(SIGTERM, TRUE, sig_die, NULL); + lib_signals_set_handler(SIGINT, LIBSIG_FLAG_DELAYED, sig_die, NULL); + lib_signals_set_handler(SIGTERM, LIBSIG_FLAG_DELAYED, sig_die, NULL); if (pid != 0) { close(fd[1]);