httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Brad Nicholes" <BNICHO...@novell.com>
Subject Re: [PATCH] - Add a "detached" parameter to ap_cgi_build_command() for CGI...
Date Wed, 05 Jun 2002 19:49:24 GMT
   I took the build parameters and put them into a cgi_exec_info_t
structure that is passed to the build_command function.  This cleans up
the parameter list.

Brad
 
--- \tempapache\httpd-2.0\modules\generators\mod_cgi.h	Wed Apr 17
08:18:42 2002
+++ mod_cgi.h	Wed Jun 05 13:18:52 2002
@@ -59,7 +59,23 @@
 #ifndef _MOD_CGI_H
 #define _MOD_CGI_H 1
 
+#include "../filters/mod_include.h"
 
+typedef enum {RUN_AS_SSI, RUN_AS_CGI} prog_types;
+
+typedef struct {
+    apr_int32_t          in_pipe;
+    apr_int32_t          out_pipe;
+    apr_int32_t          err_pipe;
+    int                  process_cgi;
+    apr_cmdtype_e        cmd_type;
+    apr_int32_t          detached;
+    prog_types           prog_type;
+    apr_bucket_brigade **bb;
+    include_ctx_t       *ctx;
+    ap_filter_t         *next;
+} cgi_exec_info_t;
+
 /**
  * Registerable optional function to override CGI behavior;
  * Reprocess the command and arguments to execute the given CGI
script.
@@ -71,6 +87,7 @@
  *                    as a CGI invocation, otherwise false
  * @param type Set to APR_SHELLCMD or APR_PROGRAM on entry, may be
  *             changed to invoke the program with alternate
semantics.
+ * @param detach Should the child start in detached state?  Default is
no. 
  * @remark This callback may be registered by the os-specific module 
  * to correct the command and arguments for apr_proc_create
invocation
  * on a given os.  mod_cgi will call the function if registered.
@@ -78,6 +95,6 @@
 APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_cgi_build_command, 
                         (const char **cmd, const char ***argv,
                          request_rec *r, apr_pool_t *p, 
-                         int process_cgi, apr_cmdtype_e *type));
+                         cgi_exec_info_t *e_info));
 
 #endif /* _MOD_CGI_H */

--- \tempapache\httpd-2.0\modules\generators\mod_cgi.c	Thu May 30
08:49:40 2002
+++ mod_cgi.c	Wed Jun 05 13:15:11 2002
@@ -93,7 +93,6 @@
 #include "util_script.h"
 #include "ap_mpm.h"
 #include "mod_core.h"
-#include "../filters/mod_include.h"
 #include "mod_cgi.h"
 
 module AP_MODULE_DECLARE_DATA cgi_module;
@@ -103,19 +102,6 @@
 static APR_OPTIONAL_FN_TYPE(ap_ssi_parse_string) *cgi_pfn_ps;
 static APR_OPTIONAL_FN_TYPE(ap_cgi_build_command) *cgi_build_command;
 
-typedef enum {RUN_AS_SSI, RUN_AS_CGI} prog_types;
-
-typedef struct {
-    apr_int32_t          in_pipe;
-    apr_int32_t          out_pipe;
-    apr_int32_t          err_pipe;
-    apr_cmdtype_e        cmd_type;
-    prog_types           prog_type;
-    apr_bucket_brigade **bb;
-    include_ctx_t       *ctx;
-    ap_filter_t         *next;
-} exec_info;
-
 /* Read and discard the data in the brigade produced by a CGI script
*/
 static void discard_script_output(apr_bucket_brigade *bb);
 
@@ -401,7 +387,7 @@
                                   const char * const argv[],
                                   request_rec *r,
                                   apr_pool_t *p,
-                                  exec_info *e_info)
+                                  cgi_exec_info_t *e_info)
 {
     const char * const *env;
     apr_procattr_t *procattr;
@@ -471,7 +457,10 @@
                                       conf->limit_nproc)) !=
APR_SUCCESS) ||
 #endif
         ((rc = apr_procattr_cmdtype_set(procattr,
-                                        e_info->cmd_type)) !=
APR_SUCCESS)) {
+                                        e_info->cmd_type)) !=
APR_SUCCESS) ||
+
+        ((rc = apr_procattr_detach_set(procattr,
+                                        e_info->detached)) !=
APR_SUCCESS)) {
         /* Something bad happened, tell the world. */
         ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r,
                       "couldn't set child process attributes: %s",
r->filename);
@@ -530,13 +519,13 @@
 
 static apr_status_t default_build_command(const char **cmd, const char
***argv,
                                           request_rec *r, apr_pool_t
*p,
-                                          int process_cgi,
apr_cmdtype_e * type)
+                                          cgi_exec_info_t *e_info)
 {
     int numwords, x, idx;
     char *w;
     const char *args = NULL;
 
-    if (process_cgi) {
+    if (e_info->process_cgi) {
         /* Allow suexec's "/" check to succeed */
         const char *argv0 = strrchr(r->filename, '/');
         if (argv0 != NULL)
@@ -613,7 +602,7 @@
     apr_pool_t *p;
     cgi_server_conf *conf;
     apr_status_t rv;
-    exec_info e_info;
+    cgi_exec_info_t e_info;
 
     if(strcmp(r->handler, CGI_MAGIC_TYPE) && strcmp(r->handler,
"cgi-script"))
         return DECLINED;
@@ -664,18 +653,19 @@
 */
     ap_add_common_vars(r);
 
-    e_info.cmd_type  = APR_PROGRAM;
-    e_info.in_pipe   = APR_CHILD_BLOCK;
-    e_info.out_pipe  = APR_CHILD_BLOCK;
-    e_info.err_pipe  = APR_CHILD_BLOCK;
-    e_info.prog_type = RUN_AS_CGI;
-    e_info.bb        = NULL;
-    e_info.ctx       = NULL;
-    e_info.next      = NULL;
+    e_info.process_cgi = 1;
+    e_info.cmd_type    = APR_PROGRAM;
+    e_info.detached    = 0;
+    e_info.in_pipe     = APR_CHILD_BLOCK;
+    e_info.out_pipe    = APR_CHILD_BLOCK;
+    e_info.err_pipe    = APR_CHILD_BLOCK;
+    e_info.prog_type   = RUN_AS_CGI;
+    e_info.bb          = NULL;
+    e_info.ctx         = NULL;
+    e_info.next        = NULL;
 
     /* build the command line */
-    if ((rv = cgi_build_command(&command, &argv, r, p, 1,
&e_info.cmd_type)) 
-            != APR_SUCCESS) {
+    if ((rv = cgi_build_command(&command, &argv, r, p, &e_info)) !=
APR_SUCCESS) {
         ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                       "don't know how to spawn child process: %s", 
                       r->filename);
@@ -932,24 +922,25 @@
 static int include_cmd(include_ctx_t *ctx, apr_bucket_brigade **bb,
                        const char *command, request_rec *r,
ap_filter_t *f)
 {
-    exec_info      e_info;
+    cgi_exec_info_t  e_info;
     const char   **argv;
     apr_file_t    *script_out = NULL, *script_in = NULL, *script_err =
NULL;
     apr_bucket_brigade *bcgi;
     apr_bucket *b;
     apr_status_t rv;
 
-    e_info.cmd_type  = APR_SHELLCMD;
-    e_info.in_pipe   = APR_NO_PIPE;
-    e_info.out_pipe  = APR_FULL_BLOCK;
-    e_info.err_pipe  = APR_NO_PIPE;
-    e_info.prog_type = RUN_AS_SSI;
-    e_info.bb        = bb;
-    e_info.ctx       = ctx;
-    e_info.next      = f->next;
+    e_info.process_cgi = 0;
+    e_info.cmd_type    = APR_SHELLCMD;
+    e_info.detached    = 0;
+    e_info.in_pipe     = APR_NO_PIPE;
+    e_info.out_pipe    = APR_FULL_BLOCK;
+    e_info.err_pipe    = APR_NO_PIPE;
+    e_info.prog_type   = RUN_AS_SSI;
+    e_info.bb          = bb;
+    e_info.ctx         = ctx;
+    e_info.next        = f->next;
 
-    if ((rv = cgi_build_command(&command, &argv, r, r->pool, 0,
-                                &e_info.cmd_type)) != APR_SUCCESS) {
+    if ((rv = cgi_build_command(&command, &argv, r, r->pool, &e_info))
!= APR_SUCCESS) {
         ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
                       "don't know how to spawn cmd child process: %s",

                       r->filename);


Brad Nicholes
Senior Software Engineer
Novell, Inc., a leading provider of Net business solutions
http://www.novell.com 

>>> wrowe@rowe-clan.net Wednesday, June 05, 2002 11:41:42 AM >>>
Although win32 shares the same issue...  still...  ick...

Suppose it is time that we stuff the exec_info (renamed ap_exec_info_t)
in 
place
of the apr_cmdtype_e, and allow the ap_cgi_build_command() integrator
to modify
any of the flags/fields in that structure?

Bill

At 12:10 PM 6/5/2002, Brad Nicholes wrote:
>     This patch adds the "detached" parameter to the
>ap_cgi_build_command() optional function.  This allows the OS to
specify
>whether the CGI binary should be spawned detached or not. 
Specifically
>for NetWare this allows us to determine wheither a CGI NLM should be
>executed in the same address space as Apache or a new address space.
>
>Brad
>


Mime
View raw message