Changeset 11972


Ignore:
Timestamp:
Feb 18, 2011, 5:05:17 PM (11 years ago)
Author:
jordan
Message:

(trunk daemon) simplify the code in the fallback implementation of daemon() for systems that don't have this function themselves.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/daemon.c

    r11709 r11972  
    174174{
    175175#if defined(USE_OS_DAEMON)
     176
    176177    return daemon( nochdir, noclose );
     178
    177179#elif defined(USE_TR_DAEMON)
    178     pid_t pid = fork( );
    179     if( pid < 0 )
     180
     181    /* this is loosely based off of glibc's daemon() implementation
     182     * http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=misc/daemon.c */
     183
     184    switch( fork( ) ) {
     185        case -1: return -1;
     186        case 0: break;
     187        default: _exit(0);
     188    }
     189
     190    if( setsid( ) == -1 )
    180191        return -1;
    181     else if( pid > 0 )
    182         _exit( 0 );
    183     else {
    184         pid = setsid( );
    185         if( pid < 0 )
    186             return -1;
    187 
    188         pid = fork( );
    189         if( pid < 0 )
    190             return -1;
    191         else if( pid > 0 )
    192             _exit( 0 );
    193         else {
    194 
    195             if( !nochdir )
    196                 if( chdir( "/" ) < 0 )
    197                     return -1;
    198 
    199             umask( (mode_t)0 );
    200 
    201             if( !noclose ) {
    202                 /* send stdin, stdout, and stderr to /dev/null */
    203                 int i;
    204                 int fd = open( "/dev/null", O_RDWR, 0 );
    205                 if( fd < 0 )
    206                     fprintf( stderr, "unable to open /dev/null: %s\n", tr_strerror(errno) );
    207                 for( i=0; i<3; ++i ) {
    208                     if( close( i ) )
    209                         return -1;
    210                     dup2( fd, i );
    211                 }
    212                 close( fd );
    213             }
    214 
    215             return 0;
    216         }
    217     }
     192
     193    if( !nochdir )
     194        chdir( "/" );
     195
     196    if( !noclose ) {
     197        int fd = open( "/dev/null", O_RDWR, 0 );
     198        dup2( fd, STDIN_FILENO );
     199        dup2( fd, STDOUT_FILENO );
     200        dup2( fd, STDERR_FILENO );
     201        close( fd );
     202    }
     203
     204    return 0;
     205
    218206#else /* USE_NO_DAEMON */
    219207    return 0;
Note: See TracChangeset for help on using the changeset viewer.