You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rb...@locus.apache.org on 2000/03/01 17:21:22 UTC

cvs commit: apache-2.0/src/modules/standard mod_cgi.c

rbb         00/03/01 08:21:22

  Modified:    src/lib/apr/file_io/unix pipe.c readwrite.c
               src/lib/apr/test Makefile.in
               src/main iol_file.c
               src/modules/standard mod_cgi.c
  Added:       src/lib/apr/test testpipe.c
  Log:
  Add a test program for pipes.  Add support for non-buffered CGI's to mod_cgi.
  This still doesn't terminate CGI's after a time limit, that's the next step.
  
  Revision  Changes    Path
  1.12      +1 -2      apache-2.0/src/lib/apr/file_io/unix/pipe.c
  
  Index: pipe.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/unix/pipe.c,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- pipe.c	2000/02/21 18:29:31	1.11
  +++ pipe.c	2000/03/01 16:21:14	1.12
  @@ -58,9 +58,8 @@
   static ap_status_t pipenonblock(struct file_t *thefile)
   {
   #ifndef BEOS /* this code won't work on BeOS */
  -    int fd_flags;
  +    int fd_flags = fcntl(thefile->filedes, F_GETFL, 0);
   
  -    fd_flags = fcntl(thefile->filedes, F_GETFL, 0);
   #if defined(O_NONBLOCK)
       fd_flags |= O_NONBLOCK;
   #elif defined(O_NDELAY)
  
  
  
  1.22      +5 -1      apache-2.0/src/lib/apr/file_io/unix/readwrite.c
  
  Index: readwrite.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/unix/readwrite.c,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- readwrite.c	2000/02/21 16:41:40	1.21
  +++ readwrite.c	2000/03/01 16:21:14	1.22
  @@ -119,7 +119,11 @@
           }  
       }  /* buffered? */
   
  -    if ((*nbytes != rv) && (errno != EINTR) && !thefile->buffered) {
  +    /* getting less data than requested does not signify an EOF when
  +       dealing with a pipe.
  +     */
  +    if ((*nbytes != rv) && ((errno == EPIPE && thefile->pipe == 1)
  +        || (errno != EINTR && !thefile->buffered && thefile->pipe == 0 ))) {
           thefile->eof_hit = 1;
       }
       *nbytes = rv;
  
  
  
  1.12      +5 -1      apache-2.0/src/lib/apr/test/Makefile.in
  
  Index: Makefile.in
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/lib/apr/test/Makefile.in,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- Makefile.in	2000/01/27 23:49:34	1.11
  +++ Makefile.in	2000/03/01 16:21:17	1.12
  @@ -23,7 +23,8 @@
   	ab@EXEEXT@ \
   	htdigest@EXEEXT@ \
   	testmmap@EXEEXT@ \
  -	testshmem@EXEEXT@
  +	testshmem@EXEEXT@ \
  +	testpipe@EXEEXT@
   
   OBJS= testfile.o \
   	testproc.o \
  @@ -75,6 +76,9 @@
   
   testshmem@EXEEXT@: testshmem.o
   	$(CC) $(CFLAGS) testshmem.o -o testshmem@EXEEXT@ $(LDFLAGS)
  +
  +testpipe@EXEEXT@: testpipe.o
  +	$(CC) $(CFLAGS) testpipe.o -o testpipe@EXEEXT@ $(LDFLAGS)
   
   clean:
   	$(RM) -f *.o *.a *.so $(TARGETS)
  
  
  
  1.1                  apache-2.0/src/lib/apr/test/testpipe.c
  
  Index: testpipe.c
  ===================================================================
  /* ====================================================================
   * Copyright (c) 1999 The Apache Group.  All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer. 
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. All advertising materials mentioning features or use of this
   *    software must display the following acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * 4. The names "Apache Server" and "Apache Group" must not be used to
   *    endorse or promote products derived from this software without
   *    prior written permission. For written permission, please contact
   *    apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * 6. Redistributions of any form whatsoever must retain the following
   *    acknowledgment:
   *    "This product includes software developed by the Apache Group
   *    for use in the Apache HTTP server project (http://www.apache.org/)."
   *
   * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE APACHE GROUP OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
   * OF THE POSSIBILITY OF SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Group.
   * For more information on the Apache Group and the Apache HTTP server
   * project, please see <http://www.apache.org/>.
   *
   */
  #include <stdio.h>
  #include "apr_file_io.h"
  #include "apr_errno.h"
  #include "apr_general.h"
  #include "apr_lib.h"
  #ifdef BEOS
  #include <unistd.h>
  #endif
  
  int test_filedel(ap_context_t *);
  int testdirs(ap_context_t *);
  
  int main()
  {
      ap_context_t *context;
      ap_file_t *readp = NULL;
      ap_file_t *writep = NULL;
      ap_status_t status = 0;
      ap_size_t nbytes;
      char *buf;
  
      if (ap_create_context(&context, NULL) != APR_SUCCESS) {
          fprintf(stderr, "Couldn't allocate context.");
          exit(-1);
      }
  
      fprintf(stdout, "Testing pipe functions.\n");
  
      fprintf(stdout, "\tCreating pipes.......");
      if (ap_create_pipe(&readp, &writep, context) != APR_SUCCESS) {
          perror("Didn't create the pipe");
          exit(-1);
      }
      else {
          fprintf(stdout, "OK\n");
      }
      
      fprintf(stdout, "\tSetting pipe timeout.......");
      if (ap_set_pipe_timeout(readp, 1) != APR_SUCCESS) {
          perror("Couldn't set a timeout");
          exit(-1);
      } else {
          fprintf(stdout, "OK\n");
      }        
  
      fprintf(stdout, "\tReading from the file.......");
      nbytes = (ap_ssize_t)strlen("this is a test");
      buf = (char *)ap_palloc(context, nbytes + 1);
      if (ap_read(readp, buf, &nbytes) == APR_TIMEUP) {
          fprintf(stdout, "OK\n");
      }
      else {
          fprintf(stdout, "The timeout didn't work  :-(\n");
          exit(-1);
      }
  
      return 1;
  }
  
  
  
  1.10      +8 -1      apache-2.0/src/main/iol_file.c
  
  Index: iol_file.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/iol_file.c,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- iol_file.c	2000/02/21 16:41:41	1.9
  +++ iol_file.c	2000/03/01 16:21:20	1.10
  @@ -115,7 +115,14 @@
   static ap_status_t file_setopt(ap_iol *viol, ap_iol_option opt,
                                  const void *value)
   {
  -    return APR_EINVAL;
  +    iol_file *iol = (iol_file *)viol;
  +
  +    switch (opt) {
  +    case AP_IOL_TIMEOUT:
  +        return ap_set_pipe_timeout(iol->file, *(const int*)value);
  +    default:
  +        return APR_EINVAL;
  +    }
   }
   
   static ap_status_t file_getopt(ap_iol *viol, ap_iol_option opt, void *value)
  
  
  
  1.29      +3 -3      apache-2.0/src/modules/standard/mod_cgi.c
  
  Index: mod_cgi.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_cgi.c,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- mod_cgi.c	2000/02/13 00:39:04	1.28
  +++ mod_cgi.c	2000/03/01 16:21:21	1.29
  @@ -331,9 +331,9 @@
        */
       if (((rc = ap_createprocattr_init(&procattr, p)) != APR_SUCCESS) ||
           ((rc = ap_setprocattr_io(procattr, 
  -                                 APR_FULL_BLOCK, 
  -                                 APR_FULL_BLOCK,
  -                                 APR_FULL_BLOCK)) != APR_SUCCESS) ||
  +                                 APR_CHILD_BLOCK, 
  +                                 APR_CHILD_BLOCK,
  +                                 APR_CHILD_BLOCK)) != APR_SUCCESS) ||
           ((rc = ap_setprocattr_dir(procattr, 
                                     ap_make_dirstr_parent(r->pool, r->filename))) != APR_SUCCESS) ||
           ((rc = ap_setprocattr_cmdtype(procattr, APR_PROGRAM)) != APR_SUCCESS)) {