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ïc
Index: 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) {