mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-11 05:33:47 +01:00
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:
parent
5701cc2359
commit
5cf0b6224b
@ -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;
|
||||||
|
@ -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 */
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user