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) |