mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-05-06 14:05:51 -04:00
- 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:
4
main.c
4
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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
11
socket.c
11
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);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
|
||||
Reference in New Issue
Block a user