httpd-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Roy Fielding <field...@hyperreal.org>
Subject cvs commit: apache/src CHANGES alloc.c buff.h http_protocol.c http_protocol.h mod_cgi.c util_script.c util_script.h
Date Mon, 14 Jul 1997 11:29:01 GMT
fielding    97/07/14 04:29:00

  Modified:    src       CHANGES alloc.c buff.h http_protocol.c
                        http_protocol.h  mod_cgi.c util_script.c
                        util_script.h
  Log:
  Removed "Make cgi unbuffered" changes of 1997/07/06
  
  Revision  Changes    Path
  1.335     +0 -3      apache/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /export/home/cvs/apache/src/CHANGES,v
  retrieving revision 1.334
  retrieving revision 1.335
  diff -C3 -r1.334 -r1.335
  *** CHANGES	1997/07/14 08:50:25	1.334
  --- CHANGES	1997/07/14 11:28:54	1.335
  ***************
  *** 37,45 ****
      *) mod_status: PID field of "dead" child slots no longer displays
         main httpd process's PID.
    
  -   *) CGI: Add a select() loop so that CGI scripts don't have to be
  -      nph in order to be "unbuffered". [Sameer Parekh]
  - 
      *) Makefile.nt added - to build all the bits from the command line:
            nmake -f Makefile.nt
    	 Doesn't yet work properly. [Ben Laurie]
  --- 37,42 ----
  
  
  
  1.39      +0 -192    apache/src/alloc.c
  
  Index: alloc.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/alloc.c,v
  retrieving revision 1.38
  retrieving revision 1.39
  diff -C3 -r1.38 -r1.39
  *** alloc.c	1997/07/13 19:01:07	1.38
  --- alloc.c	1997/07/14 11:28:54	1.39
  ***************
  *** 1060,1257 ****
    #define enc_pipe(fds) pipe(fds)
    #endif /* WIN32 */
    
  - 
  - API_EXPORT(int) spawn_child_err_buff (pool *p, int (*func)(void *), void *data,
  - 			  enum kill_conditions kill_how,
  - 			  BUFF **pipe_in, BUFF **pipe_out, BUFF **pipe_err)
  - {
  -   int pid;
  -   int in_fds[2];
  -   int out_fds[2];
  -   int err_fds[2];
  -   int save_errno;
  - 
  -   block_alarms();
  -   
  -   if (pipe_in && enc_pipe (in_fds) < 0)
  -   {
  -       save_errno = errno;
  -       unblock_alarms();
  -       errno = save_errno;
  -       return 0;
  -   }
  -   
  -   if (pipe_out && enc_pipe (out_fds) < 0) {
  -     save_errno = errno;
  -     if (pipe_in) {
  -       close (in_fds[0]); close (in_fds[1]);
  -     }
  -     unblock_alarms();
  -     errno = save_errno;
  -     return 0;
  -   }
  - 
  -   if (pipe_err && enc_pipe (err_fds) < 0) {
  -     save_errno = errno;
  -     if (pipe_in) {
  -       close (in_fds[0]); close (in_fds[1]);
  -     }
  -     if (pipe_out) {
  -       close (out_fds[0]); close (out_fds[1]);
  -     }
  -     unblock_alarms();
  -     errno = save_errno;
  -     return 0;
  -   }
  - 
  - #ifdef WIN32
  - 
  -   {
  -       HANDLE thread_handle;
  -       int hStdIn, hStdOut, hStdErr;
  -       int old_priority;
  -       
  -       (void)acquire_mutex(spawn_mutex);
  -       thread_handle = GetCurrentThread(); /* doesn't need to be closed */
  -       old_priority = GetThreadPriority(thread_handle);
  -       SetThreadPriority(thread_handle, THREAD_PRIORITY_HIGHEST);
  -       /* Now do the right thing with your pipes */
  -       if(pipe_in)
  -       {
  -           hStdIn = dup(fileno(stdin));
  -           dup2(in_fds[0], fileno(stdin));
  -           close(in_fds[0]);
  -       }
  -       if(pipe_out)
  -       {
  -           hStdOut = dup(fileno(stdout));
  -           dup2(out_fds[1], fileno(stdout));
  -           close(out_fds[1]);
  -       }
  -       if(pipe_err)
  -       {
  -           hStdErr = dup(fileno(stderr));
  -           dup2(err_fds[1], fileno(stderr));
  -           close(err_fds[1]);
  -       }
  - 
  -       pid = (*func)(data);
  -       if(!pid)
  -       {
  -           save_errno = errno;
  -           close(in_fds[1]);
  -           close(out_fds[0]);
  -           close(err_fds[0]);
  -       }
  - 
  -       /* restore the original stdin, stdout and stderr */
  -       if(pipe_in)
  -           dup2(hStdIn, fileno(stdin));
  -       if(pipe_out)
  -           dup2(hStdOut, fileno(stdout));
  -       if(pipe_err)
  -           dup2(hStdErr, fileno(stderr));
  - 
  -       if(pid)
  -       {
  -           note_subprocess(p, pid, kill_how);
  -           if(pipe_in)
  -           {
  -               *pipe_in = bcreate(p, B_WR);
  - 	      bpushfd(*pipe_in, in_fds[1], in_fds[1]);
  -           }
  -           if(pipe_out)
  -           {
  -               *pipe_out = bcreate(p, B_RD);
  - 	      bpushfd(*pipe_out, out_fds[0], out_fds[0]);
  -           }
  -           if(pipe_err)
  -           {
  -               *pipe_err = bcreate(p, B_RD);
  - 	      bpushfd(*pipe_err, err_fds[0], err_fds[0]);
  -           }
  -       }
  -       SetThreadPriority(thread_handle, old_priority);
  -       (void)release_mutex(spawn_mutex);
  -       /*
  -        * go on to the end of the function, where you can
  -        * unblock alarms and return the pid
  -        */
  - 
  -   }
  - #else
  - 
  -   if ((pid = fork()) < 0) {
  -     save_errno = errno;
  -     if (pipe_in) {
  -       close (in_fds[0]); close (in_fds[1]);
  -     }
  -     if (pipe_out) {
  -       close (out_fds[0]); close (out_fds[1]);
  -     }
  -     if (pipe_err) {
  -       close (err_fds[0]); close (err_fds[1]);
  -     }
  -     unblock_alarms();
  -     errno = save_errno;
  -     return 0;
  -   }
  - 
  -   if (!pid) {
  -     /* Child process */
  -     
  -     if (pipe_out) {
  -       close (out_fds[0]);
  -       dup2 (out_fds[1], STDOUT_FILENO);
  -       close (out_fds[1]);
  -     }
  - 
  -     if (pipe_in) {
  -       close (in_fds[1]);
  -       dup2 (in_fds[0], STDIN_FILENO);
  -       close (in_fds[0]);
  -     }
  - 
  -     if (pipe_err) {
  -       close (err_fds[0]);
  -       dup2 (err_fds[1], STDERR_FILENO);
  -       close (err_fds[1]);
  -     }
  - 
  -     /* HP-UX SIGCHLD fix goes here, if someone will remind me what it is... */
  -     signal (SIGCHLD, SIG_DFL);	/* Was that it? */
  -     
  -     func (data);
  -     exit (1);		/* Should only get here if the exec in func() failed */
  -   }
  - 
  -   /* Parent process */
  - 
  -   note_subprocess (p, pid, kill_how);
  -   
  -   if (pipe_out) {
  -     close (out_fds[1]);
  -     *pipe_out = bcreate(p, B_RD);
  -     bpushfd(*pipe_out, out_fds[0], out_fds[0]);
  -   }
  - 
  -   if (pipe_in) {
  -     close (in_fds[0]);
  -     *pipe_in = bcreate(p, B_WR);
  -     bpushfd(*pipe_in, in_fds[1], in_fds[1]);
  -   }
  - 
  -   if (pipe_err) {
  -     close (err_fds[1]);
  -     *pipe_err = bcreate(p, B_RD);
  -     bpushfd(*pipe_err, err_fds[0], err_fds[0]);
  -   }
  - #endif /* WIN32 */
  - 
  -   unblock_alarms();
  -   return pid;
  - }
  - 
    API_EXPORT(int) spawn_child_err (pool *p, int (*func)(void *), void *data,
    		     enum kill_conditions kill_how,
    		     FILE **pipe_in, FILE **pipe_out, FILE **pipe_err)
  --- 1060,1065 ----
  
  
  
  1.18      +0 -4      apache/src/buff.h
  
  Index: buff.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/buff.h,v
  retrieving revision 1.17
  retrieving revision 1.18
  diff -C3 -r1.17 -r1.18
  *** buff.h	1997/07/13 19:01:08	1.17
  --- buff.h	1997/07/14 11:28:54	1.18
  ***************
  *** 155,161 ****
    #define bputc(c, fb) ((((fb)->flags & (B_EOUT|B_WRERR|B_WR)) != B_WR || \
    		     (fb)->outcnt == (fb)->bufsiz) ? bflsbuf(c, (fb)) : \
    		     ((fb)->outbase[(fb)->outcnt++] = (c), 0))
  - 
  - API_EXPORT(int) spawn_child_err_buff (pool *, int (*)(void *), void *,
  -            	  enum kill_conditions, BUFF **pipe_in, BUFF **pipe_out,
  -                   BUFF **pipe_err);
  --- 155,157 ----
  
  
  
  1.136     +0 -76     apache/src/http_protocol.c
  
  Index: http_protocol.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_protocol.c,v
  retrieving revision 1.135
  retrieving revision 1.136
  diff -C3 -r1.135 -r1.136
  *** http_protocol.c	1997/07/14 08:50:26	1.135
  --- http_protocol.c	1997/07/14 11:28:55	1.136
  ***************
  *** 1524,1605 ****
    
        return (chunk_start + len_read);
    }
  - long send_fb_length(BUFF *fb, request_rec *r, long length)
  - {
  -     char buf[IOBUFSIZE];
  -     long total_bytes_sent;
  -     register int n, w, o;
  -     conn_rec *c = r->connection;
  -     
  -     if (length == 0) return 0;
  - 
  -     total_bytes_sent = 0;
  - 
  -     /* Clear out the buffer */
  -     if(fb->incnt != 0)
  -       {
  - 	int o;
  - 	o = bwrite(c->client, fb->inptr, fb->incnt);
  - 	fb->incnt -= o;
  - 	fb->inptr += o;
  - 	total_bytes_sent += o;
  -       }
  - 
  -     /* Make unbuffered */
  -     fb->flags &= ~B_RD;
  - 
  -     while(1)
  -       {
  - 	fd_set fds;
  - 
  - 	bflush(c->client);
  - 
  - 	FD_ZERO(&fds);
  - 	FD_SET(fb->fd_in, &fds);
  - 
  - 	select(FD_SETSIZE, &fds, NULL, NULL, NULL);
  - 
  - 	while((n = bread(fb, buf, IOBUFSIZE)) < 1
  - 	      && fb->flags & B_ERROR && errno == EINTR)
  - 	  continue;
  - 	
  - 	if (n < 1) {
  -             break;
  -         }
  -         o=0;
  - 	total_bytes_sent += n;
  - 
  -         while (n && !r->connection->aborted) {
  -             w = bwrite(r->connection->client, &buf[o], n);
  -             if (w > 0) {
  -                 reset_timeout(r); /* reset timeout after successful write */
  -                 n-=w;
  -                 o+=w;
  -             }
  -             else if (w < 0) {
  -                 if (r->connection->aborted)
  -                     break;
  -                 else if (errno == EAGAIN)
  -                     continue;
  -                 else {
  -                     log_unixerr("send body lost connection to",
  -                                 get_remote_host(r->connection,
  -                                     r->per_dir_config, REMOTE_NAME),
  -                                 NULL, r->server);
  -                     bsetflag(r->connection->client, B_EOUT, 1);
  -                     r->connection->aborted = 1;
  -                     break;
  -                 }
  -             }
  -         }
  -     }
  - 
  -     kill_timeout(r);
  -     SET_BYTES_SENT(r);
  -     return total_bytes_sent;
  - }
  - 
  - API_EXPORT(long) send_fb(BUFF *fb, request_rec *r) { return send_fb_length(fb, r, -1);
}
    
    long send_fd(FILE *f, request_rec *r) { return send_fd_length(f, r, -1); }
    
  --- 1524,1529 ----
  
  
  
  1.22      +0 -3      apache/src/http_protocol.h
  
  Index: http_protocol.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/http_protocol.h,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -C3 -r1.21 -r1.22
  *** http_protocol.h	1997/07/13 19:01:13	1.21
  --- http_protocol.h	1997/07/14 11:28:55	1.22
  ***************
  *** 110,118 ****
    
    long send_fd(FILE *f, request_rec *r);
    long send_fd_length(FILE *f, request_rec *r, long length);
  - 
  - API_EXPORT(long) send_fb(BUFF *f, request_rec *r);
  - long send_fb_length(BUFF *f, request_rec *r, long length);
         
    /* Hmmm... could macrofy these for now, and maybe forever, though the
     * definitions of the macros would get a whole lot hairier.
  --- 110,115 ----
  
  
  
  1.48      +47 -31    apache/src/mod_cgi.c
  
  Index: mod_cgi.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_cgi.c,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -C3 -r1.47 -r1.48
  *** mod_cgi.c	1997/07/14 02:38:04	1.47
  --- mod_cgi.c	1997/07/14 11:28:56	1.48
  ***************
  *** 183,189 ****
    }
    
    static int log_script(request_rec *r, cgi_server_conf *conf, int ret,
  ! 		    char *dbuf, char *sbuf, BUFF *script_in, BUFF *script_err)
    {
        table *hdrs_arr = r->headers_in;
        table_entry *hdrs = (table_entry *)hdrs_arr->elts;
  --- 183,189 ----
    }
    
    static int log_script(request_rec *r, cgi_server_conf *conf, int ret,
  ! 	       char *dbuf, char *sbuf, FILE *script_in, FILE *script_err)
    {
        table *hdrs_arr = r->headers_in;
        table_entry *hdrs = (table_entry *)hdrs_arr->elts;
  ***************
  *** 197,205 ****
    	((f = pfopen(r->pool, server_root_relative(r->pool, conf->logname),
    		     "a")) == NULL)) {
          /* Soak up script output */
  !       while (bgets(argsbuffer, HUGE_STRING_LEN, script_in))
    	continue;
  !       while (bgets(argsbuffer, HUGE_STRING_LEN, script_err))
    	continue;
          return ret;
        }
  --- 197,205 ----
    	((f = pfopen(r->pool, server_root_relative(r->pool, conf->logname),
    		     "a")) == NULL)) {
          /* Soak up script output */
  !       while (fgets(argsbuffer, HUGE_STRING_LEN-1, script_in))
    	continue;
  !       while (fgets(argsbuffer, HUGE_STRING_LEN-1, script_err))
    	continue;
          return ret;
        }
  ***************
  *** 207,213 ****
        /* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */
        fprintf(f, "%%%% [%s] %s %s%s%s %s\n", get_time(), r->method, r->uri,
    	    r->args ? "?" : "", r->args ? r->args : "", r->protocol);
  !     /* "%% 500 /usr/local/etc/httpd/cgi-bin" */
        fprintf(f, "%%%% %d %s\n", ret, r->filename);
    
        fputs("%request\n", f);
  --- 207,213 ----
        /* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */
        fprintf(f, "%%%% [%s] %s %s%s%s %s\n", get_time(), r->method, r->uri,
    	    r->args ? "?" : "", r->args ? r->args : "", r->protocol);
  !     /* "%% 500 /usr/local/etc/httpd/cgi-bin */
        fprintf(f, "%%%% %d %s\n", ret, r->filename);
    
        fputs("%request\n", f);
  ***************
  *** 216,222 ****
          fprintf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val);
        }
        if ((r->method_number == M_POST || r->method_number == M_PUT)
  ! 	&& *dbuf) {
          fprintf(f, "\n%s\n", dbuf);
        }
    
  --- 216,222 ----
          fprintf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val);
        }
        if ((r->method_number == M_POST || r->method_number == M_PUT)
  ! 	&& dbuf && *dbuf) {
          fprintf(f, "\n%s\n", dbuf);
        }
    
  ***************
  *** 233,259 ****
          fprintf(f, "%s\n", sbuf);
    
        *argsbuffer = '\0';
  !     bgets(argsbuffer, HUGE_STRING_LEN, script_in);
        if (*argsbuffer) {
          fputs("%stdout\n", f);
          fputs(argsbuffer, f);
  !       while (bgets(argsbuffer, HUGE_STRING_LEN, script_in))
    	fputs(argsbuffer, f);
          fputs("\n", f);
        }
    
        *argsbuffer = '\0';
  !     bgets(argsbuffer, HUGE_STRING_LEN, script_err);
        if (*argsbuffer) {
          fputs("%stderr\n", f);
          fputs(argsbuffer, f);
  !       while (bgets(argsbuffer, HUGE_STRING_LEN, script_err))
    	fputs(argsbuffer, f);
          fputs("\n", f);
        }
    
  !     bclose(script_in);
  !     bclose(script_err);
    
        pfclose(r->pool, f);
        return ret;
  --- 233,259 ----
          fprintf(f, "%s\n", sbuf);
    
        *argsbuffer = '\0';
  !     fgets(argsbuffer, HUGE_STRING_LEN-1, script_in);
        if (*argsbuffer) {
          fputs("%stdout\n", f);
          fputs(argsbuffer, f);
  !       while (fgets(argsbuffer, HUGE_STRING_LEN-1, script_in))
    	fputs(argsbuffer, f);
          fputs("\n", f);
        }
    
        *argsbuffer = '\0';
  !     fgets(argsbuffer, HUGE_STRING_LEN-1, script_err);
        if (*argsbuffer) {
          fputs("%stderr\n", f);
          fputs(argsbuffer, f);
  !       while (fgets(argsbuffer, HUGE_STRING_LEN-1, script_err))
    	fputs(argsbuffer, f);
          fputs("\n", f);
        }
    
  !     pfclose(r->main ? r->main->pool : r->pool, script_in);
  !     pfclose(r->main ? r->main->pool : r->pool, script_err);
    
        pfclose(r->pool, f);
        return ret;
  ***************
  *** 277,282 ****
  --- 277,283 ----
        struct cgi_child_stuff *cld = (struct cgi_child_stuff *)child_stuff;
        request_rec *r = cld->r;
        char *argv0 = cld->argv0;
  +     int nph = cld->nph;
        int child_pid;
    
    #ifdef DEBUG_CGI    
  ***************
  *** 311,316 ****
  --- 312,321 ----
        if (!cld->debug)
          error_log2stderr (r->server);
    
  + #if !defined(__EMX__) && !defined(WIN32)
  +     if (nph) client_to_stdout (r->connection);
  + #endif    
  + 
        /* Transumute outselves into the script.
         * NB only ISINDEX scripts get decoded arguments.
         */
  ***************
  *** 347,353 ****
    {
        int retval, nph, dbpos = 0;
        char *argv0, *dbuf = NULL;
  !     BUFF *script_out, *script_in, *script_err;
        char argsbuffer[HUGE_STRING_LEN];
        int is_included = !strcmp (r->protocol, "INCLUDED");
        void *sconf = r->server->module_config;
  --- 352,358 ----
    {
        int retval, nph, dbpos = 0;
        char *argv0, *dbuf = NULL;
  !     FILE *script_out, *script_in, *script_err;
        char argsbuffer[HUGE_STRING_LEN];
        int is_included = !strcmp (r->protocol, "INCLUDED");
        void *sconf = r->server->module_config;
  ***************
  *** 416,425 ****
    	   * waiting for free_proc_chain to cleanup in the middle of an
    	   * SSI request -djg
    	   */
  ! 	  spawn_child_err_buff (r->main ? r->main->pool : r->pool, cgi_child,
  ! 				(void *)&cld,
  ! 				kill_after_timeout,
  ! 				&script_out, &script_in, &script_err))) {
            log_reason ("couldn't spawn child process", r->filename, r);
            return SERVER_ERROR;
        }
  --- 421,435 ----
    	   * waiting for free_proc_chain to cleanup in the middle of an
    	   * SSI request -djg
    	   */
  ! 	  spawn_child_err (r->main ? r->main->pool : r->pool, cgi_child,
  ! 			    (void *)&cld,
  ! 			   nph ? just_wait : kill_after_timeout,
  ! #if defined(__EMX__) || defined(WIN32)
  ! 			   &script_out, &script_in, &script_err))) {
  ! #else
  ! 			   &script_out, nph ? NULL : &script_in,
  ! 	    		   &script_err))) {
  ! #endif
            log_reason ("couldn't spawn child process", r->filename, r);
            return SERVER_ERROR;
        }
  ***************
  *** 461,467 ****
    		dbpos += dbsize;
    	    }
    	    reset_timeout(r);
  ! 	    if (bwrite(script_out, argsbuffer, len_read)
    	            < (size_t)len_read) {
    	        /* silly script stopped reading, soak up remaining message */
    	        while (get_client_block(r, argsbuffer, HUGE_STRING_LEN) > 0)
  --- 471,477 ----
    		dbpos += dbsize;
    	    }
    	    reset_timeout(r);
  ! 	    if (fwrite(argsbuffer, sizeof(char), len_read, script_out)
    	            < (size_t)len_read) {
    	        /* silly script stopped reading, soak up remaining message */
    	        while (get_client_block(r, argsbuffer, HUGE_STRING_LEN) > 0)
  ***************
  *** 470,489 ****
    	    }
    	}
    
  ! 	bflush (script_out);
    	signal (SIGPIPE, handler);
    	
    	kill_timeout (r);
        }
        
  !     bclose(script_out);
        
        /* Handle script return... */
        if (script_in && !nph) {
            char *location, sbuf[MAX_STRING_LEN];
    	int ret;
          
  !         if ((ret = scan_script_header_err_buff(r, script_in, sbuf)))
    	    return log_script(r, conf, ret, dbuf, sbuf, script_in, script_err);
    	
    	location = table_get (r->headers_out, "Location");
  --- 480,499 ----
    	    }
    	}
    
  ! 	fflush (script_out);
    	signal (SIGPIPE, handler);
    	
    	kill_timeout (r);
        }
        
  !     pfclose (r->main ? r->main->pool : r->pool, script_out);
        
        /* Handle script return... */
        if (script_in && !nph) {
            char *location, sbuf[MAX_STRING_LEN];
    	int ret;
          
  !         if ((ret = scan_script_header_err(r, script_in, sbuf)))
    	    return log_script(r, conf, ret, dbuf, sbuf, script_in, script_err);
    	
    	location = table_get (r->headers_out, "Location");
  ***************
  *** 492,500 ****
    	  
    	    /* Soak up all the script output */
    	    hard_timeout ("read from script", r);
  ! 	    while (bgets(argsbuffer, HUGE_STRING_LEN, script_in))
    	        continue;
  ! 	    while (bgets(argsbuffer, HUGE_STRING_LEN, script_err))
    	        continue;
    	    kill_timeout (r);
    
  --- 502,512 ----
    	  
    	    /* Soak up all the script output */
    	    hard_timeout ("read from script", r);
  ! 	    while (fread(argsbuffer, sizeof(char), HUGE_STRING_LEN, script_in)
  ! 	           > 0)
    	        continue;
  ! 	    while (fread(argsbuffer, sizeof(char), HUGE_STRING_LEN, script_err)
  ! 	           > 0)
    	        continue;
    	    kill_timeout (r);
    
  ***************
  *** 523,542 ****
    	
    	send_http_header(r);
    	if (!r->header_only)
  ! 	    send_fb(script_in, r);
    
    	soft_timeout("soaking script stderr", r);
  ! 	while(bgets(argsbuffer, HUGE_STRING_LEN, script_err))
  ! 	      continue;
    	kill_timeout(r);
  ! 	     
  ! 	bclose(script_in);
  ! 	bclose(script_out);
        }
    
  !     if (script_in && nph) {
  !       send_fb(script_in, r);
  ! #if !defined(__EMX__) && !defined(WIN32)
    	waitpid(child_pid, (int*)0, 0);
    #endif
        }    
  --- 535,558 ----
    	
    	send_http_header(r);
    	if (!r->header_only)
  ! 	    send_fd(script_in, r);
  ! 	pfclose (r->main ? r->main->pool : r->pool, script_in);
    
  + 	/* Soak up stderr */
    	soft_timeout("soaking script stderr", r);
  ! 	while (!r->connection->aborted &&
  ! 	  (fread(argsbuffer, sizeof(char), HUGE_STRING_LEN, script_err) > 0))
  ! 	    continue;
    	kill_timeout(r);
  ! 	pfclose (r->main ? r->main->pool : r->pool, script_err);
        }
    
  !     if (nph) {
  ! #if defined(__EMX__) || defined(WIN32)
  !         while (fgets(argsbuffer, HUGE_STRING_LEN-1, script_in) != NULL) {
  !             bputs(argsbuffer, r->connection->client);
  !         }
  ! #else
    	waitpid(child_pid, (int*)0, 0);
    #endif
        }    
  
  
  
  1.65      +0 -89     apache/src/util_script.c
  
  Index: util_script.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/util_script.c,v
  retrieving revision 1.64
  retrieving revision 1.65
  diff -C3 -r1.64 -r1.65
  *** util_script.c	1997/07/13 19:01:16	1.64
  --- util_script.c	1997/07/14 11:28:56	1.65
  ***************
  *** 312,406 ****
        }
    }
    
  - API_EXPORT(int) scan_script_header_err_buff(request_rec *r, BUFF *fb, char *buffer)
  - {
  -     char x[MAX_STRING_LEN];
  -     char *w, *l;
  -     int p;
  - 
  -     if (buffer) *buffer = '\0';
  -     w = buffer ? buffer : x;
  - 
  -     hard_timeout ("read script header", r);
  -     
  -     while(1) {
  - 
  - 	if (bgets(w, MAX_STRING_LEN-1, fb) <= 0) {
  - 	    log_reason ("Premature end of script headers", r->filename, r);
  - 	    return SERVER_ERROR;
  -         }
  - 
  - 	/* Delete terminal (CR?)LF */
  - 	
  - 	p = strlen(w);
  - 	if (p > 0 && w[p-1] == '\n')
  - 	{
  - 	    if (p > 1 && w[p-2] == '\015') w[p-2] = '\0';
  - 	    else w[p-1] = '\0';
  - 	}
  - 
  -         if(w[0] == '\0') {
  - 	    kill_timeout (r);
  - 	    return OK;
  - 	}
  -                                    
  - 	/* if we see a bogus header don't ignore it. Shout and scream */
  - 	
  -         if(!(l = strchr(w,':'))) {
  - 	    char malformed[(sizeof MALFORMED_MESSAGE)+1+MALFORMED_HEADER_LENGTH_TO_SHOW];
  -             strcpy(malformed, MALFORMED_MESSAGE);
  -             strncat(malformed, w, MALFORMED_HEADER_LENGTH_TO_SHOW);
  - 
  - 	    if (!buffer)
  - 	      /* Soak up all the script output --- may save an outright kill */
  - 	      while (bgets(w, MAX_STRING_LEN-1, fb) <= 0)
  - 		continue;
  - 	    
  - 	    kill_timeout (r);
  - 	    log_reason (malformed, r->filename, r);
  - 	    return SERVER_ERROR;
  -         }
  - 
  -         *l++ = '\0';
  - 	while (*l && isspace (*l)) ++l;
  - 	
  -         if(!strcasecmp(w,"Content-type")) {
  - 
  - 	    /* Nuke trailing whitespace */
  - 	    
  - 	    char *endp = l + strlen(l) - 1;
  - 	    while (endp > l && isspace(*endp)) *endp-- = '\0';
  - 	    
  - 	    r->content_type = pstrdup (r->pool, l);
  - 	}
  -         else if(!strcasecmp(w,"Status")) {
  -             sscanf(l, "%d", &r->status);
  -             r->status_line = pstrdup(r->pool, l);
  -         }
  -         else if(!strcasecmp(w,"Location")) {
  - 	    table_set (r->headers_out, w, l);
  -         }   
  -         else if(!strcasecmp(w,"Content-Length")) {
  - 	    table_set (r->headers_out, w, l);
  -         }   
  -         else if(!strcasecmp(w,"Transfer-Encoding")) {
  - 	    table_set (r->headers_out, w, l);
  -         }   
  - 
  - /* The HTTP specification says that it is legal to merge duplicate
  -  * headers into one.  Some browsers that support Cookies don't like
  -  * merged headers and prefer that each Set-Cookie header is sent
  -  * separately.  Lets humour those browsers.
  -  */
  - 	else if(!strcasecmp(w, "Set-Cookie")) {
  - 	    table_add(r->err_headers_out, w, l);
  - 	}
  -         else {
  - 	    table_merge (r->err_headers_out, w, l);
  -         }
  -     }
  - }
  - 
    int scan_script_header_err(request_rec *r, FILE *f, char *buffer)
    {
        char x[MAX_STRING_LEN];
  --- 312,317 ----
  
  
  
  1.20      +0 -1      apache/src/util_script.h
  
  Index: util_script.h
  ===================================================================
  RCS file: /export/home/cvs/apache/src/util_script.h,v
  retrieving revision 1.19
  retrieving revision 1.20
  diff -C3 -r1.19 -r1.20
  *** util_script.h	1997/07/13 19:01:17	1.19
  --- util_script.h	1997/07/14 11:28:56	1.20
  ***************
  *** 64,70 ****
    API_EXPORT(void) add_common_vars(request_rec *r);
    #define scan_script_header(a1,a2) scan_script_header_err(a1,a2,NULL)
    int scan_script_header_err(request_rec *r, FILE *f, char *buffer);
  - API_EXPORT(int) scan_script_header_err_buff(request_rec *r, BUFF *f, char *buffer);
    void send_size(size_t size, request_rec *r);
    API_EXPORT(int) call_exec (request_rec *r, char *argv0, char **env, int shellcmd);
    
  --- 64,69 ----
  
  
  

Mime
View raw message