X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8fd0d89b7dc8ed4ed7e460ddc9b61ae4a0e63c3e..b838cfc9151aea38402ad2b1ba5d2f97cf94e973:/src/unix/utilsunx.cpp diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index f7b404b19e..ad8a078fab 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -135,9 +135,39 @@ void wxUsleep(unsigned long milliseconds) // process management // ---------------------------------------------------------------------------- -int wxKill(long pid, wxSignal sig) +int wxKill(long pid, wxSignal sig, wxKillError *rc) { - return kill((pid_t)pid, (int)sig); + int err = kill((pid_t)pid, (int)sig); + if ( rc ) + { + switch ( err ) + { + case 0: + *rc = wxKILL_OK; + break; + + case EINVAL: + *rc = wxKILL_BAD_SIGNAL; + break; + + case EPERM: + *rc = wxKILL_ACCESS_DENIED; + break; + + case ESRCH: + *rc = wxKILL_NO_PROCESS; + break; + + default: + // this goes against Unix98 docs so log it + wxLogDebug(_T("unexpected kill(2) return value %d"), err); + + // something else... + *rc = wxKILL_ERROR; + } + } + + return err; } #define WXEXECUTE_NARGS 127 @@ -303,6 +333,8 @@ void wxHandleProcessTermination(wxEndProcessData *proc_data) // wxStream classes to support IO redirection in wxExecute // ---------------------------------------------------------------------------- +#if wxUSE_STREAMS + class wxProcessFileInputStream : public wxInputStream { public: @@ -399,15 +431,20 @@ size_t wxProcessFileOutputStream::OnSysWrite(const void *buffer, size_t bufsize) return ret; } +#endif // wxUSE_STREAMS + long wxExecute(wxChar **argv, bool sync, wxProcess *process) { // for the sync execution, we return -1 to indicate failure, but for async - // cse we return 0 which is never a valid PID - long errorRetCode = sync ? -1 : 0; + // case we return 0 which is never a valid PID + // + // we define this as a macro, not a variable, to avoid compiler warnings + // about "ERROR_RETURN_CODE value may be clobbered by fork()" + #define ERROR_RETURN_CODE ((sync) ? -1 : 0) - wxCHECK_MSG( *argv, errorRetCode, wxT("can't exec empty command") ); + wxCHECK_MSG( *argv, ERROR_RETURN_CODE, wxT("can't exec empty command") ); #if wxUSE_UNICODE int mb_argc = 0; @@ -442,7 +479,7 @@ long wxExecute(wxChar **argv, ARGS_CLEANUP; - return errorRetCode; + return ERROR_RETURN_CODE; } #endif // wxUSE_GUI @@ -470,7 +507,7 @@ long wxExecute(wxChar **argv, ARGS_CLEANUP; - return errorRetCode; + return ERROR_RETURN_CODE; } } @@ -498,7 +535,7 @@ long wxExecute(wxChar **argv, ARGS_CLEANUP; - return errorRetCode; + return ERROR_RETURN_CODE; } else if ( pid == 0 ) // we're in child { @@ -557,19 +594,21 @@ long wxExecute(wxChar **argv, // pipe initialization: construction of the wxStreams if ( process && process->IsRedirected() ) { +#if wxUSE_STREAMS // These two streams are relative to this process. wxOutputStream *outStream = new wxProcessFileOutputStream(pipeIn[1]); wxInputStream *inStream = new wxProcessFileInputStream(pipeOut[0]); wxInputStream *errStream = new wxProcessFileInputStream(pipeErr[0]); + process->SetPipeStreams(inStream, outStream, errStream); +#endif // wxUSE_STREAMS + close(pipeIn[0]); // close reading side close(pipeOut[1]); // close writing side close(pipeErr[1]); // close writing side - - process->SetPipeStreams(inStream, outStream, errStream); } -#if wxUSE_GUI +#if wxUSE_GUI && !defined(__WXMICROWIN__) wxEndProcessData *data = new wxEndProcessData; if ( sync ) @@ -631,6 +670,7 @@ long wxExecute(wxChar **argv, #endif } +#undef ERROR_RETURN_CODE #undef ARGS_CLEANUP // ---------------------------------------------------------------------------- @@ -873,6 +913,21 @@ long wxGetFreeMemory() // env vars // ---------------------------------------------------------------------------- +bool wxGetEnv(const wxString& var, wxString *value) +{ + // wxGetenv is defined as getenv() + wxChar *p = wxGetenv(var); + if ( !p ) + return FALSE; + + if ( value ) + { + *value = p; + } + + return TRUE; +} + bool wxSetEnv(const wxString& variable, const wxChar *value) { #if defined(HAVE_SETENV)