[Oisf-devel] [PATCH] pid file

Steve Grubb sgrubb at redhat.com
Thu Mar 11 16:21:47 UTC 2010


> I will check in a bug for the pid file. 

This is a stab at it. There is now a -p commandline option so that distros can
pass the pid file location to the daemon.

-Steve


diff -urp oisf.orig/src/suricata.c oisf/src/suricata.c
--- oisf.orig/src/suricata.c	2010-03-11 10:02:38.000000000 -0500
+++ oisf/src/suricata.c	2010-03-11 11:15:26.000000000 -0500
@@ -5,6 +5,7 @@
 #include <getopt.h>
 #include <signal.h>
 #include <pthread.h>
+#include <fcntl.h>
 
 #include "suricata.h"
 #include "decode.h"
@@ -352,6 +353,26 @@ static void SetBpfString(int optind, cha
     }
 }
 
+static int write_pidfile(const char *pidfile)
+{
+    int pidfd, len;
+    char val[16];
+
+    len = snprintf(val, sizeof(val), "%u\n", getpid());
+    if (len <= 0) {
+        syslog(LOG_ERR, "Pid error (%s)", strerror(errno));
+        return 1;
+    }
+    pidfd = open(pidfile, O_CREAT | O_TRUNC | O_NOFOLLOW | O_WRONLY, 0644);
+    if (pidfd < 0) {
+        syslog(LOG_ERR, "Unable to set pidfile (%s)", strerror(errno));
+        return 1;
+    }
+    (void)write(pidfd, val, (unsigned int)len);
+    close(pidfd);
+    return 0;
+}
+
 void usage(const char *progname)
 {
     printf("%s %s\n", PROG_NAME, PROG_VER);
@@ -364,6 +385,7 @@ void usage(const char *progname)
     printf("\t-s <path>                    : path to signature file (optional)\n");
     printf("\t-l <dir>                     : default log directory\n");
     printf("\t-D                           : run as daemon\n");
+    printf("\t-p <path>                    : write pid to this file\n");
 #ifdef UNITTESTS
     printf("\t-u                           : run the unittests and exit\n");
     printf("\t-U, --unittest-filter=REGEX  : filter unittests with a regex\n");
@@ -390,6 +412,7 @@ int main(int argc, char **argv)
     char *sig_file = NULL;
     char *nfq_id = NULL;
     char *conf_filename = NULL;
+    char *pid_filename = NULL;
 #ifdef UNITTESTS
     char *regex_arg = NULL;
 #endif
@@ -428,7 +451,7 @@ int main(int argc, char **argv)
     /* getopt_long stores the option index here. */
     int option_index = 0;
 
-    char short_opts[] = "c:Dhi:l:q:d:r:us:U:V";
+    char short_opts[] = "c:p:Dhi:l:q:d:r:us:U:V";
 
     while ((opt = getopt_long(argc, argv, short_opts, long_opts, &option_index)) != -1) {
         switch (opt) {
@@ -479,6 +502,9 @@ int main(int argc, char **argv)
         case 'D':
             daemon = 1;
             break;
+        case 'p':
+            pid_filename = optarg;
+            break;
         case 'h':
             usage(argv[0]);
             exit(EXIT_SUCCESS);
@@ -785,7 +811,12 @@ int main(int argc, char **argv)
     }
 #endif /* UNITTESTS */
 
-    if (daemon) Daemonize();
+    if (daemon) {
+        Daemonize();
+        if (write_pidfile(pid_filename))
+		pid_filename = NULL;
+    } else
+        pid_filename = NULL;
 
 #ifndef OS_WIN32
     /* registering signals we use */
@@ -999,6 +1030,8 @@ int main(int argc, char **argv)
 
     RunModeShutDown();
     OutputDeregisterAll();
+    if (pid_filename)
+        unlink(pid_filename);
 
 #ifdef __SC_CUDA_SUPPORT__
     /* all cuda contexts attached to any threads should be free by now.



More information about the Oisf-devel mailing list