s3: In winbind, close parent/child sockets
authorVolker Lendecke <vl@samba.org>
Thu, 28 Apr 2011 11:26:57 +0000 (13:26 +0200)
committerVolker Lendecke <vl@samba.org>
Fri, 29 Apr 2011 14:57:36 +0000 (16:57 +0200)
This should further reduce fd load in winbind children

source3/winbindd/winbindd.c
source3/winbindd/winbindd_cm.c
source3/winbindd/winbindd_dual.c
source3/winbindd/winbindd_proto.h

index 033c436c88b6b48a8f25ecaff875697bf9fa8bdb..232f9b4c60f928ee35bd8262c01c2cef7c476f88 100644 (file)
@@ -404,7 +404,7 @@ static void winbind_msg_validate_cache(struct messaging_context *msg_ctx,
 
        /* child */
 
-       if (!winbindd_reinit_after_fork(NULL)) {
+       if (!winbindd_reinit_after_fork(NULL, NULL)) {
                _exit(0);
        }
 
index 06d954fe9522aa249685f798a6bc68d0afba441d..f065d839950ed2c6a8ca4065b0fc02c32c37570e 100644 (file)
@@ -233,7 +233,7 @@ static bool fork_child_dc_connect(struct winbindd_domain *domain)
                }
        }
 
-       if (!winbindd_reinit_after_fork(lfile)) {
+       if (!winbindd_reinit_after_fork(NULL, lfile)) {
                messaging_send_buf(winbind_messaging_context(),
                                   pid_to_procid(parent_pid),
                                   MSG_WINBIND_FAILED_TO_GO_ONLINE,
index 04ef3d80515e60664d9c6767c77dbbe182a8ee94..47ab6c17b707991f5e43236ba9c9f3e2c3338470 100644 (file)
@@ -1167,7 +1167,8 @@ static void child_msg_dump_event_list(struct messaging_context *msg,
        dump_event_list(winbind_event_context());
 }
 
-bool winbindd_reinit_after_fork(const char *logfilename)
+bool winbindd_reinit_after_fork(const struct winbindd_child *myself,
+                               const char *logfilename)
 {
        struct winbindd_domain *domain;
        struct winbindd_child *cl;
@@ -1242,6 +1243,14 @@ bool winbindd_reinit_after_fork(const char *logfilename)
                 * go through the parent.
                 */
                cl->pid = (pid_t)0;
+
+               /*
+                * Close service sockets to all other children
+                */
+               if ((cl != myself) && (cl->sock != -1)) {
+                       close(cl->sock);
+                       cl->sock = -1;
+               }
         }
        /*
         * This is a little tricky, children must not
@@ -1325,7 +1334,7 @@ static bool fork_domain_child(struct winbindd_child *child)
        state.sock = fdpair[0];
        close(fdpair[1]);
 
-       if (!winbindd_reinit_after_fork(child->logfilename)) {
+       if (!winbindd_reinit_after_fork(child, child->logfilename)) {
                _exit(0);
        }
 
index 5b48a99a8fbcbb812bb25ace8c6b57366a20e229..725bf6f8a7004efe134b8d5f29d4faec6a48944f 100644 (file)
@@ -291,7 +291,8 @@ void winbind_msg_ip_dropped_parent(struct messaging_context *msg_ctx,
                                   uint32_t msg_type,
                                   struct server_id server_id,
                                   DATA_BLOB *data);
-bool winbindd_reinit_after_fork(const char *logfilename);
+bool winbindd_reinit_after_fork(const struct winbindd_child *myself,
+                               const char *logfilename);
 struct winbindd_domain *wb_child_domain(void);
 
 /* The following definitions come from winbindd/winbindd_group.c  */