- close stdout and stderr and reopen then as /dev/null when running as
authorAndrew Tridgell <tridge@samba.org>
Sun, 19 Jul 1998 04:50:48 +0000 (04:50 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 19 Jul 1998 04:50:48 +0000 (04:50 +0000)
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
options.c
socket.c

diff --git a/main.c b/main.c
index 2d1b35e..2cd5912 100644 (file)
--- 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;
index bd0e523..3244f3f 100644 (file)
--- 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;
 }
 
 
index 98093fc..f8d4659 100644 (file)
--- 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);
+       }
 }
 
 /*******************************************************************