From b11ed3b1504d526a4b571bc3d80f4e5f1628dc75 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 19 Jul 1998 04:50:48 +0000 Subject: [PATCH] - close stdout and stderr and reopen then as /dev/null when running as a daemon. This prevents library functions (such as getopt) stuffing up our protocol stream when errors are detected. - defer the error message from the options parsing until after the socket is multiplexed. This allows clients sending new options which the remote server doesn't understand to get a sensible error message. --- main.c | 4 +++- options.c | 9 +++++---- socket.c | 11 ++++++++--- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/main.c b/main.c index 2d1b35ed..2cd5912b 100644 --- a/main.c +++ b/main.c @@ -566,7 +566,9 @@ int main(int argc,char *argv[]) carried across */ orig_umask = (int)umask(0); - parse_arguments(argc, argv); + if (!parse_arguments(argc, argv)) { + exit_cleanup(1); + } argc -= optind; argv += optind; diff --git a/options.c b/options.c index bd0e5232..3244f3f0 100644 --- a/options.c +++ b/options.c @@ -197,7 +197,8 @@ static struct option long_options[] = { {"port", 1, 0, OPT_PORT}, {0,0,0,0}}; -void parse_arguments(int argc, char *argv[]) + +int parse_arguments(int argc, char *argv[]) { int opt; int option_index; @@ -301,7 +302,7 @@ void parse_arguments(int argc, char *argv[]) preserve_hard_links=1; #else rprintf(FERROR,"ERROR: hard links not supported on this platform\n"); - exit_cleanup(1); + return 0; #endif break; @@ -412,10 +413,10 @@ void parse_arguments(int argc, char *argv[]) break; default: - /* rprintf(FERROR,"bad option -%c\n",opt); */ - exit_cleanup(1); + return 0; } } + return 1; } diff --git a/socket.c b/socket.c index 98093fcf..f8d46590 100644 --- a/socket.c +++ b/socket.c @@ -281,6 +281,8 @@ become a daemon, discarding the controlling terminal ****************************************************************************/ void become_daemon(void) { + int i; + if (fork()) _exit(0); @@ -299,9 +301,12 @@ void become_daemon(void) } #endif /* TIOCNOTTY */ #endif - close(0); - close(1); - close(2); + /* make sure that stdin, stdout an stderr don't stuff things + up (library functions, for example) */ + for (i=0;i<3;i++) { + close(i); + open("/dev/null", O_RDWR); + } } /******************************************************************* -- 2.34.1