- 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.
This commit is contained in:
Andrew Tridgell
1998-07-19 04:50:48 +00:00
parent 42245f1b56
commit b11ed3b150
3 changed files with 16 additions and 8 deletions

4
main.c
View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);
}
}
/*******************************************************************