- 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];
-
- if (*argv == NULL)
- return 0;
-
- /* Create pipes */
- if (pipe(end_proc_detect) == -1) {
- perror("pipe 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) {
- perror ("fork failed");
- return 0;
- } else if (pid == 0) {
- /* Close fd not useful */
- close(end_proc_detect[0]); // close reading side
-
- /* child */
-#ifdef _AIX
- execvp ((const char *)*argv, (const char **)argv);
-#else
- execvp (*argv, argv);
-#endif
- if (errno == ENOENT)
- wxError("command not found", *argv);
- else
- perror (*argv);
- wxError("could not execute", *argv);
- _exit (-1);
- }
-
- 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();
-
- delete data;
- }