From 5cf0b6224b6b3bcebb342b90f8bf2df819c59c9c Mon Sep 17 00:00:00 2001 From: Roger Dingledine Date: Sat, 28 Feb 2004 23:21:29 +0000 Subject: [PATCH] bugfix: stop trying to write to a stderr that may not be there also, tell start_daemon our desired cwd svn:r1170 --- src/common/tortls.c | 2 +- src/common/util.c | 20 +++++++++++--------- src/common/util.h | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/common/tortls.c b/src/common/tortls.c index 69b0aa64d3..860fb10438 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -370,7 +370,7 @@ tor_tls_write(tor_tls *tls, char *cp, int n) return r; } 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; } return err; diff --git a/src/common/util.c b/src/common/util.c index a39da78edb..6cfe36abfa 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -701,7 +701,7 @@ get_uname(void) static int start_daemon_called = 0; static int finish_daemon_called = 0; static int daemon_filedes[2]; -void start_daemon(void) +void start_daemon(char *desired_cwd) { pid_t pid; @@ -709,16 +709,18 @@ void start_daemon(void) return; start_daemon_called = 1; + if(!desired_cwd) + desired_cwd = "/"; /* Don't hold the wrong FS mounted */ - if (chdir("/") < 0) { - perror("chdir"); + if (chdir(desired_cwd) < 0) { + log_fn(LOG_ERR,"chdir to %s failed. Exiting.",desired_cwd); exit(1); } pipe(daemon_filedes); pid = fork(); if (pid < 0) { - perror("fork"); + log_fn(LOG_ERR,"fork failed. Exiting."); exit(1); } 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 * controlling terminal. This part is recommended by Stevens's * _Advanced Programming in the Unix Environment_. - */ + */ if (fork() != 0) { exit(0); } @@ -760,13 +762,13 @@ void finish_daemon(void) if (finish_daemon_called) return; if (!start_daemon_called) - start_daemon(); + start_daemon(NULL); finish_daemon_called = 1; nullfd = open("/dev/null", - O_CREAT | O_RDWR | O_APPEND); + O_CREAT | O_RDWR | O_APPEND); if (nullfd < 0) { - perror("/dev/null"); + log_fn(LOG_ERR,"/dev/null can't be opened. Exiting."); exit(1); } /* close fds linking to invoking terminal, but @@ -776,7 +778,7 @@ void finish_daemon(void) if (dup2(nullfd,0) < 0 || dup2(nullfd,1) < 0 || dup2(nullfd,2) < 0) { - perror("dup2"); /* Should never happen... */ + log_fn(LOG_ERR,"dup2 failed. Exiting."); exit(1); } write(daemon_filedes[1], &c, sizeof(char)); /* signal success */ diff --git a/src/common/util.h b/src/common/util.h index fd300fa805..850b9015ac 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -91,7 +91,7 @@ const char *get_uname(void); * until finish_daemon is called. (Note: it's safe to call this more * 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 * 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 -- 2.11.4.GIT