home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
editor
/
less
/
pipe.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-31
|
3KB
|
124 lines
#include <stdlib.h>
#include <stdio.h>
#include <io.h>
#include <string.h>
#include <extlib.h>
typedef enum { unopened = 0, reading, writing } pipemode;
static struct
{
char *name;
char *command;
pipemode pmode;
}
pipes[_NFILE];
static FILE *dos_popen(char *command, char *mode)
{
FILE *current;
char name[128];
char *tmp = getenv("TMP");
int cur;
pipemode curmode;
/*
** decide on mode.
*/
if(strchr(mode, 'r') != NULL)
curmode = reading;
else if(strchr(mode, 'w') != NULL)
curmode = writing;
else
return NULL;
/*
** get a name to use.
*/
strcpy(name, tmp ? tmp : "\\");
if ( name[strlen(name) - 1] != '\\' )
strcat(name, "\\");
strcat(name, "piXXXXXX");
mktemp(name);
/*
** If we're reading, just call system to get a file filled with
** output.
*/
if(curmode == reading)
{
char cmd[256];
sprintf(cmd,"%s > %s", command, name);
system(cmd);
if((current = fopen(name, mode)) == NULL)
return NULL;
}
else
{
if((current = fopen(name, mode)) == NULL)
return NULL;
}
cur = fileno(current);
pipes[cur].name = strdup(name);
pipes[cur].command = strdup(command);
pipes[cur].pmode = curmode;
return current;
}
static int dos_pclose(FILE * current)
{
int cur = fileno(current), rval;
char command[256];
/*
** 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.
*/
fclose(current);
sprintf(command,"%s < %s", pipes[cur].command, pipes[cur].name);
rval = system(command);
unlink(pipes[cur].name);
}
/*
** clean up current pipe.
*/
free(pipes[cur].name);
free(pipes[cur].command);
pipes[cur].pmode = unopened;
return rval;
}
FILE *popen(char *cmd, char *mode)
{
return (_osmode == DOS_MODE) ? dos_popen(cmd, mode) : _popen(cmd, mode);
}
int pclose(FILE *ptr)
{
return (_osmode == DOS_MODE) ? dos_pclose(ptr) : _pclose(ptr);
}