Jelajahi Sumber

(Try to) fix MinGW version of G_popen()

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@34722 15284696-431f-4ddb-bdfa-cd5b030d7da7
Glynn Clements 16 tahun lalu
induk
melakukan
c3a8c42907
1 mengubah file dengan 29 tambahan dan 11 penghapusan
  1. 29 11
      lib/gis/popen.c

+ 29 - 11
lib/gis/popen.c

@@ -8,31 +8,49 @@
 #  include <io.h>
 #  include <fcntl.h>
 #  include <process.h>
+static int popen_pid[1024];
 #endif
 
 #include <grass/gis.h>
 
-#define READ      0
-#define WRITE     1
-
 FILE *G_popen(const char *cmd, const char *mode)
 {
 #ifndef __MINGW32__
     return popen(cmd, mode);
 #else
-    int thepipes[2];
-    FILE *rv = NULL;
+    RETSIGTYPE(*sigint)(int);
+    int pipe_fd[2];
+    FILE *rv;
+    int pid;
+    int dir, odir;
+    int oldfd;
 
     fflush(stdout);
     fflush(stderr);
 
-    /*setvbuf ( stdout, NULL, _IONBF, 0 ); */
-
-    if (_pipe(thepipes, 256, O_BINARY) != -1) {
-	execl("cmd", "cmd", "/c", cmd, (char *)NULL);
-	close(thepipes[WRITE]);
-	rv = fdopen(thepipes[READ], mode);
+    switch (mode[0]) {
+    case 'r':	dir = 0;	break;
+    case 'w':	dir = 1;	break;
+    default:	return NULL;
     }
+    odir = 1-dir;
+
+    if (_pipe(pipe_fd, 256, O_BINARY) < 0)
+	return NULL;
+
+    sigint = signal(SIGINT, SIG_IGN);
+
+    oldfd = _dup(odir);
+    _dup2(pipe_fd[odir], odir);
+    pid = spawnlp(_P_NOWAIT, "cmd", "cmd", "/c", cmd, (char *)NULL);
+    _dup2(oldfd, odir);
+    close(oldfd);
+
+    signal(SIGINT, sigint);
+
+    close(pipe_fd[odir]);
+    popen_pid[pipe_fd[dir]] = pid;
+    rv = fdopen(pipe_fd[dir], mode);
 
     return rv;
 #endif