diff options
author | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 13:09:56 +0300 |
---|---|---|
committer | Arnold D. Robbins <arnold@skeeve.com> | 2010-07-16 13:09:56 +0300 |
commit | bc70de7b3302d5a81515b901cae376b8b51d2004 (patch) | |
tree | d36d6743e65697f6923b79d0ea8f9f9bf4ef7398 /unsupported/tandem/popen.c | |
parent | b9e4a1fd4c8c8753ab8a9887bab55f03efe1e3e2 (diff) | |
download | egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.tar.gz egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.tar.bz2 egawk-bc70de7b3302d5a81515b901cae376b8b51d2004.zip |
Move to gawk-3.1.0.
Diffstat (limited to 'unsupported/tandem/popen.c')
-rw-r--r-- | unsupported/tandem/popen.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/unsupported/tandem/popen.c b/unsupported/tandem/popen.c new file mode 100644 index 00000000..310225d3 --- /dev/null +++ b/unsupported/tandem/popen.c @@ -0,0 +1,128 @@ +#include "popen.h" +#include <stdlib.h> +#if !defined(TANDEM) +#include <io.h> +#else +#include "config.h" +#include <fcntl.h> +#endif +#include <string.h> +#if !defined(TANDEM) +#include <process.h> +#endif + +#ifdef OS2 +#ifdef _MSC_VER +#define popen(c,m) _popen(c,m) +#define pclose(f) _pclose(f) +#endif +#endif + +#ifndef _NFILE +#define _NFILE 40 +#endif + +static char template[] = "piXXXXXX"; +typedef enum { unopened = 0, reading, writing } pipemode; +static +struct { + char *command; + char *name; + pipemode pmode; +} pipes[_NFILE]; + +FILE * +os_popen( char *command, char *mode ) { + FILE *current; + char *name; + int cur; + pipemode curmode; + +#if defined(OS2) && (_MSC_VER != 510) + if (_osmode == OS2_MODE) + return(popen(command, mode)); +#endif + + /* + ** decide on mode. + */ + if(strcmp(mode,"r") == 0) + curmode = reading; + else if(strcmp(mode,"w") == 0) + curmode = writing; + else + return NULL; + /* + ** get a name to use. + */ + if((name = tempnam(".","pip"))==NULL) + return NULL; + /* + ** If we're reading, just call system to get a file filled with + ** output. + */ + if(curmode == reading) { + if ((cur = dup(fileno(stdout))) == -1) + return NULL; + if ((current = freopen(name, "w", stdout)) == NULL) + return NULL; + system(command); + if (dup2(cur, fileno(stdout)) == -1) + return NULL; + close(cur); + if((current = fopen(name,"r")) == NULL) + return NULL; + } else { + if((current = fopen(name,"w")) == NULL) + return NULL; + } + cur = fileno(current); + pipes[cur].name = name; + pipes[cur].pmode = curmode; + pipes[cur].command = strdup(command); + return current; +} + +int +os_pclose( FILE * current) { + int cur = fileno(current),rval; + +#if defined(OS2) && (_MSC_VER != 510) + if (_osmode == OS2_MODE) + return(pclose(current)); +#endif + + /* + ** check for an open file. + */ + if(pipes[cur].pmode == unopened) + return -1; + if(pipes[cur].pmode == reading) { + /* + ** input pipes are just files we're done with. + */ + rval = fclose(current); + unlink(pipes[cur].name); + } else { + /* + ** output pipes are temporary files we have + ** to cram down the throats of programs. + */ + char command[256]; + fclose(current); +#if defined(TANDEM) + sprintf(command,"%s /IN %s/",pipes[cur].command,pipes[cur].name); +#else + sprintf(command,"%s < %s",pipes[cur].command,pipes[cur].name); +#endif + rval = system(command); + unlink(pipes[cur].name); + } + /* + ** clean up current pipe. + */ + pipes[cur].pmode = unopened; + free(pipes[cur].name); + free(pipes[cur].command); + return rval; +} |