fix copyright information in these files
[catagits/fcgi2.git] / libfcgi / fcgi_stdio.c
index 79ca307..47dcc48 100644 (file)
@@ -6,54 +6,62 @@
  *
  * Copyright (c) 1996 Open Market, Inc.
  *
- * See the file "LICENSE.TERMS" for information on usage and redistribution
+ * See the file "LICENSE" for information on usage and redistribution
  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  *
  */
 
 #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.14 2001/09/01 01:09:30 robs Exp $";
 #endif /* not lint */
 
+#include <errno.h>  /* for errno */
+#include <stdarg.h> /* for va_arg */
+#include <stdlib.h> /* for malloc */
+#include <string.h> /* for strerror */
+
+#include "fcgi_config.h"
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #ifdef _WIN32
 #define DLLAPI  __declspec(dllexport)
 #endif
 
+#include "fcgiapp.h"
+#include "fcgios.h"
+#include "fcgimisc.h"
+
 #define NO_FCGI_DEFINES
 #include "fcgi_stdio.h"
 #undef NO_FCGI_DEFINES
 
-#ifdef _WIN32
-#include <windows.h>
-#endif
-#include <errno.h>
-    /* for errno */
-#include <stdarg.h>
-    /* for va_arg */
-#include <stdlib.h>
-    /* for malloc */
-#include <string.h>
-    /* for strerror */
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
+#ifndef _WIN32
 
-#include "fcgiapp.h"
-#include "fcgios.h"
+extern char **environ;
 
-#ifndef FALSE
-#define FALSE (0)
-#endif
-#ifndef TRUE
-#define TRUE  (1)
+#ifdef HAVE_FILENO_PROTO
+#include <stdio.h>
+#else
+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
-\f
+#define pclose _pclose
+
+#endif /* _WIN32 */
+
+FCGI_FILE _fcgi_sF[3];
+
+
 /*
  *----------------------------------------------------------------------
  *
@@ -101,9 +109,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 +151,7 @@ int FCGI_Accept(void)
     }
     return 0;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -183,7 +188,7 @@ void FCGI_Finish(void)
     FCGI_stderr->fcgx_stream = NULL;
     environ = NULL;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -202,7 +207,6 @@ void FCGI_Finish(void)
  *
  *----------------------------------------------------------------------
  */
-
 int FCGI_StartFilterData(void)
 {
     if(FCGI_stdin->stdio_stream) {
@@ -211,7 +215,7 @@ int FCGI_StartFilterData(void)
         return FCGX_StartFilterData(FCGI_stdin->fcgx_stream);
     }
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -226,14 +230,13 @@ int FCGI_StartFilterData(void)
  *
  *----------------------------------------------------------------------
  */
-
 void FCGI_SetExitStatus(int status)
 {
     if(FCGI_stdin->fcgx_stream) {
         FCGX_SetExitStatus(status, FCGI_stdin->fcgx_stream);
     }
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -243,7 +246,6 @@ void FCGI_SetExitStatus(int status)
  *
  *----------------------------------------------------------------------
  */
-
 void FCGI_perror(const char *str)
 {
     FCGI_fputs(str, FCGI_stderr);
@@ -251,7 +253,7 @@ void FCGI_perror(const char *str)
     FCGI_fputs(strerror(OS_Errno), FCGI_stderr);
     return;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -265,20 +267,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;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -288,10 +293,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 +351,7 @@ FCGI_FILE *FCGI_freopen(const char *path, const char *mode,
     }
     return NULL;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -365,7 +375,7 @@ void FCGI_setbuf(FCGI_FILE *fp, char *buf)
     if(fp->stdio_stream)
         setbuf(fp->stdio_stream, buf);
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -375,7 +385,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 +434,7 @@ int FCGI_fsetpos(FCGI_FILE *fp, const fpos_t *pos)
     }
 }
 #endif
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -438,7 +447,6 @@ int FCGI_fsetpos(FCGI_FILE *fp, const fpos_t *pos)
  *
  *----------------------------------------------------------------------
  */
-
 int FCGI_fgetc(FCGI_FILE *fp)
 {
     if(fp->stdio_stream)
@@ -461,7 +469,7 @@ int FCGI_ungetc(int c, FCGI_FILE *fp)
         return FCGX_UnGetChar(c, fp->fcgx_stream);
     return EOF;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -471,7 +479,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 +489,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 +506,15 @@ char *FCGI_gets(char *str)
             else
                 break;
         } else
-            *s++ = c;
+            *s++ = (char) c;
     }
     *s = 0;
     return str;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
- * --
- *
  *       Wrappers for functions defined in H&S Section 15.8
  *
  *       XXX: missing: fscanf, scanf
@@ -516,7 +522,6 @@ char *FCGI_gets(char *str)
  *----------------------------------------------------------------------
  */
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -529,7 +534,6 @@ char *FCGI_gets(char *str)
  *
  *----------------------------------------------------------------------
  */
-
 int FCGI_fputc(int c, FCGI_FILE *fp)
 {
     if(fp->stdio_stream)
@@ -543,7 +547,7 @@ int FCGI_putchar(int c)
 {
     return FCGI_fputc(c, FCGI_stdout);
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -553,7 +557,6 @@ int FCGI_putchar(int c)
  *
  *----------------------------------------------------------------------
  */
-
 int FCGI_fputs(const char *str, FCGI_FILE *fp)
 {
     if(fp->stdio_stream)
@@ -581,7 +584,7 @@ int FCGI_puts(const char *str)
     }
     return EOF;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -591,7 +594,6 @@ int FCGI_puts(const char *str)
  *
  *----------------------------------------------------------------------
  */
-
 int FCGI_fprintf(FCGI_FILE *fp, const char *format, ...)
 {
     va_list ap;
@@ -614,7 +616,7 @@ int FCGI_printf(const char *format, ...)
     va_end(ap);
     return n;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -624,7 +626,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 +643,7 @@ int FCGI_vprintf(const char *format, va_list ap)
         return FCGX_VFPrintF(FCGI_stdout->fcgx_stream, format, ap);
     return EOF;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -652,7 +653,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 +682,7 @@ size_t FCGI_fwrite(void *ptr, size_t size, size_t nmemb, FCGI_FILE *fp)
     }
     return (size_t)EOF;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -722,7 +722,7 @@ void FCGI_clearerr(FCGI_FILE *fp)
     }
     return;
 }
-\f
+
 /*
  *----------------------------------------------------------------------
  *
@@ -734,10 +734,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;
 }
 
-\f
 /*
  *----------------------------------------------------------------------
  *
@@ -747,23 +752,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 +762,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 +799,3 @@ int FCGI_pclose(FCGI_FILE *fp)
     }
     return n;
 }
-
-/*
- *----------------------------------------------------------------------
- */