Changeset 7503
- Timestamp:
- Dec 25, 2008, 10:06:48 PM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/daemon/daemon.c
r7411 r7503 16 16 #include <stdlib.h> /* exit, atoi */ 17 17 #include <string.h> /* strcmp */ 18 19 #include <sys/types.h> /* umask*/ 20 #include <sys/stat.h> /* umask*/ 18 21 19 22 #include <fcntl.h> /* open */ … … 79 82 } 80 83 81 #if !defined( WIN32 )82 #if !defined( HAVE_DAEMON )83 84 static int 84 daemon( int nochdir, 85 int noclose ) 86 { 87 switch( fork( ) ) 88 { 89 case 0: 90 break; 91 92 case - 1: 93 tr_nerr( MY_NAME, "Error daemonizing (fork)! %d - %s", errno, 94 strerror( 95 errno ) ); 85 tr_daemon( int nochdir, int noclose ) 86 { 87 #if defined(HAVE_DAEMON) && !defined(WIN32) 88 return daemon( nochdir, noclose ); 89 #else 90 pid_t pid = fork( ); 91 if( pid < 0 ) 92 return -1; 93 else if( pid > 0 ) 94 _exit( 0 ); 95 else { 96 pid = setsid( ); 97 if( pid < 0 ) 96 98 return -1; 97 99 98 default: 100 pid = fork( ); 101 if( pid < 0 ) 102 return -1; 103 else if( pid > 0 ) 99 104 _exit( 0 ); 100 } 101 102 if( setsid( ) < 0 ) 103 { 104 tr_nerr( MY_NAME, "Error daemonizing (setsid)! %d - %s", errno, 105 strerror( 106 errno ) ); 107 return -1; 108 } 109 110 switch( fork( ) ) 111 { 112 case 0: 113 break; 114 115 case - 1: 116 tr_nerr( MY_NAME, "Error daemonizing (fork2)! %d - %s", errno, 117 strerror( 118 errno ) ); 119 return -1; 120 121 default: 122 _exit( 0 ); 123 } 124 125 if( !nochdir && 0 > chdir( "/" ) ) 126 { 127 tr_nerr( MY_NAME, "Error daemonizing (chdir)! %d - %s", errno, 128 strerror( 129 errno ) ); 130 return -1; 131 } 132 133 if( !noclose ) 134 { 135 int fd; 136 if( ( ( fd = open( "/dev/null", O_RDONLY ) ) ) != 0 ) 137 { 138 dup2( fd, 0 ); 139 close( fd ); 105 else { 106 107 if( !nochdir ) 108 if( chdir( "/" ) < 0 ) 109 return -1; 110 111 umask( (mode_t)0 ); 112 113 if( !noclose ) { 114 /* send stdin, stdout, and stderr to /dev/null */ 115 int i; 116 int fd = open( "/dev/null", O_RDWR, 0 ); 117 for( i=0; i<3; ++i ) { 118 if( close( i ) ) 119 return -1; 120 dup2( fd, i ); 121 } 122 close( fd ); 123 } 124 125 return 0; 140 126 } 141 if( ( ( fd = open( "/dev/null", O_WRONLY ) ) ) != 1 ) 142 { 143 dup2( fd, 1 ); 144 close( fd ); 145 } 146 if( ( ( fd = open( "/dev/null", O_WRONLY ) ) ) != 2 ) 147 { 148 dup2( fd, 2 ); 149 close( fd ); 150 } 151 } 152 153 return 0; 154 } 127 } 155 128 #endif 156 #endif 129 } 157 130 158 131 static const char* … … 248 221 if( !foreground ) 249 222 { 250 if( 0 > daemon( 1, 0) )223 if( 0 > tr_daemon( TRUE, FALSE ) ) 251 224 { 252 225 fprintf( stderr, "failed to daemonize: %s\n", strerror( errno ) );
Note: See TracChangeset
for help on using the changeset viewer.