X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-shell%2Ffork.c;h=d47e1518a7f73a49a4c1aaa02805c51dff26616e;hb=331e6275418bda0735d4952f64d51518881d10a8;hp=1f08097b1a41aaed8604eb7849782d61c0a5dfad;hpb=df8f7cbb9b79be3be9205d116d1dd0b263d6861a;p=openldap diff --git a/servers/slapd/back-shell/fork.c b/servers/slapd/back-shell/fork.c index 1f08097b1a..d47e1518a7 100644 --- a/servers/slapd/back-shell/fork.c +++ b/servers/slapd/back-shell/fork.c @@ -1,9 +1,15 @@ /* fork.c - fork and exec a process, connecting stdin/out w/pipes */ +/* $OpenLDAP$ */ +/* + * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. + * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + */ #include "portable.h" #include +#include #include #include #include @@ -18,11 +24,13 @@ forkandexec( FILE **wfp ) { - int p2c[2], c2p[2]; + int p2c[2] = { -1, -1 }, c2p[2]; pid_t pid; if ( pipe( p2c ) != 0 || pipe( c2p ) != 0 ) { Debug( LDAP_DEBUG_ANY, "pipe failed\n", 0, 0, 0 ); + close( p2c[0] ); + close( p2c[1] ); return( -1 ); } @@ -32,27 +40,32 @@ forkandexec( * parent *rfp <- c2p[0] | c2p[1] <- stdout child */ -#ifdef HAVE_THR - switch ( (pid = fork1()) ) -#else - switch ( (pid = fork()) ) -#endif - { - case 0: /* child */ + fflush( NULL ); +# ifdef HAVE_THR + pid = fork1(); +# else + pid = fork(); +# endif + if ( pid == 0 ) { /* child */ /* * child could deadlock here due to resources locked * by our parent * - * If so, configure --without-threads or implement forking - * via a surrogate parent. + * If so, configure --without-threads. */ - close( p2c[1] ); - close( c2p[0] ); if ( dup2( p2c[0], 0 ) == -1 || dup2( c2p[1], 1 ) == -1 ) { Debug( LDAP_DEBUG_ANY, "dup2 failed\n", 0, 0, 0 ); exit( EXIT_FAILURE ); } - + } + close( p2c[0] ); + close( c2p[1] ); + if ( pid <= 0 ) { + close( p2c[1] ); + close( c2p[0] ); + } + switch ( pid ) { + case 0: execv( args[0], args ); Debug( LDAP_DEBUG_ANY, "execv failed\n", 0, 0, 0 ); @@ -61,13 +74,9 @@ forkandexec( case -1: /* trouble */ Debug( LDAP_DEBUG_ANY, "fork failed\n", 0, 0, 0 ); return( -1 ); - - default: /* parent */ - close( p2c[0] ); - close( c2p[1] ); - break; } + /* parent */ if ( (*rfp = fdopen( c2p[0], "r" )) == NULL || (*wfp = fdopen( p2c[1], "w" )) == NULL ) { Debug( LDAP_DEBUG_ANY, "fdopen failed\n", 0, 0, 0 );