/////////////////////////////////////////////////////////////////////////////
// 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
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()
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;
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:
return false;
default:
- wxFAIL_MSG( _T("unknown wxShutdown() flag") );
+ wxFAIL_MSG( wxT("unknown wxShutdown() flag") );
return false;
}
return false;
default:
- wxFAIL_MSG(_T("unexpected select() return value"));
+ wxFAIL_MSG(wxT("unexpected select() return value"));
// still fall through
case 1:
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;
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);
}
int m_argc;
char **m_argv;
- DECLARE_NO_COPY_CLASS(ArgsArray)
+ wxDECLARE_NO_COPY_CLASS(ArgsArray);
};
} // anonymous namespace
-// these functions are in src/osx/carbon/utils.cpp for wxMac
-#ifndef __WXMAC__
-
-// ----------------------------------------------------------------------------
-// Launch document with default app
-// ----------------------------------------------------------------------------
-
-bool wxLaunchDefaultApplication(const wxString& document, int flags)
-{
- wxUnusedVar(flags);
-
- // Our best best is to use xdg-open from freedesktop.org cross-desktop
- // compatibility suite xdg-utils
- // (see http://portland.freedesktop.org/wiki/) -- this is installed on
- // most modern distributions and may be tweaked by them to handle
- // distribution specifics.
- wxString path, xdg_open;
- if ( wxGetEnv("PATH", &path) &&
- wxFindFileInPath(&xdg_open, path, "xdg-open") )
- {
- if ( wxExecute(xdg_open + " " + document) )
- return true;
- }
-
- return false;
-}
-
-// ----------------------------------------------------------------------------
-// Launch default browser
-// ----------------------------------------------------------------------------
-
-bool wxDoLaunchDefaultBrowser(const wxString& url, int flags)
-{
- wxUnusedVar(flags);
-
- // Our best best is to use xdg-open from freedesktop.org cross-desktop
- // compatibility suite xdg-utils
- // (see http://portland.freedesktop.org/wiki/) -- this is installed on
- // most modern distributions and may be tweaked by them to handle
- // distribution specifics. Only if that fails, try to find the right
- // browser ourselves.
- wxString path, xdg_open;
- if ( wxGetEnv("PATH", &path) &&
- wxFindFileInPath(&xdg_open, path, "xdg-open") )
- {
- if ( wxExecute(xdg_open + " " + url) )
- return true;
- }
-
- wxString desktop = wxTheApp->GetTraits()->GetDesktopEnvironment();
-
- // GNOME and KDE desktops have some applications which should be always installed
- // together with their main parts, which give us the
- if (desktop == wxT("GNOME"))
- {
- wxArrayString errors;
- wxArrayString output;
-
- // gconf will tell us the path of the application to use as browser
- long res = wxExecute( wxT("gconftool-2 --get /desktop/gnome/applications/browser/exec"),
- output, errors, wxEXEC_NODISABLE );
- if (res >= 0 && errors.GetCount() == 0)
- {
- wxString cmd = output[0];
- cmd << _T(' ') << url;
- if (wxExecute(cmd))
- return true;
- }
- }
- else if (desktop == wxT("KDE"))
- {
- // kfmclient directly opens the given URL
- if (wxExecute(wxT("kfmclient openURL ") + url))
- return true;
- }
-
- return false;
-}
-
-#endif // __WXMAC__
-
// ----------------------------------------------------------------------------
// wxExecute implementations
// ----------------------------------------------------------------------------
// 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 )
{
// save it for WaitForChild() use
execData.pid = pid;
+ if (execData.process)
+ execData.process->SetPid(pid); // and also in the wxProcess
// prepare for IO redirection
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;
}
pclose(f);
- if ( !s.empty() && s.Last() == _T('\n') )
+ if ( !s.empty() && s.Last() == wxT('\n') )
s.RemoveLast();
return s;
machine.Contains(wxT("alpha"));
}
+#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__
#elif defined(HAVE_PUTENV)
wxString s = variable;
if ( value )
- s << _T('=') << value;
+ s << wxT('=') << value;
// transform to ANSI
const wxWX2MBbuf p = s.mb_str();
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;
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;
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
private:
bool m_terminated;
- DECLARE_NO_COPY_CLASS(wxEndHandler)
+ wxDECLARE_NO_COPY_CLASS(wxEndHandler);
};
#if HAS_PIPE_INPUT_STREAM
private:
wxStreamTempInputBuffer * const m_buf;
- DECLARE_NO_COPY_CLASS(wxRedirectedIOHandler)
+ wxDECLARE_NO_COPY_CLASS(wxRedirectedIOHandler);
};
#endif // HAS_PIPE_INPUT_STREAM
{
wxASSERT_MSG( rc == pid, "unexpected waitpid() return value" );
+ // notice that the caller expects the exit code to be signed, e.g. -1
+ // instead of 255 so don't assign WEXITSTATUS() to an int
+ signed char exitcode;
if ( WIFEXITED(status) )
- return WEXITSTATUS(status);
+ exitcode = WEXITSTATUS(status);
else if ( WIFSIGNALED(status) )
- return -WTERMSIG(status);
+ exitcode = -WTERMSIG(status);
else
{
wxLogError("Child process (PID %d) exited for unknown reason, "
"status = %d", pid, status);
+ exitcode = -1;
}
+
+ return exitcode;
}
return -1;
}
//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() )
{