You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jf...@apache.org on 2005/04/19 18:49:09 UTC

svn commit: r161917 - jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c

Author: jfclere
Date: Tue Apr 19 09:49:08 2005
New Revision: 161917

URL: http://svn.apache.org/viewcvs?view=rev&rev=161917
Log:
Fix 33580: note the new exit code 122 to prevent unlink of the pidfile.

Modified:
    jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c

Modified: jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c?view=diff&r1=161916&r2=161917
==============================================================================
--- jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c (original)
+++ jakarta/commons/proper/daemon/trunk/src/native/unix/native/jsvc-unix.c Tue Apr 19 09:49:08 2005
@@ -19,7 +19,10 @@
 #include <signal.h>
 #include <unistd.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <sys/wait.h>
+#include <fcntl.h>
+#include <stdio.h>
 #include <pwd.h>
 #ifdef OS_LINUX
 #include <sys/prctl.h>
@@ -240,20 +243,65 @@
 }
 
 /*
+ * Check pid and if still running
+ */
+
+static int check_pid(arg_data *args) {
+    int fd;
+    FILE *pidf;
+    char buff[80];
+    pid_t pidn=getpid();
+    int i,pid;
+
+    fd = open(args->pidf,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR);
+    if (fd<0) {
+        log_error("Cannot open PID file %s, PID is %d",args->pidf,pidn);
+        return(-1);
+    } else {
+        lockf(fd,F_LOCK,0);
+        i = read(fd,buff,sizeof(buff));
+        if (i>0) {
+            buff[i] = '\0';
+            pid = atoi(buff);
+            if (kill(pid, 0)==0) {
+                log_error("Still running according to PID file %s, PID is %d",args->pidf,pidn);
+                lockf(fd,F_ULOCK,0);
+                close(fd);
+                return(122);
+            }
+        }
+
+        /* skip writing the pid file if version or check */
+        if (args->vers!=true && args->chck!=true) {
+            lseek(fd, SEEK_SET, 0);
+            pidf = fdopen(fd,"r+");
+            fprintf(pidf,"%d\n",(int)getpid());
+            fflush(pidf);
+            lockf(fd,F_ULOCK,0);
+            fclose(pidf);
+            close(fd);
+        } else {
+            lockf(fd,F_ULOCK,0);
+            close(fd);
+        }
+    }
+    return(0);
+}
+
+/*
  * son process logic.
  */
 
 static int child(arg_data *args, home_data *data, uid_t uid, gid_t gid) {
-    FILE *pidf=fopen(args->pidf,"w");
-    pid_t pidn=getpid();
     int ret=0;
 
-    /* Write the our pid in the pid file */
-    if (pidf!=NULL) {
-        fprintf(pidf,"%d\n",(int)pidn);
-        fclose(pidf);
-    } else {
-        log_error("Cannot open PID file %s, PID is %d",args->pidf,pidn);
+    /* check the pid file */
+    ret = check_pid(args); 
+    if (args->vers!=true && args->chck!=true) {
+        if (ret==122)
+            return(ret);
+        if (ret<0)
+            return(ret);
     }
 
     /* create a new process group to prevent kill 0 killing the monitor process */
@@ -475,7 +523,8 @@
             status=WEXITSTATUS(status);
 
             /* Delete the pid file */
-            unlink(args->pidf);
+            if (args->vers!=true && args->chck!=true && status!=122)
+                unlink(args->pidf);
 
             /* If the child got out with 123 he wants to be restarted */
             if (status==123) {



---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org