int err = kill((pid_t)pid, (int)sig);
if ( rc )
{
- switch ( err )
+ switch ( errno )
{
case 0:
*rc = wxKILL_OK;
#define WXEXECUTE_NARGS 127
-long wxExecute( const wxString& command, bool sync, wxProcess *process )
+long wxExecute( const wxString& command, int flags, wxProcess *process )
{
wxCHECK_MSG( !command.IsEmpty(), 0, wxT("can't exec empty command") );
argv[argc] = NULL;
// do execute the command
- long lRc = wxExecute(argv, sync, process);
+ long lRc = wxExecute(argv, flags, process);
// clean up
argc = 0;
bool wxShell(const wxString& command)
{
- return wxExecute(wxMakeShellCommand(command), TRUE /* sync */) == 0;
+ return wxExecute(wxMakeShellCommand(command), wxEXEC_SYNC) == 0;
}
bool wxShell(const wxString& command, wxArrayString& output)
return wxExecute(wxMakeShellCommand(command), output);
}
+// 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;
+}
+
+
#if wxUSE_GUI
void wxHandleProcessTermination(wxEndProcessData *proc_data)
#endif // wxUSE_STREAMS
long wxExecute(wxChar **argv,
- bool sync,
+ int flags,
wxProcess *process)
{
// for the sync execution, we return -1 to indicate failure, but for async
//
// 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)
+ #define ERROR_RETURN_CODE ((flags & wxEXEC_SYNC) ? -1 : 0)
wxCHECK_MSG( *argv, ERROR_RETURN_CODE, wxT("can't exec empty command") );
// 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 ( !sync )
+ if ( !(flags & wxEXEC_SYNC) )
{
for ( int fd = 0; fd < FD_SETSIZE; fd++ )
{
if ( fd != STDERR_FILENO )
close(fd);
}
+
+#ifndef __VMS
+ if ( flags & wxEXEC_MAKE_GROUP_LEADER )
+ {
+ // Set process group to child process' pid. Then killing -pid
+ // of the parent will kill the process and all of its children.
+ setsid();
+ }
+#endif
}
// redirect stdio, stdout and stderr
#if wxUSE_GUI && !defined(__WXMICROWIN__)
wxEndProcessData *data = new wxEndProcessData;
- if ( sync )
+ if ( flags & wxEXEC_SYNC )
{
// we may have process for capturing the program output, but it's
// not used in wxEndProcessData in the case of sync execution
return pid;
}
#else // !wxUSE_GUI
- wxASSERT_MSG( sync, wxT("async execution not supported yet") );
+
+ wxASSERT_MSG( flags & wxEXEC_SYNC,
+ wxT("async execution not supported yet") );
int exitcode = 0;
if ( waitpid(pid, &exitcode, 0) == -1 || !WIFEXITED(exitcode) )