View | Details | Raw Unified | Return to bug 19849
Collapse All | Expand All

(-)mod_cgid.c.orig (-35 / +63 lines)
Lines 117-122 Link Here
117
117
118
module AP_MODULE_DECLARE_DATA cgid_module; 
118
module AP_MODULE_DECLARE_DATA cgid_module; 
119
119
120
static int cgid_start(apr_pool_t *p, server_rec *main_server, apr_proc_t *procnew);
120
static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_server); 
121
static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_server); 
121
static int handle_exec(include_ctx_t *ctx, apr_bucket_brigade **bb, request_rec *r,
122
static int handle_exec(include_ctx_t *ctx, apr_bucket_brigade **bb, request_rec *r,
122
                       ap_filter_t *f, apr_bucket *head_ptr, apr_bucket **inserted_head);
123
                       ap_filter_t *f, apr_bucket *head_ptr, apr_bucket **inserted_head);
Lines 125-134 Link Here
125
static APR_OPTIONAL_FN_TYPE(ap_ssi_get_tag_and_value) *cgid_pfn_gtv;
126
static APR_OPTIONAL_FN_TYPE(ap_ssi_get_tag_and_value) *cgid_pfn_gtv;
126
static APR_OPTIONAL_FN_TYPE(ap_ssi_parse_string) *cgid_pfn_ps;
127
static APR_OPTIONAL_FN_TYPE(ap_ssi_parse_string) *cgid_pfn_ps;
127
128
128
static apr_pool_t *pcgi; 
129
static apr_pool_t *pcgi = NULL; 
129
static int total_modules = 0;
130
static int total_modules = 0;
130
static pid_t daemon_pid;
131
static pid_t daemon_pid;
131
static int daemon_should_exit = 0;
132
static int daemon_should_exit = 0;
133
static server_rec *root_server = NULL;
134
static apr_pool_t *root_pool = NULL;
132
135
133
/* Read and discard the data in the brigade produced by a CGI script */
136
/* Read and discard the data in the brigade produced by a CGI script */
134
static void discard_script_output(apr_bucket_brigade *bb);
137
static void discard_script_output(apr_bucket_brigade *bb);
Lines 267-293 Link Here
267
#if APR_HAS_OTHER_CHILD
270
#if APR_HAS_OTHER_CHILD
268
static void cgid_maint(int reason, void *data, apr_wait_t status)
271
static void cgid_maint(int reason, void *data, apr_wait_t status)
269
{
272
{
270
    pid_t *sd = data;
273
    apr_proc_t *proc = data;
271
274
272
    switch (reason) {
275
    switch (reason) {
273
        case APR_OC_REASON_DEATH:
276
        case APR_OC_REASON_DEATH:
277
            apr_proc_other_child_unregister(data);
278
            /* If apache is not terminating or restarting,
279
             * restart the cgid daemon
280
             */
281
            if (!ap_graceful_stop_signalled()) {
282
                 ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL,
283
                              "cgid daemon process died, restarting");
284
               cgid_start(root_pool, root_server, proc);
285
            }
286
            break;
274
        case APR_OC_REASON_RESTART:
287
        case APR_OC_REASON_RESTART:
275
            /* don't do anything; server is stopping or restarting */
288
            /* don't do anything; server is stopping or restarting */
276
            apr_proc_other_child_unregister(data);
289
            apr_proc_other_child_unregister(data);
277
            break;
290
            break;
278
        case APR_OC_REASON_LOST:
291
        case APR_OC_REASON_LOST:
279
            /* it would be better to restart just the cgid child
292
            /* Restart the child cgid daemon process */
280
             * process but for now we'll gracefully restart the entire 
293
            apr_proc_other_child_unregister(data);
281
             * server by sending AP_SIG_GRACEFUL to ourself, the httpd 
294
            cgid_start(root_pool, root_server, proc);
282
             * parent process
283
             */
284
            kill(getpid(), AP_SIG_GRACEFUL);
285
            break;
295
            break;
286
        case APR_OC_REASON_UNREGISTER:
296
        case APR_OC_REASON_UNREGISTER:
287
            /* we get here when pcgi is cleaned up; pcgi gets cleaned
297
            /* we get here when pcgi is cleaned up; pcgi gets cleaned
288
             * up when pconf gets cleaned up
298
             * up when pconf gets cleaned up
289
             */
299
             */
290
            kill(*sd, SIGHUP); /* send signal to daemon telling it to die */
300
            kill(proc->pid, SIGHUP); /* send signal to daemon telling it to die */
291
            break;
301
            break;
292
    }
302
    }
293
}
303
}
Lines 565-570 Link Here
565
575
566
static void daemon_signal_handler(int sig)
576
static void daemon_signal_handler(int sig)
567
{
577
{
578
568
    if (sig == SIGHUP) {
579
    if (sig == SIGHUP) {
569
        ++daemon_should_exit;
580
        ++daemon_should_exit;
570
    }
581
    }
Lines 777-796 Link Here
777
    return -1; 
788
    return -1; 
778
} 
789
} 
779
790
791
static int cgid_start(apr_pool_t *p, server_rec *main_server,
792
                      apr_proc_t *procnew)
793
{
794
795
    daemon_should_exit = 0; /* clear setting from previous generation */
796
    if ((daemon_pid = fork()) < 0) {
797
        ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server,
798
                     "mod_cgid: Couldn't spawn cgid daemon process");
799
        return DECLINED;
800
    }
801
    else if (daemon_pid == 0) {
802
        if (pcgi == NULL) {
803
            apr_pool_create(&pcgi, p);
804
        }
805
        cgid_server(main_server);
806
        exit(-1);
807
    }
808
    procnew->pid = daemon_pid;
809
    procnew->err = procnew->in = procnew->out = NULL;
810
    apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT);
811
#if APR_HAS_OTHER_CHILD
812
    apr_proc_other_child_register(procnew, cgid_maint, procnew, NULL, p);
813
#endif
814
    return OK;
815
}
816
780
static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, 
817
static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, 
781
                      server_rec *main_server) 
818
                  server_rec *main_server) 
782
{ 
819
{ 
783
    apr_proc_t *procnew;
820
    apr_proc_t *procnew = NULL;
784
    void *data;
785
    int first_time = 0;
821
    int first_time = 0;
786
    const char *userdata_key = "cgid_init";
822
    const char *userdata_key = "cgid_init";
787
    module **m;
823
    module **m;
824
    int ret = OK;
825
826
    root_server = main_server;
827
    root_pool = p;
788
828
789
    apr_pool_userdata_get(&data, userdata_key, main_server->process->pool);
829
    apr_pool_userdata_get((void **)&procnew, userdata_key, main_server->process->pool);
790
    if (!data) {
830
    if (!procnew) {
791
        first_time = 1;
831
        first_time = 1;
792
        apr_pool_userdata_set((const void *)1, userdata_key,
832
        procnew = apr_pcalloc(p, sizeof(*procnew));
793
                         apr_pool_cleanup_null, main_server->process->pool);
833
        procnew->pid = -1;
834
        procnew->err = procnew->in = procnew->out = NULL;
835
        apr_pool_userdata_set((const void *)procnew, userdata_key,
836
                     apr_pool_cleanup_null, main_server->process->pool);
794
    }
837
    }
795
838
796
    if (!first_time) {
839
    if (!first_time) {
Lines 798-822 Link Here
798
        for (m = ap_preloaded_modules; *m != NULL; m++)
841
        for (m = ap_preloaded_modules; *m != NULL; m++)
799
            total_modules++;
842
            total_modules++;
800
843
801
        daemon_should_exit = 0; /* clear setting from previous generation */
844
        ret = cgid_start(p, main_server, procnew);
802
        if ((daemon_pid = fork()) < 0) {
845
        if (ret != OK ) {
803
            ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, 
846
            return ret;
804
                         "mod_cgid: Couldn't spawn cgid daemon process"); 
805
            return DECLINED;
806
        }
847
        }
807
        else if (daemon_pid == 0) {
808
            apr_pool_create(&pcgi, p); 
809
            cgid_server(main_server);
810
            exit(-1);
811
        } 
812
        procnew = apr_pcalloc(p, sizeof(*procnew));
813
        procnew->pid = daemon_pid;
814
        procnew->err = procnew->in = procnew->out = NULL;
815
        apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT);
816
#if APR_HAS_OTHER_CHILD
817
        apr_proc_other_child_register(procnew, cgid_maint, &procnew->pid, NULL, p);
818
#endif
819
820
        cgid_pfn_reg_with_ssi = APR_RETRIEVE_OPTIONAL_FN(ap_register_include_handler);
848
        cgid_pfn_reg_with_ssi = APR_RETRIEVE_OPTIONAL_FN(ap_register_include_handler);
821
        cgid_pfn_gtv          = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_get_tag_and_value);
849
        cgid_pfn_gtv          = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_get_tag_and_value);
822
        cgid_pfn_ps           = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_parse_string);
850
        cgid_pfn_ps           = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_parse_string);
Lines 828-834 Link Here
828
            cgid_pfn_reg_with_ssi("exec", handle_exec);
856
            cgid_pfn_reg_with_ssi("exec", handle_exec);
829
        }
857
        }
830
    }
858
    }
831
    return OK;
859
    return ret;
832
} 
860
} 
833
861
834
static void *create_cgid_config(apr_pool_t *p, server_rec *s) 
862
static void *create_cgid_config(apr_pool_t *p, server_rec *s) 

Return to bug 19849