X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e408bf5257ead0754de5ef37a39867c7536dbe03..b4c1fe36b9854cdb404906ba3a181a67f9247e0e:/src/unix/utilsunx.cpp diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index f45510ae42..2e9973b6da 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: src/unix/utilsunx.cpp -// Purpose: generic Unix implementation of many wx functions +// Purpose: generic Unix implementation of many wx functions (for wxBase) // Author: Vadim Zeitlin // Id: $Id$ // Copyright: (c) 1998 Robert Roebling, Vadim Zeitlin @@ -202,7 +202,7 @@ void wxMicroSleep(unsigned long microseconds) tmReq.tv_nsec = (microseconds % 1000000) * 1000; // we're not interested in remaining time nor in return value - (void)nanosleep(&tmReq, (timespec *)NULL); + (void)nanosleep(&tmReq, NULL); #elif defined(HAVE_USLEEP) // uncomment this if you feel brave or if you are sure that your version // of Solaris has a safe usleep() function but please notice that usleep() @@ -255,7 +255,7 @@ int wxKill(long pid, wxSignal sig, wxKillError *rc, int flags) default: // this goes against Unix98 docs so log it - wxLogDebug(_T("unexpected kill(2) return value %d"), err); + wxLogDebug(wxT("unexpected kill(2) return value %d"), err); // something else... *rc = wxKILL_ERROR; @@ -274,11 +274,11 @@ bool wxShutdown(int flags) switch ( flags ) { case wxSHUTDOWN_POWEROFF: - level = _T('0'); + level = wxT('0'); break; case wxSHUTDOWN_REBOOT: - level = _T('6'); + level = wxT('6'); break; case wxSHUTDOWN_LOGOFF: @@ -286,7 +286,7 @@ bool wxShutdown(int flags) return false; default: - wxFAIL_MSG( _T("unknown wxShutdown() flag") ); + wxFAIL_MSG( wxT("unknown wxShutdown() flag") ); return false; } @@ -326,7 +326,7 @@ bool wxPipeInputStream::CanRead() const return false; default: - wxFAIL_MSG(_T("unexpected select() return value")); + wxFAIL_MSG(wxT("unexpected select() return value")); // still fall through case 1: @@ -349,12 +349,12 @@ static wxString wxMakeShellCommand(const wxString& command) if ( !command ) { // just an interactive shell - cmd = _T("xterm"); + cmd = wxT("xterm"); } else { // execute command in a shell - cmd << _T("/bin/sh -c '") << command << _T('\''); + cmd << wxT("/bin/sh -c '") << command << wxT('\''); } return cmd; @@ -367,7 +367,7 @@ bool wxShell(const wxString& command) bool wxShell(const wxString& command, wxArrayString& output) { - wxCHECK_MSG( !command.empty(), false, _T("can't exec shell non interactively") ); + wxCHECK_MSG( !command.empty(), false, wxT("can't exec shell non interactively") ); return wxExecute(wxMakeShellCommand(command), output); } @@ -429,7 +429,7 @@ private: int m_argc; char **m_argv; - DECLARE_NO_COPY_CLASS(ArgsArray) + wxDECLARE_NO_COPY_CLASS(ArgsArray); }; } // anonymous namespace @@ -480,7 +480,7 @@ long wxExecute(char **argv, int flags, wxProcess *process) // don't know what yet, so for now just warn the user (this is the least we // can do) about it wxASSERT_MSG( wxThread::IsMain(), - _T("wxExecute() can be called only from the main thread") ); + wxT("wxExecute() can be called only from the main thread") ); #endif // wxUSE_THREADS #if defined(__WXCOCOA__) || ( defined(__WXOSX_MAC__) && wxOSX_USE_COCOA_OR_CARBON ) @@ -542,30 +542,10 @@ long wxExecute(char **argv, int flags, wxProcess *process) } else if ( pid == 0 ) // we're in child { - // These lines close the open file descriptors to to avoid any - // input/output which might block the process or irritate the user. If - // one wants proper IO for the subprocess, the right thing to do is to - // start an xterm executing it. - if ( !(flags & wxEXEC_SYNC) ) - { - // FD_SETSIZE is unsigned under BSD, signed under other platforms - // so we need a cast to avoid warnings on all platforms - for ( int fd = 0; fd < (int)FD_SETSIZE; fd++ ) - { - if ( fd == pipeIn[wxPipe::Read] - || fd == pipeOut[wxPipe::Write] - || fd == pipeErr[wxPipe::Write] - || fd == (execData.pipeEndProcDetect)[wxPipe::Write] ) - { - // don't close this one, we still need it - continue; - } - - // leave stderr opened too, it won't do any harm - if ( fd != STDERR_FILENO ) - close(fd); - } - } + // NB: we used to close all the unused descriptors of the child here + // but this broke some programs which relied on e.g. FD 1 being + // always opened so don't do it any more, after all there doesn't + // seem to be any real problem with keeping them opened #if !defined(__VMS) && !defined(__EMX__) if ( flags & wxEXEC_MAKE_GROUP_LEADER ) @@ -621,6 +601,8 @@ long wxExecute(char **argv, int flags, wxProcess *process) { // save it for WaitForChild() use execData.pid = pid; + if (execData.process) + execData.process->SetPid(pid); // and also in the wxProcess // prepare for IO redirection @@ -740,7 +722,7 @@ static wxString wxGetCommandOutput(const wxString &cmd) FILE *f = popen(cmd.ToAscii(), "r"); if ( !f ) { - wxLogSysError(_T("Executing \"%s\" failed"), cmd.c_str()); + wxLogSysError(wxT("Executing \"%s\" failed"), cmd.c_str()); return wxEmptyString; } @@ -756,7 +738,7 @@ static wxString wxGetCommandOutput(const wxString &cmd) pclose(f); - if ( !s.empty() && s.Last() == _T('\n') ) + if ( !s.empty() && s.Last() == wxT('\n') ) s.RemoveLast(); return s; @@ -891,7 +873,26 @@ bool wxIsPlatform64Bit() machine.Contains(wxT("alpha")); } -// these functions are in mac/utils.cpp for wxMac +#ifdef __LINUX__ +wxLinuxDistributionInfo wxGetLinuxDistributionInfo() +{ + const wxString id = wxGetCommandOutput(wxT("lsb_release --id")); + const wxString desc = wxGetCommandOutput(wxT("lsb_release --description")); + const wxString rel = wxGetCommandOutput(wxT("lsb_release --release")); + const wxString codename = wxGetCommandOutput(wxT("lsb_release --codename")); + + wxLinuxDistributionInfo ret; + + id.StartsWith("Distributor ID:\t", &ret.Id); + desc.StartsWith("Description:\t", &ret.Description); + rel.StartsWith("Release:\t", &ret.Release); + codename.StartsWith("Codename:\t", &ret.CodeName); + + return ret; +} +#endif + +// these functions are in src/osx/utilsexc_base.cpp for wxMac #ifndef __WXMAC__ wxOperatingSystemId wxGetOsVersion(int *verMaj, int *verMin) @@ -1094,7 +1095,7 @@ static bool wxDoSetEnv(const wxString& variable, const char *value) #elif defined(HAVE_PUTENV) wxString s = variable; if ( value ) - s << _T('=') << value; + s << wxT('=') << value; // transform to ANSI const wxWX2MBbuf p = s.mb_str(); @@ -1177,7 +1178,7 @@ bool wxHandleFatalExceptions(bool doit) ok &= sigaction(SIGSEGV, &act, &s_handlerSEGV) == 0; if ( !ok ) { - wxLogDebug(_T("Failed to install our signal handler.")); + wxLogDebug(wxT("Failed to install our signal handler.")); } s_savedHandlers = true; @@ -1191,7 +1192,7 @@ bool wxHandleFatalExceptions(bool doit) ok &= sigaction(SIGSEGV, &s_handlerSEGV, NULL) == 0; if ( !ok ) { - wxLogDebug(_T("Failed to uninstall our signal handler.")); + wxLogDebug(wxT("Failed to uninstall our signal handler.")); } s_savedHandlers = false; @@ -1283,7 +1284,7 @@ public: protected: const int m_fd; - DECLARE_NO_COPY_CLASS(wxReadFDIOHandler) + wxDECLARE_NO_COPY_CLASS(wxReadFDIOHandler); }; // class for monitoring our end of the process detection pipe, simply sets a @@ -1304,7 +1305,7 @@ public: private: bool m_terminated; - DECLARE_NO_COPY_CLASS(wxEndHandler) + wxDECLARE_NO_COPY_CLASS(wxEndHandler); }; #if HAS_PIPE_INPUT_STREAM @@ -1333,7 +1334,7 @@ public: private: wxStreamTempInputBuffer * const m_buf; - DECLARE_NO_COPY_CLASS(wxRedirectedIOHandler) + wxDECLARE_NO_COPY_CLASS(wxRedirectedIOHandler); }; #endif // HAS_PIPE_INPUT_STREAM @@ -1411,7 +1412,7 @@ int wxAppTraits::WaitForChild(wxExecuteData& execData) } //else: synchronous execution case -#if HAS_PIPE_INPUT_STREAM +#if HAS_PIPE_INPUT_STREAM && wxUSE_SOCKETS wxProcess * const process = execData.process; if ( process && process->IsRedirected() ) {