X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=libfcgi%2Ffcgi_stdio.c;h=0578d2e70cb33f536f1f09490023edc4ce76251e;hb=9227ca859cf7e8c02231a19fc93fc0dd15e90967;hp=79ca3078260632767ce99fa684275b26ee1d13fa;hpb=aadcc3c80eeffeb7b850297e3732fc891fbe0968;p=catagits%2Ffcgi2.git diff --git a/libfcgi/fcgi_stdio.c b/libfcgi/fcgi_stdio.c index 79ca307..0578d2e 100644 --- a/libfcgi/fcgi_stdio.c +++ b/libfcgi/fcgi_stdio.c @@ -12,48 +12,54 @@ */ #ifndef lint -static const char rcsid[] = "$Id: fcgi_stdio.c,v 1.7 1999/07/27 15:00:16 roberts Exp $"; +static const char rcsid[] = "$Id: fcgi_stdio.c,v 1.12 2001/06/20 16:04:17 robs Exp $"; #endif /* not lint */ -#ifdef _WIN32 -#define DLLAPI __declspec(dllexport) -#endif +#include /* for errno */ +#include /* for va_arg */ +#include /* for malloc */ +#include /* for strerror */ -#define NO_FCGI_DEFINES -#include "fcgi_stdio.h" -#undef NO_FCGI_DEFINES +#include "fcgi_config.h" -#ifdef _WIN32 -#include -#endif -#include - /* for errno */ -#include - /* for va_arg */ -#include - /* for malloc */ -#include - /* for strerror */ #ifdef HAVE_UNISTD_H #include #endif +#define DLLAPI __declspec(dllexport) + +#define NO_FCGI_DEFINES +#include "fcgi_stdio.h" +#undef NO_FCGI_DEFINES + #include "fcgiapp.h" #include "fcgios.h" +#include "fcgimisc.h" -#ifndef FALSE -#define FALSE (0) -#endif -#ifndef TRUE -#define TRUE (1) +#ifndef _WIN32 + +extern char **environ; + +/* These definitions should be supplied by stdio.h but for some + * reason they get lost on certain platforms. */ +#ifndef fileno +extern int fileno(FILE *stream); #endif -FCGI_FILE _fcgi_sF[3]; +extern FILE *fdopen(int fildes, const char *type); +extern FILE *popen(const char *command, const char *type); +extern int pclose(FILE *stream); + +#else /* _WIN32 */ -#ifdef _WIN32 #define popen _popen -#endif - +#define pclose _pclose + +#endif /* _WIN32 */ + +FCGI_FILE _fcgi_sF[3]; + + /* *---------------------------------------------------------------------- * @@ -101,9 +107,6 @@ FCGI_FILE _fcgi_sF[3]; */ static int acceptCalled = FALSE; static int isCGI = FALSE; -#ifndef _WIN32 -extern char **environ; -#endif int FCGI_Accept(void) { @@ -146,7 +149,7 @@ int FCGI_Accept(void) } return 0; } - + /* *---------------------------------------------------------------------- * @@ -183,7 +186,7 @@ void FCGI_Finish(void) FCGI_stderr->fcgx_stream = NULL; environ = NULL; } - + /* *---------------------------------------------------------------------- * @@ -202,7 +205,6 @@ void FCGI_Finish(void) * *---------------------------------------------------------------------- */ - int FCGI_StartFilterData(void) { if(FCGI_stdin->stdio_stream) { @@ -211,7 +213,7 @@ int FCGI_StartFilterData(void) return FCGX_StartFilterData(FCGI_stdin->fcgx_stream); } } - + /* *---------------------------------------------------------------------- * @@ -226,14 +228,13 @@ int FCGI_StartFilterData(void) * *---------------------------------------------------------------------- */ - void FCGI_SetExitStatus(int status) { if(FCGI_stdin->fcgx_stream) { FCGX_SetExitStatus(status, FCGI_stdin->fcgx_stream); } } - + /* *---------------------------------------------------------------------- * @@ -243,7 +244,6 @@ void FCGI_SetExitStatus(int status) * *---------------------------------------------------------------------- */ - void FCGI_perror(const char *str) { FCGI_fputs(str, FCGI_stderr); @@ -251,7 +251,7 @@ void FCGI_perror(const char *str) FCGI_fputs(strerror(OS_Errno), FCGI_stderr); return; } - + /* *---------------------------------------------------------------------- * @@ -265,20 +265,23 @@ void FCGI_perror(const char *str) * *---------------------------------------------------------------------- */ - static FCGI_FILE *FCGI_OpenFromFILE(FILE *stream) { FCGI_FILE *fp; - if(stream == NULL) - return NULL; - fp = (FCGI_FILE *)malloc(sizeof(FCGI_FILE)); - if(fp == NULL) + + if (stream == NULL) return NULL; - fp->stdio_stream = stream; - fp->fcgx_stream = NULL; + + fp = (FCGI_FILE *) malloc(sizeof(FCGI_FILE)); + if (fp != NULL) + { + fp->stdio_stream = stream; + fp->fcgx_stream = NULL; + } + return fp; } - + /* *---------------------------------------------------------------------- * @@ -288,10 +291,15 @@ static FCGI_FILE *FCGI_OpenFromFILE(FILE *stream) * *---------------------------------------------------------------------- */ - FCGI_FILE *FCGI_fopen(const char *path, const char *mode) { - return FCGI_OpenFromFILE(fopen(path, mode)); + FILE * file = fopen(path, mode); + FCGI_FILE * fcgi_file = FCGI_OpenFromFILE(file); + + if (file && !fcgi_file) + fclose(file); + + return fcgi_file; } int FCGI_fclose(FCGI_FILE *fp) @@ -341,7 +349,7 @@ FCGI_FILE *FCGI_freopen(const char *path, const char *mode, } return NULL; } - + /* *---------------------------------------------------------------------- * @@ -365,7 +373,7 @@ void FCGI_setbuf(FCGI_FILE *fp, char *buf) if(fp->stdio_stream) setbuf(fp->stdio_stream, buf); } - + /* *---------------------------------------------------------------------- * @@ -375,7 +383,6 @@ void FCGI_setbuf(FCGI_FILE *fp, char *buf) * *---------------------------------------------------------------------- */ - int FCGI_fseek(FCGI_FILE *fp, long offset, int whence) { if(fp->stdio_stream) @@ -425,7 +432,7 @@ int FCGI_fsetpos(FCGI_FILE *fp, const fpos_t *pos) } } #endif - + /* *---------------------------------------------------------------------- * @@ -438,7 +445,6 @@ int FCGI_fsetpos(FCGI_FILE *fp, const fpos_t *pos) * *---------------------------------------------------------------------- */ - int FCGI_fgetc(FCGI_FILE *fp) { if(fp->stdio_stream) @@ -461,7 +467,7 @@ int FCGI_ungetc(int c, FCGI_FILE *fp) return FCGX_UnGetChar(c, fp->fcgx_stream); return EOF; } - + /* *---------------------------------------------------------------------- * @@ -471,7 +477,6 @@ int FCGI_ungetc(int c, FCGI_FILE *fp) * *---------------------------------------------------------------------- */ - char *FCGI_fgets(char *str, int size, FCGI_FILE *fp) { if(fp->stdio_stream) @@ -482,15 +487,16 @@ char *FCGI_fgets(char *str, int size, FCGI_FILE *fp) } /* - * There is no standard equivalent of gets that takes an explicit - * FILE * argument, so the following "wrapper" implements - * gets for both FILE * and FCGX_Stream * in terms of FCGI_getchar. + * The gets() function reads characters from the standard input stream + * into the array pointed to by str until a newline character is read + * or an end-of-file condition is encountered. The newline character + * is discarded and the string is terminated with a null character. */ - char *FCGI_gets(char *str) { char *s; int c; + for (s = str; ((c = FCGI_getchar()) != '\n');) { if(c == EOF) { if(s == str) @@ -498,17 +504,15 @@ char *FCGI_gets(char *str) else break; } else - *s++ = c; + *s++ = (char) c; } *s = 0; return str; } - + /* *---------------------------------------------------------------------- * - * -- - * * Wrappers for functions defined in H&S Section 15.8 * * XXX: missing: fscanf, scanf @@ -516,7 +520,6 @@ char *FCGI_gets(char *str) *---------------------------------------------------------------------- */ - /* *---------------------------------------------------------------------- * @@ -529,7 +532,6 @@ char *FCGI_gets(char *str) * *---------------------------------------------------------------------- */ - int FCGI_fputc(int c, FCGI_FILE *fp) { if(fp->stdio_stream) @@ -543,7 +545,7 @@ int FCGI_putchar(int c) { return FCGI_fputc(c, FCGI_stdout); } - + /* *---------------------------------------------------------------------- * @@ -553,7 +555,6 @@ int FCGI_putchar(int c) * *---------------------------------------------------------------------- */ - int FCGI_fputs(const char *str, FCGI_FILE *fp) { if(fp->stdio_stream) @@ -581,7 +582,7 @@ int FCGI_puts(const char *str) } return EOF; } - + /* *---------------------------------------------------------------------- * @@ -591,7 +592,6 @@ int FCGI_puts(const char *str) * *---------------------------------------------------------------------- */ - int FCGI_fprintf(FCGI_FILE *fp, const char *format, ...) { va_list ap; @@ -614,7 +614,7 @@ int FCGI_printf(const char *format, ...) va_end(ap); return n; } - + /* *---------------------------------------------------------------------- * @@ -624,7 +624,6 @@ int FCGI_printf(const char *format, ...) * *---------------------------------------------------------------------- */ - int FCGI_vfprintf(FCGI_FILE *fp, const char *format, va_list ap) { if(fp->stdio_stream) @@ -642,7 +641,7 @@ int FCGI_vprintf(const char *format, va_list ap) return FCGX_VFPrintF(FCGI_stdout->fcgx_stream, format, ap); return EOF; } - + /* *---------------------------------------------------------------------- * @@ -652,7 +651,6 @@ int FCGI_vprintf(const char *format, va_list ap) * *---------------------------------------------------------------------- */ - size_t FCGI_fread(void *ptr, size_t size, size_t nmemb, FCGI_FILE *fp) { int n; @@ -682,7 +680,7 @@ size_t FCGI_fwrite(void *ptr, size_t size, size_t nmemb, FCGI_FILE *fp) } return (size_t)EOF; } - + /* *---------------------------------------------------------------------- * @@ -722,7 +720,7 @@ void FCGI_clearerr(FCGI_FILE *fp) } return; } - + /* *---------------------------------------------------------------------- * @@ -734,10 +732,15 @@ void FCGI_clearerr(FCGI_FILE *fp) */ FCGI_FILE *FCGI_tmpfile(void) { - return FCGI_OpenFromFILE(tmpfile()); + FILE * file = tmpfile(); + FCGI_FILE * fcgi_file = FCGI_OpenFromFILE(file); + + if (file && !fcgi_file) + fclose(file); + + return fcgi_file; } - /* *---------------------------------------------------------------------- * @@ -747,23 +750,6 @@ FCGI_FILE *FCGI_tmpfile(void) * *---------------------------------------------------------------------- */ - -/* - * These definitions should be supplied by stdio.h but for some - * reason they get lost on certain platforms. - */ -/* - * XXX: Need to find the right way to handle this for NT - */ -#ifndef _WIN32 -#ifndef fileno -extern int fileno(FILE *stream); -#endif -extern FILE *fdopen(int fildes, const char *type); -extern FILE *popen(const char *command, const char *type); -extern int pclose(FILE *stream); -#endif - int FCGI_fileno(FCGI_FILE *fp) { if(fp->stdio_stream) @@ -774,25 +760,31 @@ int FCGI_fileno(FCGI_FILE *fp) FCGI_FILE *FCGI_fdopen(int fd, const char *mode) { -#ifndef _WIN32 - return FCGI_OpenFromFILE(fdopen(fd, mode)); -#else - return NULL; -#endif + FILE * file = fdopen(fd, mode); + FCGI_FILE * fcgi_file = FCGI_OpenFromFILE(file); + + if (file && !fcgi_file) + fclose(file); + + return fcgi_file; } FCGI_FILE *FCGI_popen(const char *cmd, const char *type) { - return FCGI_OpenFromFILE(popen(cmd, type)); + FILE * file = popen(cmd, type); + FCGI_FILE * fcgi_file = FCGI_OpenFromFILE(file); + + if (file && !fcgi_file) + pclose(file); + + return fcgi_file; } int FCGI_pclose(FCGI_FILE *fp) { int n = EOF; - if(fp->stdio_stream) { -#ifndef _WIN32 + if (fp->stdio_stream) { n = pclose(fp->stdio_stream); -#endif fp->stdio_stream = NULL; } else if(fp->fcgx_stream) { /* @@ -805,7 +797,3 @@ int FCGI_pclose(FCGI_FILE *fp) } return n; } - -/* - *---------------------------------------------------------------------- - */