| Loic Grenie on Wed, 22 Nov 2006 11:04:51 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Kludge for cygwin |
Minor correction: it looks as if I had forgotten the '\\' as
a character to quote.
LoïcIndex: src/language/es.c
===================================================================
RCS file: /home/cvs/pari/src/language/es.c,v
retrieving revision 1.229
diff -c -r1.229 es.c
*** src/language/es.c 14 Oct 2006 06:05:56 -0000 1.229
--- src/language/es.c 19 Nov 2006 16:05:08 -0000
***************
*** 2611,2616 ****
--- 2611,2654 ----
return file;
}
+ #ifdef __CYGWIN32__
+ struct pfd {
+ int pid;
+ int fd;
+ } *pfds = NULL;
+ static int numpfds = 0, maxpfds = 0;
+
+ static int
+ _pclose(FILE *f)
+ {
+ int i;
+ struct pfd *ppfd;
+ for (i = 0, ppfd = pfds; i < numpfds; i++, ppfd++)
+ if (ppfd->fd == fileno(f))
+ break;
+ if (i < numpfds)
+ kill(ppfd->pid, SIGTERM);
+ else
+ ppfd = NULL;
+ fclose(f);
+ if (ppfd && kill(ppfd->pid, SIGCONT) == 0) {
+ sleep(5);
+ kill(ppfd->pid, SIGKILL);
+ }
+ if (ppfd)
+ {
+ while (++i < numpfds)
+ {
+ *ppfd = ppfd[1];
+ ppfd++;
+ }
+ numpfds--;
+ }
+ return 0;
+ }
+ #define pclose _pclose
+ #endif
+
static void
pari_kill_file(pariFILE *f)
{
***************
*** 2635,2640 ****
--- 2673,2682 ----
gpfree(f);
}
+ #ifdef __CYGWIN32__
+ #undef pclose
+ #endif
+
void
pari_fclose(pariFILE *f)
{
***************
*** 2763,2768 ****
--- 2805,2869 ----
return 1;
}
+ #ifdef __CYGWIN32__
+ #include <process.h>
+ static FILE *
+ _popen(char *cmd, char *mode)
+ {
+ int fd[2];
+
+ if (!pipe(fd)) {
+ char *str, *p, *q;
+ int pid;
+
+ str = gpmalloc(2*strlen(cmd)+64);
+ strcpy(str, "eval \"");
+ for (p = str+strlen(str), q = cmd; *q; )
+ {
+ if (*q == '\\' || *q == '$' || *q == '`' || *q == '"')
+ *p++ = '\\';
+ *p++ = *q++;
+ }
+ if (*mode == 'r')
+ {
+ sprintf(p, "\" >&%d %d>&-", fd[1], fd[0]);
+ if (fd[1] != 1)
+ sprintf(p + strlen(p), " %d>&-", fd[1]);
+ }
+ else
+ {
+ sprintf(p, "\" <&%d %d>&-", fd[0], fd[1]);
+ if (fd[0] != 0)
+ sprintf(p + strlen(p), " %d>&-", fd[0]);
+ }
+ pid = spawnlp(_P_NOWAIT, "bash", "bash", "-c", str, NULL);
+ gpfree(str);
+ if (!pfds)
+ {
+ maxpfds = 10;
+ pfds = (struct pfd *)gpmalloc(maxpfds*sizeof(struct pfd));
+ }
+ else if (numpfds == maxpfds)
+ {
+ maxpfds += 10;
+ pfds = (struct pfd *)gprealloc(pfds, maxpfds*sizeof(struct pfd));
+ }
+ pfds[numpfds].pid = pid;
+ pfds[numpfds].fd = fd[*mode == 'w'];
+ if (*mode == 'r') {
+ close(fd[1]);
+ return fdopen(fd[0], "r");
+ }
+ else {
+ close(fd[0]);
+ return fdopen(fd[1], "w");
+ }
+ }
+ return NULL;
+ }
+ #define popen _popen
+ #endif
+
pariFILE *
try_pipe(char *cmd, int fl)
{
***************
*** 2800,2805 ****
--- 2901,2910 ----
#endif
}
+ #ifdef __CYGWIN32__
+ #undef popen
+ #endif
+
void
os_close(long fd)
{