-
-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) 
-    {
-        wxLogSysError( "Fork failed" );
-        return 0;
-    }
-    else if (pid == 0) 
-    {
-        // we're in child
-        close(end_proc_detect[0]); // close reading side
-       // These three lines close the open file descriptors to
-       // to avoid any input/output which might block the process
-       // or irritate the user. If one wants proper IO for the sub-
-       // process, the "right thing to do" is to start an xterm executing
-       // it.
-       close(STDIN_FILENO);
-       close(STDOUT_FILENO);
-       close(STDERR_FILENO);
-
-#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();
-
-        delete data;
-      }
-
-      // @@@ our return value indicates success even if execvp() in the child
-      //     failed!
-      return pid;
-    }