bugfix: stop trying to write to a stderr that may not be there

also, tell start_daemon our desired cwd


svn:r1170
This commit is contained in:
Roger Dingledine 2004-02-28 23:21:29 +00:00
parent 5701cc2359
commit 5cf0b6224b
3 changed files with 13 additions and 11 deletions

View File

@ -370,7 +370,7 @@ tor_tls_write(tor_tls *tls, char *cp, int n)
return r; return r;
} }
if (err == TOR_TLS_WANTWRITE || err == TOR_TLS_WANTREAD) { if (err == TOR_TLS_WANTWRITE || err == TOR_TLS_WANTREAD) {
log_fn(LOG_INFO,"wantwrite or wantread. remembering the number %d.",n); // log_fn(LOG_INFO,"wantwrite or wantread. remembering the number %d.",n);
tls->wantwrite_n = n; tls->wantwrite_n = n;
} }
return err; return err;

View File

@ -701,7 +701,7 @@ get_uname(void)
static int start_daemon_called = 0; static int start_daemon_called = 0;
static int finish_daemon_called = 0; static int finish_daemon_called = 0;
static int daemon_filedes[2]; static int daemon_filedes[2];
void start_daemon(void) void start_daemon(char *desired_cwd)
{ {
pid_t pid; pid_t pid;
@ -709,16 +709,18 @@ void start_daemon(void)
return; return;
start_daemon_called = 1; start_daemon_called = 1;
if(!desired_cwd)
desired_cwd = "/";
/* Don't hold the wrong FS mounted */ /* Don't hold the wrong FS mounted */
if (chdir("/") < 0) { if (chdir(desired_cwd) < 0) {
perror("chdir"); log_fn(LOG_ERR,"chdir to %s failed. Exiting.",desired_cwd);
exit(1); exit(1);
} }
pipe(daemon_filedes); pipe(daemon_filedes);
pid = fork(); pid = fork();
if (pid < 0) { if (pid < 0) {
perror("fork"); log_fn(LOG_ERR,"fork failed. Exiting.");
exit(1); exit(1);
} }
if (pid) { /* Parent */ if (pid) { /* Parent */
@ -745,7 +747,7 @@ void start_daemon(void)
* This means that we, as a non-session group leader, can never regain a * This means that we, as a non-session group leader, can never regain a
* controlling terminal. This part is recommended by Stevens's * controlling terminal. This part is recommended by Stevens's
* _Advanced Programming in the Unix Environment_. * _Advanced Programming in the Unix Environment_.
*/ */
if (fork() != 0) { if (fork() != 0) {
exit(0); exit(0);
} }
@ -760,13 +762,13 @@ void finish_daemon(void)
if (finish_daemon_called) if (finish_daemon_called)
return; return;
if (!start_daemon_called) if (!start_daemon_called)
start_daemon(); start_daemon(NULL);
finish_daemon_called = 1; finish_daemon_called = 1;
nullfd = open("/dev/null", nullfd = open("/dev/null",
O_CREAT | O_RDWR | O_APPEND); O_CREAT | O_RDWR | O_APPEND);
if (nullfd < 0) { if (nullfd < 0) {
perror("/dev/null"); log_fn(LOG_ERR,"/dev/null can't be opened. Exiting.");
exit(1); exit(1);
} }
/* close fds linking to invoking terminal, but /* close fds linking to invoking terminal, but
@ -776,7 +778,7 @@ void finish_daemon(void)
if (dup2(nullfd,0) < 0 || if (dup2(nullfd,0) < 0 ||
dup2(nullfd,1) < 0 || dup2(nullfd,1) < 0 ||
dup2(nullfd,2) < 0) { dup2(nullfd,2) < 0) {
perror("dup2"); /* Should never happen... */ log_fn(LOG_ERR,"dup2 failed. Exiting.");
exit(1); exit(1);
} }
write(daemon_filedes[1], &c, sizeof(char)); /* signal success */ write(daemon_filedes[1], &c, sizeof(char)); /* signal success */

View File

@ -91,7 +91,7 @@ const char *get_uname(void);
* until finish_daemon is called. (Note: it's safe to call this more * until finish_daemon is called. (Note: it's safe to call this more
* than once: calls after the first are ignored.) * than once: calls after the first are ignored.)
*/ */
void start_daemon(void); void start_daemon(char *desired_cwd);
/* Finish putting the process into daemon mode: drop standard fds, and tell /* Finish putting the process into daemon mode: drop standard fds, and tell
* the parent process to exit. (Note: it's safe to call this more than once: * the parent process to exit. (Note: it's safe to call this more than once:
* calls after the first are ignored. Calls start_daemon first if it hasn't * calls after the first are ignored. Calls start_daemon first if it hasn't