When, with httpd-2.1, the pid file exists but has a zero size, then
httpd refuses to start.

The attached patch changes this behavior and removes the empty pid file
(but only if it exists AND is empty) and logs a message:

  (17)File exists: Zero-length PID file logs/httpd.pid ignored.

to the console during startup.

Not a very frequent error indeed....

   Martin
-- 
<[EMAIL PROTECTED]>         |     Fujitsu Siemens
Fon: +49-89-636-46021, FAX: +49-89-636-47655 | 81730  Munich,  Germany
? server/core.c.off
? server/export_files.off
? server/mpm/mpmt_pthread/.deps
? server/mpm/mpmt_pthread/.libs
? server/mpm/mpmt_pthread/Makefile
? server/mpm/mpmt_pthread/libmpmt_pthread.la
? server/mpm/mpmt_pthread/mpmt_pthread.lo
? server/mpm/mpmt_pthread/scoreboard.lo
Index: server/log.c
===================================================================
RCS file: /home/cvs/httpd-2.0/server/log.c,v
retrieving revision 1.140
diff -u -r1.140 log.c
--- server/log.c        12 Jan 2004 22:48:08 -0000      1.140
+++ server/log.c        5 Feb 2004 12:31:32 -0000
@@ -696,6 +696,7 @@
     const char *fname;
     char *buf, *endptr;
     apr_size_t bytes_read;
+    apr_finfo_t finfo;
 
     if (!filename) {
         return APR_EGENERAL;
@@ -713,18 +714,31 @@
         return rv;
     }
 
+    /* If there's a zero length pid file, unlink it */
+    if (APR_SUCCESS == apr_file_info_get(&finfo, APR_FINFO_SIZE, pid_file) &&
+        0 == finfo.size) {
+        apr_file_close(pid_file);
+        if (APR_SUCCESS == apr_file_remove(fname, p))
+            ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_ERR, APR_EEXIST, 
+                         NULL, "Zero-length PID file %s ignored.", filename);
+        return APR_ENOENT;
+    }
+
     /* Ensure null-termination, so that strtol doesn't go crazy. */
     buf = apr_palloc(p, BUFFER_SIZE);
     buf[BUFFER_SIZE - 1] = '\0';
 
     rv = apr_file_read_full(pid_file, buf, BUFFER_SIZE - 1, &bytes_read);
     if (rv != APR_SUCCESS && rv != APR_EOF) {
+        apr_file_close(pid_file);
         return rv;
     }
 
     /* If we fill the buffer, we're probably reading a corrupt pid file.
      * To be nice, let's also ensure the first char is a digit. */
     if (bytes_read == BUFFER_SIZE - 1 || !apr_isdigit(*buf)) {
+        apr_file_close(pid_file);
+
         return APR_EGENERAL;
     }
 

Reply via email to