+// Shutdown or reboot the PC
+bool wxShutdown(wxShutdownFlags wFlags)
+{
+ wxChar level;
+ switch ( wFlags )
+ {
+ case wxSHUTDOWN_POWEROFF:
+ level = _T('0');
+ break;
+
+ case wxSHUTDOWN_REBOOT:
+ level = _T('6');
+ break;
+
+ default:
+ wxFAIL_MSG( _T("unknown wxShutdown() flag") );
+ return false;
+ }
+
+ return system(wxString::Format(_T("init %c"), level).mb_str()) == 0;
+}
+
+// ----------------------------------------------------------------------------
+// wxStream classes to support IO redirection in wxExecute
+// ----------------------------------------------------------------------------
+
+#if HAS_PIPE_INPUT_STREAM
+
+bool wxPipeInputStream::CanRead() const
+{
+ if ( m_lasterror == wxSTREAM_EOF )
+ return false;
+
+ // check if there is any input available
+ struct timeval tv;
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+
+ const int fd = m_file->fd();
+
+ fd_set readfds;
+
+ wxFD_ZERO(&readfds);
+ wxFD_SET(fd, &readfds);
+
+ switch ( select(fd + 1, &readfds, NULL, NULL, &tv) )
+ {
+ case -1:
+ wxLogSysError(_("Impossible to get child process input"));
+ // fall through
+
+ case 0:
+ return false;
+
+ default:
+ wxFAIL_MSG(_T("unexpected select() return value"));
+ // still fall through
+
+ case 1:
+ // input available -- or maybe not, as select() returns 1 when a
+ // read() will complete without delay, but it could still not read
+ // anything
+ return !Eof();
+ }
+}
+
+#endif // HAS_PIPE_INPUT_STREAM
+
+// ----------------------------------------------------------------------------
+// wxShell
+// ----------------------------------------------------------------------------
+
+static wxString wxMakeShellCommand(const wxString& command)
+{
+ wxString cmd;
+ if ( !command )
+ {
+ // just an interactive shell
+ cmd = _T("xterm");
+ }
+ else
+ {
+ // execute command in a shell
+ cmd << _T("/bin/sh -c '") << command << _T('\'');
+ }
+
+ return cmd;
+}
+
+bool wxShell(const wxString& command)
+{
+ return wxExecute(wxMakeShellCommand(command), wxEXEC_SYNC) == 0;
+}
+
+bool wxShell(const wxString& command, wxArrayString& output)
+{
+ wxCHECK_MSG( !command.empty(), false, _T("can't exec shell non interactively") );
+
+ return wxExecute(wxMakeShellCommand(command), output);
+}
+
+namespace
+{
+
+// helper class for storing arguments as char** array suitable for passing to
+// execvp(), whatever form they were passed to us
+class ArgsArray
+{
+public:
+ ArgsArray(const wxArrayString& args)
+ {
+ Init(args.size());
+
+ for ( int i = 0; i < m_argc; i++ )
+ {
+ m_argv[i] = wxStrdup(args[i]);
+ }
+ }
+
+#if wxUSE_UNICODE
+ ArgsArray(wchar_t **wargv)
+ {
+ int argc = 0;
+ while ( *wargv++ )
+ argc++;
+
+ Init(argc);