X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..493c9f6bb22eef04391998cb1770cf32f1cc6efc:/src/unix/utilsunx.cpp diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index dcd14f6e79..deeaa836ba 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -404,10 +404,13 @@ long wxExecute(wxChar **argv, 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 +445,7 @@ long wxExecute(wxChar **argv, ARGS_CLEANUP; - return errorRetCode; + return ERROR_RETURN_CODE; } #endif // wxUSE_GUI @@ -470,7 +473,7 @@ long wxExecute(wxChar **argv, ARGS_CLEANUP; - return errorRetCode; + return ERROR_RETURN_CODE; } } @@ -498,7 +501,7 @@ long wxExecute(wxChar **argv, ARGS_CLEANUP; - return errorRetCode; + return ERROR_RETURN_CODE; } else if ( pid == 0 ) // we're in child { @@ -622,8 +625,16 @@ long wxExecute(wxChar **argv, return exitcode; #endif // wxUSE_GUI } +#ifdef __VMS + // VMS does not recognise exit as a return and complains about + // a missing return + // I think VMS is wrong in this + // JJ + return 0; +#endif } +#undef ERROR_RETURN_CODE #undef ARGS_CLEANUP // ---------------------------------------------------------------------------- @@ -633,9 +644,14 @@ long wxExecute(wxChar **argv, const wxChar* wxGetHomeDir( wxString *home ) { *home = wxGetUserHome( wxString() ); + wxString tmp; if ( home->IsEmpty() ) *home = wxT("/"); - +#ifdef __VMS + tmp = *home; + if ( tmp.Last() != wxT(']')) + if ( tmp.Last() != wxT('/')) *home << wxT('/'); +#endif return home->c_str(); } @@ -857,6 +873,48 @@ long wxGetFreeMemory() return -1; } +// ---------------------------------------------------------------------------- +// 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) + return setenv(variable.mb_str(), value ? wxString(value).mb_str().data() + : NULL, 1 /* overwrite */) == 0; +#elif defined(HAVE_PUTENV) + wxString s = variable; + if ( value ) + s << _T('=') << value; + + // transform to ANSI + const char *p = s.mb_str(); + + // the string will be free()d by libc + char *buf = (char *)malloc(strlen(p) + 1); + strcpy(buf, p); + + return putenv(buf) == 0; +#else // no way to set an env var + return FALSE; +#endif +} + // ---------------------------------------------------------------------------- // signal handling // ----------------------------------------------------------------------------