diff options
author | Graham Leggett <minfrin@apache.org> | 2010-02-27 18:13:56 +0000 |
---|---|---|
committer | Graham Leggett <minfrin@apache.org> | 2010-02-27 18:13:56 +0000 |
commit | 302e2d7a214bb17ee8cc6d19807e5f202040000b (patch) | |
tree | d5bcae49ea7c84d33199c0c0de7db3299b222078 /support | |
parent | c9b45bef06cef51cdf44986391200a12b3a52f0e (diff) | |
download | httpd-302e2d7a214bb17ee8cc6d19807e5f202040000b.tar.gz |
Try open the pid file twice, once before daemonisation so we can see any
error, and once after daemonisation so the child's pid is logged correctly.
Patch by Jeff Trawick.
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@917002 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'support')
-rw-r--r-- | support/htcacheclean.c | 59 |
1 files changed, 40 insertions, 19 deletions
diff --git a/support/htcacheclean.c b/support/htcacheclean.c index 43d5117dd2..44f6d60113 100644 --- a/support/htcacheclean.c +++ b/support/htcacheclean.c @@ -758,6 +758,28 @@ static void usage_repeated_arg(apr_pool_t *pool, char option) { option)); } +static void log_pid(apr_pool_t *pool, const char *pidfilename, apr_file_t **pidfile) +{ + apr_status_t status; + char errmsg[120]; + pid_t mypid = getpid(); + + if (APR_SUCCESS == (status = apr_file_open(pidfile, pidfilename, APR_WRITE + | APR_CREATE | APR_TRUNCATE | APR_DELONCLOSE, + APR_UREAD | APR_UWRITE | APR_GREAD, pool))) { + apr_file_printf(*pidfile, "%" APR_PID_T_FMT APR_EOL_STR, mypid); + } + else { + if (errfile) { + apr_file_printf(errfile, + "Could not write the pid file '%s': %s" APR_EOL_STR, + pidfilename, + apr_strerror(status, errmsg, sizeof errmsg)); + } + exit(1); + } +} + /* * main */ @@ -769,10 +791,11 @@ int main(int argc, const char * const argv[]) apr_pool_t *pool, *instance; apr_getopt_t *o; apr_finfo_t info; + apr_file_t *pidfile; int retries, isdaemon, limit_found, intelligent, dowork; char opt; const char *arg; - char *proxypath, *path, *pidfile; + char *proxypath, *path, *pidfilename; char errmsg[1024]; interrupted = 0; @@ -788,7 +811,7 @@ int main(int argc, const char * const argv[]) intelligent = 0; previous = 0; /* avoid compiler warning */ proxypath = NULL; - pidfile = NULL; + pidfilename = NULL; if (apr_app_initialize(&argc, &argv, NULL) != APR_SUCCESS) { return 1; @@ -917,10 +940,10 @@ int main(int argc, const char * const argv[]) break; case 'P': - if (pidfile) { + if (pidfilename) { usage_repeated_arg(pool, opt); } - pidfile = apr_pstrdup(pool, arg); + pidfilename = apr_pstrdup(pool, arg); break; } /* switch */ @@ -961,27 +984,25 @@ int main(int argc, const char * const argv[]) } baselen = strlen(path); + if (pidfilename) { + log_pid(pool, pidfilename, &pidfile); /* before daemonizing, so we + * can report errors + */ + } + #ifndef DEBUG if (isdaemon) { apr_file_close(errfile); - apr_proc_detach(APR_PROC_DETACH_DAEMONIZE); - } -#endif - - if (pidfile) { - apr_file_t *file; - pid_t mypid = getpid(); - if (APR_SUCCESS == (status = apr_file_open(&file, pidfile, APR_WRITE - | APR_CREATE | APR_TRUNCATE | APR_DELONCLOSE, - APR_UREAD | APR_UWRITE | APR_GREAD, pool))) { - apr_file_printf(file, "%" APR_PID_T_FMT APR_EOL_STR, mypid); + errfile = NULL; + if (pidfilename) { + apr_file_close(pidfile); /* delete original pidfile only in parent */ } - else if (!isdaemon) { - apr_file_printf(errfile, - "Could not write the pid file '%s': %s" APR_EOL_STR, - pidfile, apr_strerror(status, errmsg, sizeof errmsg)); + apr_proc_detach(APR_PROC_DETACH_DAEMONIZE); + if (pidfilename) { + log_pid(pool, pidfilename, &pidfile); } } +#endif do { apr_pool_create(&instance, pool); |