Quellcode durchsuchen

bugfix: stop trying to write to a stderr that may not be there
also, tell start_daemon our desired cwd


svn:r1170

Roger Dingledine vor 21 Jahren
Ursprung
Commit
5cf0b6224b
3 geänderte Dateien mit 13 neuen und 11 gelöschten Zeilen
  1. 1 1
      src/common/tortls.c
  2. 11 9
      src/common/util.c
  3. 1 1
      src/common/util.h

+ 1 - 1
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;

+ 11 - 9
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 */

+ 1 - 1
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