mirror of
https://github.com/transmission/transmission
synced 2025-03-03 10:15:45 +00:00
fix r2417 bug that caused transmission-daemon to not daemonize
This commit is contained in:
parent
9e266f6cbc
commit
44282a7be8
1 changed files with 48 additions and 23 deletions
|
@ -28,6 +28,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
@ -208,32 +209,56 @@ readfile( const char * name, size_t * len )
|
||||||
int
|
int
|
||||||
daemon( int nochdir, int noclose )
|
daemon( int nochdir, int noclose )
|
||||||
{
|
{
|
||||||
pid_t child;
|
switch( fork( ) ) {
|
||||||
int null;
|
case 0:
|
||||||
|
break;
|
||||||
child = fork();
|
case -1:
|
||||||
if( 0 > child )
|
fprintf( stderr, "Error daemonizing (fork)! %d - %s\n", errno, strerror(errno) );
|
||||||
return -1;
|
|
||||||
else if( 0 != child )
|
|
||||||
exit( 0 );
|
|
||||||
|
|
||||||
if( 0 > setsid() )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if( !nochdir && 0 > chdir( "/" ) )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if( !noclose )
|
|
||||||
{
|
|
||||||
null = open( "/dev/null", O_RDWR );
|
|
||||||
if( 0 > null )
|
|
||||||
return -1;
|
return -1;
|
||||||
if( 0 > dup2( null, 0 ) || 0 > dup2( null, 1 ) || 0 > dup2( null, 2 ) )
|
default:
|
||||||
return -1;
|
_exit(0);
|
||||||
close( null );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
if( setsid() < 0 ) {
|
||||||
|
fprintf( stderr, "Error daemonizing (setsid)! %d - %s\n", errno, strerror(errno) );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( fork( ) ) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
fprintf( stderr, "Error daemonizing (fork2)! %d - %s\n", errno, strerror(errno) );
|
||||||
|
return -1;
|
||||||
|
default:
|
||||||
|
_exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !nochdir && 0 > chdir( "/" ) ) {
|
||||||
|
fprintf( stderr, "Error daemonizing (chdir)! %d - %s\n", errno, strerror(errno) );
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !noclose ) {
|
||||||
|
int fd;
|
||||||
|
fd = open("/dev/null", O_RDONLY);
|
||||||
|
if( fd != 0 ) {
|
||||||
|
dup2( fd, 0 );
|
||||||
|
close( fd );
|
||||||
|
}
|
||||||
|
fd = open("/dev/null", O_WRONLY);
|
||||||
|
if( fd != 1 ) {
|
||||||
|
dup2( fd, 1 );
|
||||||
|
close( fd );
|
||||||
|
}
|
||||||
|
fd = open("/dev/null", O_WRONLY);
|
||||||
|
if( fd != 2 ) {
|
||||||
|
dup2( fd, 2 );
|
||||||
|
close( fd );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue