X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=libfcgi%2Ffcgi_stdio.c;h=379cb12c54dcf14ca5331527b55436f59d2d8fe1;hb=6b0686c22ad8e93935a103806a5f0526a26cd221;hp=befd500aa22ae28ef4bffee10c21e84ad227badc;hpb=ed728efb4171b6205476c97d17b94dadde4bfaa1;p=catagits%2Ffcgi2.git diff --git a/libfcgi/fcgi_stdio.c b/libfcgi/fcgi_stdio.c index befd500..379cb12 100644 --- a/libfcgi/fcgi_stdio.c +++ b/libfcgi/fcgi_stdio.c @@ -1,4 +1,4 @@ -/* +/* * fcgi_stdio.c -- * * FastCGI-stdio compatibility package @@ -12,51 +12,62 @@ */ #ifndef lint -static const char rcsid[] = "$Id: fcgi_stdio.c,v 1.4 1999/01/30 22:24:09 roberts Exp $"; +static const char rcsid[] = "$Id: fcgi_stdio.c,v 1.8 1999/07/28 00:24:15 roberts Exp $"; #endif /* not lint */ +#include "fcgi_config.h" + #ifdef _WIN32 #define DLLAPI __declspec(dllexport) +#include #endif -#define NO_FCGI_DEFINES -#include "fcgi_stdio.h" -#undef NO_FCGI_DEFINES +#include /* for errno */ +#include /* for va_arg */ +#include /* for malloc */ +#include /* for strerror */ -#ifdef _WIN32 -#include -#endif -#include - /* for errno */ -#include - /* for va_arg */ -#include - /* for malloc */ -#include - /* for strerror */ #ifdef HAVE_UNISTD_H #include #endif +#define NO_FCGI_DEFINES +#include "fcgi_stdio.h" +#undef NO_FCGI_DEFINES + #include "fcgiapp.h" #include "fcgios.h" +#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 + +extern FILE *fdopen(int fildes, const char *type); +extern FILE *popen(const char *command, const char *type); +extern int pclose(FILE *stream); + +#else /* _WIN32 */ + +#define popen _popen + +#endif /* _WIN32 */ + #ifndef FALSE #define FALSE (0) #endif + #ifndef TRUE #define TRUE (1) #endif -#ifdef _WIN32 FCGI_FILE _fcgi_sF[3]; -#else -FCGI_FILE _fcgi_sF[3] = {{stdin, NULL}, {stdout, NULL}, {stderr, NULL}}; -#endif -#ifdef _WIN32 -#define popen _popen -#endif /* *---------------------------------------------------------------------- @@ -105,9 +116,6 @@ FCGI_FILE _fcgi_sF[3] = {{stdin, NULL}, {stdout, NULL}, {stderr, NULL}}; */ static int acceptCalled = FALSE; static int isCGI = FALSE; -#ifndef _WIN32 -extern char **environ; -#endif int FCGI_Accept(void) { @@ -118,6 +126,7 @@ int FCGI_Accept(void) */ isCGI = FCGX_IsCGI(); acceptCalled = TRUE; + atexit(&FCGI_Finish); } else if(isCGI) { /* * Not first call to FCGI_Accept and running as CGI means @@ -192,16 +201,16 @@ void FCGI_Finish(void) * * FCGI_StartFilterData -- * - * + * * The current request is for the filter role, and stdin is - * positioned at EOF of FCGI_STDIN. The call repositions + * positioned at EOF of FCGI_STDIN. The call repositions * stdin to the start of FCGI_DATA. * If the preconditions are not met (e.g. FCGI_STDIN has not * been read to EOF), the call sets the stream error code to * FCGX_CALL_SEQ_ERROR. * * Results: - * 0 for a normal return, < 0 for error + * 0 for a normal return, < 0 for error * *---------------------------------------------------------------------- */ @@ -267,14 +276,14 @@ void FCGI_perror(const char *str) * otherwise the new FCGI_FILE *. * *---------------------------------------------------------------------- - */ + */ static FCGI_FILE *FCGI_OpenFromFILE(FILE *stream) { FCGI_FILE *fp; if(stream == NULL) return NULL; - fp = malloc(sizeof(FCGI_FILE)); + fp = (FCGI_FILE *)malloc(sizeof(FCGI_FILE)); if(fp == NULL) return NULL; fp->stdio_stream = stream; @@ -396,7 +405,7 @@ int FCGI_ftell(FCGI_FILE *fp) else { OS_SetErrno(ESPIPE); return -1; - } + } } void FCGI_rewind(FCGI_FILE *fp) @@ -415,7 +424,7 @@ int FCGI_fgetpos(FCGI_FILE *fp, fpos_t *pos) else { OS_SetErrno(ESPIPE); return -1; - } + } } int FCGI_fsetpos(FCGI_FILE *fp, const fpos_t *pos) @@ -425,7 +434,7 @@ int FCGI_fsetpos(FCGI_FILE *fp, const fpos_t *pos) else { OS_SetErrno(ESPIPE); return -1; - } + } } #endif @@ -496,7 +505,7 @@ char *FCGI_gets(char *str) int c; for (s = str; ((c = FCGI_getchar()) != '\n');) { if(c == EOF) { - if(s == str) + if(s == str) return NULL; else break; @@ -535,7 +544,7 @@ char *FCGI_gets(char *str) int FCGI_fputc(int c, FCGI_FILE *fp) { - if(fp->stdio_stream) + if(fp->stdio_stream) return fputc(c, fp->stdio_stream); else if(fp->fcgx_stream) return FCGX_PutChar(c, fp->fcgx_stream); @@ -632,7 +641,7 @@ int FCGI_vfprintf(FCGI_FILE *fp, const char *format, va_list ap) { if(fp->stdio_stream) return vfprintf(fp->stdio_stream, format, ap); - else if(fp->fcgx_stream) + else if(fp->fcgx_stream) return FCGX_VFPrintF(fp->fcgx_stream, format, ap); return EOF; } @@ -641,7 +650,7 @@ int FCGI_vprintf(const char *format, va_list ap) { if(FCGI_stdout->stdio_stream) return vfprintf(FCGI_stdout->stdio_stream, format, ap); - else if(FCGI_stdout->fcgx_stream) + else if(FCGI_stdout->fcgx_stream) return FCGX_VFPrintF(FCGI_stdout->fcgx_stream, format, ap); return EOF; } @@ -751,22 +760,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)