diff options
Diffstat (limited to 'pith/pipe.c')
-rw-r--r-- | pith/pipe.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/pith/pipe.c b/pith/pipe.c new file mode 100644 index 00000000..35549eef --- /dev/null +++ b/pith/pipe.c @@ -0,0 +1,102 @@ +#if !defined(lint) && !defined(DOS) +static char rcsid[] = "$Id: pipe.c 761 2007-10-23 22:35:18Z hubert@u.washington.edu $"; +#endif +/* + * ======================================================================== + * Copyright 2006 University of Washington + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * ======================================================================== + */ + +#include "../pith/headers.h" +#include "../pith/pipe.h" +#include "../pith/status.h" + + +/* Internal prototypes */ + + + +/* + * pipe_* functions introduced so out.f, in.f don't need to be used + * by whatever's setting up the pipe. + * Should be similar on unix and windows, but since we're faking piping + * in windows, closing the write pipe would signify that the child + * process can start running. This makes it possible for PIPE_WRITE + * and PIPE_READ flags to be simultaneously set across all platforms. + * Unix piping should eventually have NON_BLOCKING_IO stuff rolled up + * into it. + */ + +int +pipe_putc(int c, PIPE_S *syspipe) +{ + if(!syspipe || !syspipe->out.f) + return -1; + + return(fputc(c, syspipe->out.f)); +} + +int +pipe_puts(char *str, PIPE_S *syspipe) +{ + if(!syspipe || !syspipe->out.f) + return -1; + + return(fputs(str, syspipe->out.f)); +} + +char * +pipe_gets(char *str, int size, PIPE_S *syspipe) +{ + if(!syspipe || !syspipe->in.f) + return NULL; + + return(fgets(str, size, syspipe->in.f)); +} + +int +pipe_readc(unsigned char *c, PIPE_S *syspipe) +{ + int rv = 0; + + if(!syspipe || !syspipe->in.f) + return -1; + + do { + errno = 0; + clearerr(syspipe->in.f); + rv = fread(c, sizeof(unsigned char), (size_t)1, syspipe->in.f); + } while(!rv && ferror(syspipe->in.f) && errno == EINTR); + + return(rv); +} + +int +pipe_writec(int c, PIPE_S *syspipe) +{ + unsigned char ch = (unsigned char)c; + int rv = 0; + + if(!syspipe || !syspipe->out.f) + return -1; + + do + rv = fwrite(&ch, sizeof(unsigned char), (size_t)1, syspipe->out.f); + while(!rv && ferror(syspipe->out.f) && errno == EINTR); + + return(rv); +} + + +void +pipe_report_error(char *errormsg) +{ + q_status_message(SM_ORDER, 3, 3, errormsg); +} |