dns: Use new DNS debugclass in DNS server
[kai/samba.git] / source4 / smbd / process_standard.c
index dfa4fa6b1c7a4b742bc99c27e0f2b934b3d157b5..c5377b34e08516a7d2209b40ec5f2648d269cfae 100644 (file)
 #include "system/filesys.h"
 #include "cluster/cluster.h"
 #include "param/param.h"
-#include "lib/ldb_wrap.h"
-
-#ifdef HAVE_SETPROCTITLE
-#ifdef HAVE_SETPROCTITLE_H
-#include <setproctitle.h>
-#endif
-#else
-#define setproctitle none_setproctitle
-static int none_setproctitle(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);
-static int none_setproctitle(const char *fmt, ...)
-{
-       return 0;
-}
-#endif
+#include "ldb_wrap.h"
+
+NTSTATUS process_model_standard_init(void);
 
 /* we hold a pipe open in the parent, and the any child
    processes wait for EOF on that pipe. This ensures that
@@ -50,7 +39,7 @@ static int child_pipe[2];
 /*
   called when the process model is selected
 */
-static void standard_model_init(struct tevent_context *ev)
+static void standard_model_init(void)
 {
        pipe(child_pipe);
        signal(SIGCHLD, SIG_IGN);
@@ -80,7 +69,6 @@ static void standard_accept_connection(struct tevent_context *ev,
        NTSTATUS status;
        struct socket_context *sock2;
        pid_t pid;
-       struct tevent_context *ev2;
        struct socket_address *c, *s;
 
        /* accept an incoming connection. */
@@ -106,21 +94,14 @@ static void standard_accept_connection(struct tevent_context *ev,
        pid = getpid();
 
        /* This is now the child code. We need a completely new event_context to work with */
-       ev2 = s4_event_context_init(NULL);
-
-       /* setup this as the default context */
-       s4_event_context_set_default(ev2);
 
-       /* the service has given us a private pointer that
-          encapsulates the context it needs for this new connection -
-          everything else will be freed */
-       talloc_steal(ev2, private_data);
-       talloc_steal(private_data, sock2);
+       if (tevent_re_initialise(ev) != 0) {
+               smb_panic("Failed to re-initialise tevent after fork");
+       }
 
        /* this will free all the listening sockets and all state that
           is not associated with this new connection */
        talloc_free(sock);
-       talloc_free(ev);
 
        /* we don't care if the dup fails, as its only a select()
           speed optimisation */
@@ -129,7 +110,7 @@ static void standard_accept_connection(struct tevent_context *ev,
        /* tdb needs special fork handling */
        ldb_wrap_fork_hook();
 
-       tevent_add_fd(ev2, ev2, child_pipe[0], TEVENT_FD_READ,
+       tevent_add_fd(ev, ev, child_pipe[0], TEVENT_FD_READ,
                      standard_pipe_handler, NULL);
        close(child_pipe[1]);
 
@@ -137,24 +118,24 @@ static void standard_accept_connection(struct tevent_context *ev,
        set_need_random_reseed();
 
        /* setup the process title */
-       c = socket_get_peer_addr(sock2, ev2);
-       s = socket_get_my_addr(sock2, ev2);
+       c = socket_get_peer_addr(sock2, ev);
+       s = socket_get_my_addr(sock2, ev);
        if (s && c) {
                setproctitle("conn c[%s:%u] s[%s:%u] server_id[%d]",
-                            c->addr, c->port, s->addr, s->port, pid);
+                            c->addr, c->port, s->addr, s->port, (int)pid);
        }
        talloc_free(c);
        talloc_free(s);
 
-       /* setup this new connection.  Cluster ID is PID based for this process modal */
-       new_conn(ev2, lp_ctx, sock2, cluster_id(pid, 0), private_data);
+       /* setup this new connection.  Cluster ID is PID based for this process model */
+       new_conn(ev, lp_ctx, sock2, cluster_id(pid, 0), private_data);
 
        /* we can't return to the top level here, as that event context is gone,
           so we now process events in the new event context until there are no
           more to process */      
-       event_loop_wait(ev2);
+       tevent_loop_wait(ev);
 
-       talloc_free(ev2);
+       talloc_free(ev);
        exit(0);
 }
 
@@ -164,11 +145,10 @@ static void standard_accept_connection(struct tevent_context *ev,
 static void standard_new_task(struct tevent_context *ev, 
                              struct loadparm_context *lp_ctx,
                              const char *service_name,
-                             void (*new_task)(struct tevent_context *, struct loadparm_context *lp_ctx, struct server_id , void *), 
+                             void (*new_task)(struct tevent_context *, struct loadparm_context *lp_ctx, struct server_id , void *),
                              void *private_data)
 {
        pid_t pid;
-       struct tevent_context *ev2;
 
        pid = fork();
 
@@ -179,48 +159,39 @@ static void standard_new_task(struct tevent_context *ev,
 
        pid = getpid();
 
-       /* This is now the child code. We need a completely new event_context to work with */
-       ev2 = s4_event_context_init(NULL);
-
-       /* setup this as the default context */
-       s4_event_context_set_default(ev2);
-
-       /* the service has given us a private pointer that
-          encapsulates the context it needs for this new connection -
-          everything else will be freed */
-       talloc_steal(ev2, private_data);
-
        /* this will free all the listening sockets and all state that
           is not associated with this new connection */
-       talloc_free(ev);
+       if (tevent_re_initialise(ev) != 0) {
+               smb_panic("Failed to re-initialise tevent after fork");
+       }
 
        /* ldb/tdb need special fork handling */
        ldb_wrap_fork_hook();
 
-       tevent_add_fd(ev2, ev2, child_pipe[0], TEVENT_FD_READ,
+       tevent_add_fd(ev, ev, child_pipe[0], TEVENT_FD_READ,
                      standard_pipe_handler, NULL);
        close(child_pipe[1]);
 
        /* Ensure that the forked children do not expose identical random streams */
        set_need_random_reseed();
 
-       setproctitle("task %s server_id[%d]", service_name, pid);
+       setproctitle("task %s server_id[%d]", service_name, (int)pid);
 
-       /* setup this new task.  Cluster ID is PID based for this process modal */
-       new_task(ev2, lp_ctx, cluster_id(pid, 0), private_data);
+       /* setup this new task.  Cluster ID is PID based for this process model */
+       new_task(ev, lp_ctx, cluster_id(pid, 0), private_data);
 
        /* we can't return to the top level here, as that event context is gone,
           so we now process events in the new event context until there are no
           more to process */      
-       event_loop_wait(ev2);
+       tevent_loop_wait(ev);
 
-       talloc_free(ev2);
+       talloc_free(ev);
        exit(0);
 }
 
 
 /* called when a task goes down */
-_NORETURN_ static void standard_terminate(struct tevent_context *ev, struct loadparm_context *lp_ctx, 
+_NORETURN_ static void standard_terminate(struct tevent_context *ev, struct loadparm_context *lp_ctx,
                                          const char *reason) 
 {
        DEBUG(2,("standard_terminate: reason[%s]\n",reason));