diff options
author | Michael Adam <obnox@samba.org> | 2012-03-15 16:29:27 +0100 |
---|---|---|
committer | Michael Adam <obnox@samba.org> | 2012-03-15 18:41:37 +0100 |
commit | c80f70390c3763d5d7248979db9542cd05b7cb44 (patch) | |
tree | a0f96da41205705839cec1dead1fc1762051a2e5 /source3/smbd | |
parent | e5ebe67e3837cf4da0ae2c3d00c72a244b8f202f (diff) | |
download | samba-c80f70390c3763d5d7248979db9542cd05b7cb44.tar.gz samba-c80f70390c3763d5d7248979db9542cd05b7cb44.tar.bz2 samba-c80f70390c3763d5d7248979db9542cd05b7cb44.zip |
s3:smbd: let smbd/nmbd/winbindd child processes terminate if the parent process died.
This applies to all child processes making use of reinit_after_fork().
It is implemented by establishing a pipe between parent and child.
The child watches for EOF on the read end of the pipe, indidcating
an exited parent.
Pair-Programmed-With: Stefan Metzmacher <metze@samba.org>
Diffstat (limited to 'source3/smbd')
-rw-r--r-- | source3/smbd/server.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/source3/smbd/server.c b/source3/smbd/server.c index aa3da1f743..851b4608a7 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -57,6 +57,8 @@ struct smbd_parent_context { /* the list of current child processes */ struct smbd_child_pid *children; size_t num_children; + /* pipe for detecting death of parent process in child: */ + int child_pipe[2]; struct timed_event *cleanup_te; }; @@ -1231,6 +1233,17 @@ extern void build_options(bool screen); exit(1); } + /* + * Do not initialize the parent-child-pipe before becoming + * a daemon: this is used to detect a died parent in the child + * process. + */ + status = init_before_fork(); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0, ("init_before_fork failed: %s\n", nt_errstr(status))); + exit(1); + } + smbd_server_conn->msg_ctx = msg_ctx; parent = talloc_zero(ev_ctx, struct smbd_parent_context); |