author | Michael Krelin <hacker@klever.net> | 2007-07-16 00:02:29 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2007-07-16 00:02:29 (UTC) |
commit | 0f2f877bd115c0f50af3dabae03473515e7ff808 (patch) (side-by-side diff) | |
tree | 37d0fb83d81147a3e31fb56ff7f0d9893265f34e | |
parent | 174edcd91bcb969c4ee71a824849d8737223dd8f (diff) | |
download | opie-0f2f877bd115c0f50af3dabae03473515e7ff808.zip opie-0f2f877bd115c0f50af3dabae03473515e7ff808.tar.gz opie-0f2f877bd115c0f50af3dabae03473515e7ff808.tar.bz2 |
pass erno 'upstream'
-rw-r--r-- | core/obex/obexserver.cpp | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/core/obex/obexserver.cpp b/core/obex/obexserver.cpp index 286961f..a98c64f 100644 --- a/core/obex/obexserver.cpp +++ b/core/obex/obexserver.cpp @@ -381,129 +381,129 @@ bool ObexServer::start(RunMode runmode, Communication comm) #ifdef HAVE_INITGROUPS struct passwd *pw = getpwuid( uid ); #endif int fd[ 2 ]; if ( 0 > pipe( fd ) ) { fd[ 0 ] = fd[ 1 ] = 0; // Pipe failed.. continue } runs = true; QApplication::flushX(); // WABA: Note that we use fork() and not vfork() because // vfork() has unclear semantics and is not standardized. pid_ = fork(); if ( 0 == pid_ ) { if ( fd[ 0 ] ) close( fd[ 0 ] ); if ( !runPrivileged() ) { setgid( gid ); #if defined( HAVE_INITGROUPS) if ( pw ) initgroups( pw->pw_name, pw->pw_gid ); #endif setuid( uid ); } // The child process if ( !commSetupDoneC() ) qWarning( "Could not finish comm setup in child!" ); setupEnvironment(); // Matthias if ( run_mode == DontCare ) setpgid( 0, 0 ); // restore default SIGPIPE handler (Harri) struct sigaction act; sigemptyset( &( act.sa_mask ) ); sigaddset( &( act.sa_mask ), SIGPIPE ); act.sa_handler = SIG_DFL; act.sa_flags = 0; sigaction( SIGPIPE, &act, 0L ); // We set the close on exec flag. // Closing of fd[1] indicates that the execvp succeeded! if ( fd[ 1 ] ) fcntl( fd[ 1 ], F_SETFD, FD_CLOEXEC ); if (initObex() == 0) { if ( fd[ 1 ] ) { ::close(fd[1]); fd[1] = 0; } do { if (OBEX_HandleInput(m_obex, 60) < 0) { fprintf(stderr,"failed to OBEX_HandleInput(), errno=%d\n"); - _exit(1); + _exit(errno?errno:-1); } } while(1); } char resultByte = 1; if ( fd[ 1 ] ) write( fd[ 1 ], &resultByte, 1 ); _exit( -1 ); } else if ( -1 == pid_ ) { // forking failed runs = false; return false; } else { if ( fd[ 1 ] ) close( fd[ 1 ] ); // the parent continues here // Discard any data for stdin that might still be there input_data = 0; // Check whether client could be started. if ( fd[ 0 ] ) for ( ;; ) { char resultByte; int n = ::read( fd[ 0 ], &resultByte, 1 ); if ( n == 1 ) { // Error runs = false; close( fd[ 0 ] ); pid_ = 0; return false; } if ( n == -1 ) { if ( ( errno == ECHILD ) || ( errno == EINTR ) ) continue; // Ignore } break; // success } if ( fd[ 0 ] ) close( fd[ 0 ] ); if ( !commSetupDoneP() ) // finish communication socket setup for the parent qWarning( "Could not finish comm setup in parent!" ); if ( run_mode == Block ) { commClose(); // The SIGCHLD handler of the process controller will catch // the exit and set the status while ( runs ) { OProcessController::theOProcessController-> slotDoHousekeeping( 0 ); } runs = FALSE; emit processExited( this ); |