Log filter result.
[apps/pfixtools.git] / common / common.c
index 3688c9d..c2abeb4 100644 (file)
@@ -44,6 +44,8 @@
 sig_atomic_t sigint  = false;
 sig_atomic_t sighup  = false;
 
+bool daemon_process  = true;
+
 static FILE *pidfile = NULL;
 
 void common_sighandler(int sig)
@@ -193,10 +195,13 @@ int daemon_detach(void)
     open("/dev/null", O_RDWR);
 
     pid = fork();
-    if (pid < 0)
+    if (pid < 0) {
         return -1;
-    if (pid)
+               }
+    if (pid) {
+                               daemon_process = false;
         exit(0);
+               }
 
     setsid();
     return 0;
@@ -229,11 +234,20 @@ int drop_privileges(const char *user, const char *group)
 
 int pidfile_open(const char *name)
 {
+               struct flock lock;
+               p_clear(&lock, 1);
+               lock.l_type = F_WRLCK;
     if (name) {
         pidfile = fopen(name, "w");
         if (!pidfile)
             return -1;
-        fprintf(pidfile, "%d\n", getpid());
+                               if (fcntl(fileno(pidfile), F_SETLK, &lock) == -1) {
+                                               syslog(LOG_ERR, "program already started");
+                                               fclose(pidfile);
+                                               pidfile = NULL;
+                                               return -1;
+                               }
+                               fprintf(pidfile, "%d\n", getpid());
         return fflush(pidfile);
     }
     return 0;
@@ -252,10 +266,14 @@ int pidfile_refresh(void)
 
 static void pidfile_close(void)
 {
+               struct flock lock;
+               p_clear(&lock, 1);
+               lock.l_type = F_UNLCK;
     if (pidfile) {
         rewind(pidfile);
         ftruncate(fileno(pidfile), 0);
-        fclose(pidfile);
+        fcntl(fileno(pidfile), F_SETLK, &lock);
+                               fclose(pidfile);
         pidfile = NULL;
     }
 }
@@ -263,11 +281,6 @@ static void pidfile_close(void)
 int common_setup(const char* pidfilename, bool unsafe, const char* runas_user,
                  const char* runas_group, bool daemonize)
 {
-    if (pidfile_open(pidfilename) < 0) {
-        syslog(LOG_CRIT, "unable to write pidfile %s", pidfilename);
-        return EXIT_FAILURE;
-    }
-
     if (!unsafe && drop_privileges(runas_user, runas_group) < 0) {
         syslog(LOG_CRIT, "unable to drop privileges");
         return EXIT_FAILURE;
@@ -278,6 +291,11 @@ int common_setup(const char* pidfilename, bool unsafe, const char* runas_user,
         return EXIT_FAILURE;
     }
 
+               if (pidfile_open(pidfilename) < 0) {
+        syslog(LOG_CRIT, "unable to write pidfile %s", pidfilename);
+        return EXIT_FAILURE;
+    }
+
     pidfile_refresh();
     return EXIT_SUCCESS;
 }
@@ -287,9 +305,10 @@ extern exitcall_t __madexit[];
 
 static void common_shutdown(void)
 {
-    syslog(LOG_INFO, "Stopping...");
-    pidfile_close();
-
+               if (daemon_process) {
+                               syslog(LOG_INFO, "Stopping...");
+               }
+               pidfile_close();
     for (int i = -1; __madexit[i]; i--) {
         (*__madexit[i])();
     }