- wxEndProcessData *proc_data = (wxEndProcessData *)data;
- int pid;
-
- pid = (proc_data->pid > 0) ? proc_data->pid : -(proc_data->pid);
-
- /* wait4 is not part of any standard, use at own risk
- * not sure what wait4 does, but wait3 seems to be closest, whats a digit ;-)
- * --- offer@sgi.com */
-#if !defined(__sgi)
- wait4(proc_data->pid, NULL, 0, NULL);
-#else
- wait3((int *) NULL, 0, (rusage *) NULL);
-#endif
-
- close(source);
- gdk_input_remove(proc_data->tag);
-
- if (proc_data->process)
- proc_data->process->OnTerminate(proc_data->pid);
-
- if (proc_data->pid > 0)
- delete proc_data;
- else
- proc_data->pid = 0;
-};
-
-long wxExecute( char **argv, bool sync, wxProcess *process )
-{
- wxEndProcessData *data = new wxEndProcessData;
- int end_proc_detect[2];
-
- wxCHECK_MSG( *argv, 0, "can't exec empty command" );
-
- /* Create pipes */
- if (pipe(end_proc_detect) == -1) {
- wxLogSysError(_("Pipe creation failed"));
- return 0;
- }
-
- /* fork the process */
-#if defined(sun) || defined(__ultrix) || defined(__bsdi__)
- pid_t pid = vfork();
-#else
- pid_t pid = fork();
-#endif
- if (pid == -1) {
- // error
- wxLogSysError(_("Fork failed"));
- return 0;
- }
- else if (pid == 0) {
- // we're in child
- close(end_proc_detect[0]); // close reading side
-
-#ifdef _AIX
- execvp ((const char *)*argv, (const char **)argv);
-#else
- execvp (*argv, argv);
-#endif
- // there is no return after successful exec()
- wxLogSysError(_("Can't execute '%s'"), *argv);
-
- _exit(-1);
- }
- else {
- // we're in parent
- close(end_proc_detect[1]); // close writing side
- data->tag = gdk_input_add(end_proc_detect[0], GDK_INPUT_READ,
- GTK_EndProcessDetector, (gpointer)data);
- data->pid = pid;
- if (!sync) {
- data->process = process;
- }
- else {
- data->process = (wxProcess *) NULL;
- data->pid = -(data->pid);
-
- while (data->pid != 0)
- wxYield();