Changeset 7503


Ignore:
Timestamp:
Dec 25, 2008, 10:06:48 PM (12 years ago)
Author:
charles
Message:

(trunk daemon) #1619: fix noclose error in our fallback implementation of daemon()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/daemon.c

    r7411 r7503  
    1616#include <stdlib.h> /* exit, atoi */
    1717#include <string.h> /* strcmp */
     18
     19#include <sys/types.h> /* umask*/
     20#include <sys/stat.h> /* umask*/
    1821
    1922#include <fcntl.h> /* open */
     
    7982}
    8083
    81 #if !defined( WIN32 )
    82 #if !defined( HAVE_DAEMON )
    8384static 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 ) );
     85tr_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 )
    9698            return -1;
    9799
    98         default:
     100        pid = fork( );
     101        if( pid < 0 )
     102            return -1;
     103        else if( pid > 0 )
    99104            _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;
    140126        }
    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    }
    155128#endif
    156 #endif
     129}
    157130
    158131static const char*
     
    248221    if( !foreground )
    249222    {
    250         if( 0 > daemon( 1, 0 ) )
     223        if( 0 > tr_daemon( TRUE, FALSE ) )
    251224        {
    252225            fprintf( stderr, "failed to daemonize: %s\n", strerror( errno ) );
Note: See TracChangeset for help on using the changeset viewer.