s3:smbd/server: add parent specific SIGTERM and SIGHUP handlers
authorStefan Metzmacher <metze@samba.org>
Tue, 13 Dec 2011 08:04:20 +0000 (09:04 +0100)
committerStefan Metzmacher <metze@samba.org>
Tue, 13 Dec 2011 11:36:35 +0000 (12:36 +0100)
metze

source3/smbd/server.c

index 7985efc8958c3631cf9afc3ee81079c12865c204..948fd7f35951c2a2c4c68a15b2a5db681949b0e3 100644 (file)
@@ -834,6 +834,34 @@ static bool init_structs(void )
        return True;
 }
 
+static void smbd_parent_sig_term_handler(struct tevent_context *ev,
+                                        struct tevent_signal *se,
+                                        int signum,
+                                        int count,
+                                        void *siginfo,
+                                        void *private_data)
+{
+       exit_server_cleanly("termination signal");
+}
+
+static void smbd_parent_sig_hup_handler(struct tevent_context *ev,
+                                       struct tevent_signal *se,
+                                       int signum,
+                                       int count,
+                                       void *siginfo,
+                                       void *private_data)
+{
+       struct smbd_parent_context *parent =
+               talloc_get_type_abort(private_data,
+               struct smbd_parent_context);
+
+       change_to_root_user();
+       DEBUG(1,("parent: Reloading services after SIGHUP\n"));
+       reload_services(parent->msg_ctx, -1, false);
+
+       printing_subsystem_update(parent->ev_ctx, parent->msg_ctx, true);
+}
+
 /****************************************************************************
  main program.
 ****************************************************************************/
@@ -884,6 +912,7 @@ extern void build_options(bool screen);
        uint64_t unique_id;
        struct tevent_context *ev_ctx;
        struct messaging_context *msg_ctx;
+       struct tevent_signal *se;
 
        /*
         * Do this before any other talloc operation
@@ -1134,9 +1163,22 @@ extern void build_options(bool screen);
        parent->ev_ctx = ev_ctx;
        parent->msg_ctx = msg_ctx;
 
-       smbd_setup_sig_term_handler();
-       smbd_setup_sig_hup_handler(ev_ctx,
-                                  msg_ctx);
+       se = tevent_add_signal(parent->ev_ctx,
+                              parent,
+                              SIGTERM, 0,
+                              smbd_parent_sig_term_handler,
+                              parent);
+       if (!se) {
+               exit_server("failed to setup SIGTERM handler");
+       }
+       se = tevent_add_signal(parent->ev_ctx,
+                              parent,
+                              SIGHUP, 0,
+                              smbd_parent_sig_hup_handler,
+                              parent);
+       if (!se) {
+               exit_server("failed to setup SIGHUP handler");
+       }
 
        /* Setup all the TDB's - including CLEAR_IF_FIRST tdb's. */