[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