mirror of
https://github.com/samba-team/samba.git
synced 2024-12-22 13:34:15 +03:00
Fix bug #9166 - Starting smbd or nmbd with stdin from /dev/null results in "EOF on stdin"
Only install the stdin handler if it's a pipe or fifo. Signed-off-by: Jeremy Allison <jra@samba.org> Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
parent
fc13489c91
commit
d4091c5809
@ -130,8 +130,20 @@ static bool nmbd_setup_stdin_handler(struct messaging_context *msg, bool foregro
|
||||
/* if we are running in the foreground then look for
|
||||
EOF on stdin, and exit if it happens. This allows
|
||||
us to die if the parent process dies
|
||||
Only do this on a pipe or socket, no other device.
|
||||
*/
|
||||
tevent_add_fd(nmbd_event_context(), nmbd_event_context(), 0, TEVENT_FD_READ, nmbd_stdin_handler, msg);
|
||||
struct stat st;
|
||||
if (fstat(0, &st) != 0) {
|
||||
return false;
|
||||
}
|
||||
if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
|
||||
tevent_add_fd(nmbd_event_context(),
|
||||
nmbd_event_context(),
|
||||
0,
|
||||
TEVENT_FD_READ,
|
||||
nmbd_stdin_handler,
|
||||
msg);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1558,8 +1558,20 @@ extern void build_options(bool screen);
|
||||
/* if we are running in the foreground then look for
|
||||
EOF on stdin, and exit if it happens. This allows
|
||||
us to die if the parent process dies
|
||||
Only do this on a pipe or socket, no other device.
|
||||
*/
|
||||
tevent_add_fd(ev_ctx, parent, 0, TEVENT_FD_READ, smbd_stdin_handler, NULL);
|
||||
struct stat st;
|
||||
if (fstat(0, &st) != 0) {
|
||||
return false;
|
||||
}
|
||||
if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
|
||||
tevent_add_fd(ev_ctx,
|
||||
parent,
|
||||
0,
|
||||
TEVENT_FD_READ,
|
||||
smbd_stdin_handler,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
smbd_parent_loop(ev_ctx, parent);
|
||||
|
@ -308,6 +308,8 @@ bool winbindd_setup_stdin_handler(bool parent, bool foreground)
|
||||
bool *is_parent;
|
||||
|
||||
if (foreground) {
|
||||
struct stat st;
|
||||
|
||||
is_parent = talloc(winbind_event_context(), bool);
|
||||
if (!is_parent) {
|
||||
return false;
|
||||
@ -318,8 +320,19 @@ bool winbindd_setup_stdin_handler(bool parent, bool foreground)
|
||||
/* if we are running in the foreground then look for
|
||||
EOF on stdin, and exit if it happens. This allows
|
||||
us to die if the parent process dies
|
||||
Only do this on a pipe or socket, no other device.
|
||||
*/
|
||||
tevent_add_fd(winbind_event_context(), is_parent, 0, TEVENT_FD_READ, winbindd_stdin_handler, is_parent);
|
||||
if (fstat(0, &st) != 0) {
|
||||
return false;
|
||||
}
|
||||
if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
|
||||
tevent_add_fd(winbind_event_context(),
|
||||
is_parent,
|
||||
0,
|
||||
TEVENT_FD_READ,
|
||||
winbindd_stdin_handler,
|
||||
is_parent);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -301,6 +301,7 @@ static int binary_smbd_main(const char *binary_name, int argc, const char *argv[
|
||||
NTSTATUS status;
|
||||
const char *model = "standard";
|
||||
int max_runtime = 0;
|
||||
struct stat st;
|
||||
enum {
|
||||
OPT_DAEMON = 1000,
|
||||
OPT_INTERACTIVE,
|
||||
@ -439,9 +440,19 @@ static int binary_smbd_main(const char *binary_name, int argc, const char *argv[
|
||||
#ifdef SIGTTIN
|
||||
signal(SIGTTIN, SIG_IGN);
|
||||
#endif
|
||||
tevent_add_fd(event_ctx, event_ctx, 0, stdin_event_flags,
|
||||
server_stdin_handler,
|
||||
discard_const(binary_name));
|
||||
|
||||
if (fstat(0, &st) != 0) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) {
|
||||
tevent_add_fd(event_ctx,
|
||||
event_ctx,
|
||||
0,
|
||||
stdin_event_flags,
|
||||
server_stdin_handler,
|
||||
discard_const(binary_name));
|
||||
}
|
||||
|
||||
if (max_runtime) {
|
||||
DEBUG(0,("Called with maxruntime %d - current ts %llu\n",
|
||||
|
Loading…
Reference in New Issue
Block a user