]> granicus.if.org Git - apache/blobdiff - modules/generators/mod_cgid.c
very minor tweaks:
[apache] / modules / generators / mod_cgid.c
index 5d3c4e7006e5be4aeacf336e5b2f78fc2e151c61..c279b30e8fa2cb7f99ea684ccad50c9de17462e5 100644 (file)
 
 module AP_MODULE_DECLARE_DATA cgid_module; 
 
-static void cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_server); 
+static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_server); 
 static int handle_exec(include_ctx_t *ctx, apr_bucket_brigade **bb, request_rec *r,
                        ap_filter_t *f, apr_bucket *head_ptr, apr_bucket **inserted_head);
 
@@ -505,11 +505,11 @@ static int cgid_server(void *data)
         char *argv0; 
         char **env; 
         const char * const *argv; 
-        apr_int32_t   in_pipe  = APR_CHILD_BLOCK;
-        apr_int32_t   out_pipe = APR_CHILD_BLOCK;
-        apr_int32_t   err_pipe = APR_CHILD_BLOCK;
-        apr_cmdtype_e cmd_type = APR_PROGRAM;
-        request_rec *r; 
+        apr_int32_t in_pipe;
+        apr_int32_t out_pipe;
+        apr_int32_t err_pipe;
+        apr_cmdtype_e cmd_type;
+        request_rec *r;
         apr_procattr_t *procattr = NULL;
         apr_proc_t *procnew = NULL;
         apr_file_t *inout;
@@ -522,7 +522,7 @@ static int cgid_server(void *data)
             if (errno != EINTR) {
                 ap_log_error(APLOG_MARK, APLOG_ERR, errno, 
                              (server_rec *)data,
-                             "Error accepting on cgid socket.");
+                             "Error accepting on cgid socket");
             }
             continue;
         }
@@ -540,6 +540,12 @@ static int cgid_server(void *data)
             err_pipe = APR_NO_PIPE;
             cmd_type = APR_SHELLCMD;
         }
+        else {
+            in_pipe  = APR_CHILD_BLOCK;
+            out_pipe = APR_CHILD_BLOCK;
+            err_pipe = APR_CHILD_BLOCK;
+            cmd_type = APR_PROGRAM;
+        }
 
         if (((rc = apr_procattr_create(&procattr, ptrans)) != APR_SUCCESS) ||
             ((req_type == CGI_REQ) && 
@@ -564,8 +570,8 @@ static int cgid_server(void *data)
         else {
             argv = (const char * const *)create_argv(r->pool, NULL, NULL, NULL, argv0, r->args);
 
-           /* We want to sd2 close for new CGI process too.
-            * If it's remained open it'll make ap_pass_brigade() block
+           /* We want to close sd2 for the new CGI process too.
+            * If it is left open it'll make ap_pass_brigade() block
             * waiting for EOF if CGI forked something running long.
             * close(sd2) here should be okay, as CGI channel
             * is already dup()ed by apr_procattr_child_{in,out}_set()
@@ -587,7 +593,7 @@ static int cgid_server(void *data)
     return -1; 
 } 
 
-static void cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, 
+static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, 
                       server_rec *main_server) 
 { 
     pid_t pid; 
@@ -609,10 +615,10 @@ static void cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,
         for (m = ap_preloaded_modules; *m != NULL; m++)
             total_modules++;
 
-
         if ((pid = fork()) < 0) {
             ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, 
                          "Couldn't spawn cgid daemon process"); 
+            /* XXX should we return a failure here ? */
         }
         else if (pid == 0) {
             apr_pool_create(&pcgi, p); 
@@ -638,6 +644,7 @@ static void cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp,
             cgid_pfn_reg_with_ssi("exec", handle_exec);
         }
     }
+    return OK;
 } 
 
 static void *create_cgid_config(apr_pool_t *p, server_rec *s) 
@@ -749,8 +756,8 @@ static int log_scripterror(request_rec *r, cgid_server_conf * conf, int ret,
 static int log_script(request_rec *r, cgid_server_conf * conf, int ret, 
                   char *dbuf, const char *sbuf, apr_file_t *script_in, apr_file_t *script_err) 
 { 
-    apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); 
-    apr_table_entry_t *hdrs = (apr_table_entry_t *) hdrs_arr->elts; 
+    const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); 
+    const apr_table_entry_t *hdrs = (apr_table_entry_t *) hdrs_arr->elts; 
     char argsbuffer[HUGE_STRING_LEN]; 
     apr_file_t *f = NULL; 
     int i; 
@@ -764,10 +771,12 @@ static int log_script(request_rec *r, cgid_server_conf * conf, int ret,
          (apr_file_open(&f, conf->logname, 
                   APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT, r->pool) != APR_SUCCESS)) { 
         /* Soak up script output */ 
-        while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_in) == 0) 
+        while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, 
+                             script_in) == APR_SUCCESS) 
             continue; 
         if (script_err) {
-            while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_err) == 0) 
+            while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, 
+                                 script_err) == APR_SUCCESS) 
                 continue; 
         }
         return ret; 
@@ -793,7 +802,7 @@ static int log_script(request_rec *r, cgid_server_conf * conf, int ret,
 
     apr_file_puts("%response\n", f); 
     hdrs_arr = apr_table_elts(r->err_headers_out); 
-    hdrs = (apr_table_entry_t *) hdrs_arr->elts; 
+    hdrs = (const apr_table_entry_t *) hdrs_arr->elts; 
 
     for (i = 0; i < hdrs_arr->nelts; ++i) { 
         if (!hdrs[i].key) 
@@ -804,19 +813,22 @@ static int log_script(request_rec *r, cgid_server_conf * conf, int ret,
     if (sbuf && *sbuf) 
         apr_file_printf(f, "%s\n", sbuf); 
 
-    if (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_in) == 0) { 
+    if (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_in) == APR_SUCCESS) { 
         apr_file_puts("%stdout\n", f); 
         apr_file_puts(argsbuffer, f); 
-        while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_in) == 0) 
+        while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, 
+                             script_in) == APR_SUCCESS) 
             apr_file_puts(argsbuffer, f); 
         apr_file_puts("\n", f); 
     } 
 
     if (script_err) {
-        if (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_err) == 0) { 
+        if (apr_file_gets(argsbuffer, HUGE_STRING_LEN, 
+                          script_err) == APR_SUCCESS) { 
             apr_file_puts("%stderr\n", f); 
             apr_file_puts(argsbuffer, f); 
-            while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_err) == 0) 
+            while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, 
+                                 script_err) == APR_SUCCESS) 
                 apr_file_puts(argsbuffer, f); 
             apr_file_puts("\n", f); 
         } 
@@ -990,7 +1002,8 @@ static int cgid_handler(request_rec *r)
         if (location && location[0] == '/' && r->status == 200) { 
 
             /* Soak up all the script output */ 
-            while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, tempsock) > 0) { 
+            while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, 
+                                 tempsock) == APR_SUCCESS) { 
                 continue; 
             } 
             /* This redirect needs to be a GET no matter what the original 
@@ -1086,20 +1099,26 @@ static int include_cgi(char *s, request_rec *r, ap_filter_t *next,
 
     rr_status = ap_run_sub_req(rr);
     if (ap_is_HTTP_REDIRECT(rr_status)) {
-        apr_size_t len_loc, h_wrt;
+        apr_size_t len_loc;
         const char *location = apr_table_get(rr->headers_out, "Location");
 
         location = ap_escape_html(rr->pool, location);
         len_loc = strlen(location);
 
+        /* XXX: if most of this stuff is going to get copied anyway,
+         * it'd be more efficient to pstrcat it into a single pool buffer
+         * and a single pool bucket */
+
         tmp_buck = apr_bucket_immortal_create("<A HREF=\"", sizeof("<A HREF=\""));
         APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck);
-        tmp2_buck = apr_bucket_heap_create(location, len_loc, 1, &h_wrt);
+        tmp2_buck = apr_bucket_heap_create(location, len_loc, 1);
         APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck);
+        /* XXX: this looks like a bug: should be sizeof - 1 */
         tmp2_buck = apr_bucket_immortal_create("\">", sizeof("\">"));
         APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck);
-        tmp2_buck = apr_bucket_heap_create(location, len_loc, 1, &h_wrt);
+        tmp2_buck = apr_bucket_heap_create(location, len_loc, 1);
         APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck);
+        /* XXX: this looks like a bug: should be sizeof - 1 */
         tmp2_buck = apr_bucket_immortal_create("</A>", sizeof("</A>"));
         APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck);
 
@@ -1196,7 +1215,8 @@ static int include_cmd(include_ctx_t *ctx, apr_bucket_brigade **bb, char *comman
         char argsbuffer[HUGE_STRING_LEN]; 
 
         /* Soak up all the script output */ 
-        while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, tempsock) > 0) { 
+        while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, 
+                             tempsock) == APR_SUCCESS) { 
             continue; 
         } 
         /* This redirect needs to be a GET no matter what the original