vknetd - Add pidfile and signal handlers.
authorAntonio Huete Jimenez <tuxillo@quantumachine.net>
Sun, 4 Dec 2011 23:47:17 +0000 (00:47 +0100)
committerAntonio Huete Jimenez <tuxillo@quantumachine.net>
Sun, 4 Dec 2011 23:49:58 +0000 (00:49 +0100)
When started up, vknetd will create a pidfile in
/var/run/vknetd.pid by default or where specified
by option -i.

Add signal handlers to cleanup pid file.

usr.sbin/vknetd/vknetd.8
usr.sbin/vknetd/vknetd.c
usr.sbin/vknetd/vknetd.h

index 2ed6b42..de9efa7 100644 (file)
@@ -33,7 +33,7 @@
 .\" 
 .\" $DragonFly: src/usr.sbin/vknetd/vknetd.8,v 1.3 2008/05/31 12:04:15 swildner Exp $
 .\"
-.Dd May 21, 2009
+.Dd Dec 5, 2011
 .Dt VKNETD 8
 .Os
 .Sh NAME
@@ -44,6 +44,7 @@
 .Op Fl cdU
 .Op Fl b Ar bridgeN
 .Op Fl p Ar socket_path
+.Op Fl i Ar pidfile
 .Op Fl t Ar tapN
 .Op Ar address Ns / Ns Ar cidrbits
 .Sh DESCRIPTION
@@ -111,6 +112,11 @@ will be bridged into the specified bridge.
 Specify where to create the unix domain socket in the filesystem space.
 By default the socket is called
 .Pa /var/run/vknet .
+.It Fl i Ar pidfile
+When specified, write process id to
+.Ar pidfile
+instead of the default
+.Pa /var/run/vknetd.pid .
 .It Fl t Ar tapN
 Specify a particular
 .Xr tap 4
index 1db8e92..41fe69a 100644 (file)
@@ -48,12 +48,16 @@ static void *vknet_io(void *arg);
 static int vknet_connect(const char *pathName);
 static void vknet_monitor(int net_fd);
 static void usage(void);
+static void writepid(void);
+static void cleanup(int);
 
 pthread_mutex_t BridgeMutex;
 
 int SecureOpt = 1;
 int DebugOpt = 0;
 int SetAddrOpt = 0;
+const char *pidfile = "/var/run/vknetd.pid";
+
 struct in_addr NetAddress;
 struct in_addr NetMask;
 
@@ -69,7 +73,7 @@ main(int ac, char **av)
        ioinfo_t tap_info;
        pthread_t dummy_td;
 
-       while ((c = getopt(ac, av, "b:cdp:t:U")) != -1) {
+       while ((c = getopt(ac, av, "b:cdp:i:t:U")) != -1) {
                switch (c) {
                case 'U':
                        SecureOpt = 0;
@@ -83,6 +87,9 @@ main(int ac, char **av)
                case 'p':
                        pathName = optarg;
                        break;
+               case 'i':
+                       pidfile = optarg;
+                       break;
                case 't':
                        tapName = optarg;
                        break;
@@ -148,6 +155,12 @@ main(int ac, char **av)
                exit(1);
        }
 
+       writepid();
+
+       signal(SIGINT, cleanup);
+       signal(SIGHUP, cleanup);
+       signal(SIGTERM, cleanup);
+
        /*
         * Now make us a demon and start the threads going.
         */
@@ -467,11 +480,32 @@ vknet_monitor(int net_fd)
 /*
  * Misc
  */
+static void
+writepid(void)
+{
+       FILE *pf;
+
+       if ((pf = fopen(pidfile, "w+")) == NULL)
+               errx(1, "Failed to create pidfile %s", pidfile);
+
+       if ((fprintf(pf, "%d\n", getpid())) < 1)
+               err(1, "fprintf");
+
+       fclose(pf);
+}
+
+static void
+cleanup(int __unused sig)
+{
+       if (pidfile)
+               unlink(pidfile);
+}
+
 static
 void
 usage(void)
 {
-       fprintf(stderr, "usage: vknet [-cdU] [-b bridgeN] [-p socket_path] [-t tapN] [address/cidrbits]\n");
+       fprintf(stderr, "usage: vknet [-cdU] [-b bridgeN] [-p socket_path] [-i pidfile] [-t tapN] [address/cidrbits]\n");
        fprintf(stderr, "address/cidrbits must be specified in default secure mode.\n");
        exit(1);
 }
index de20f54..a848084 100644 (file)
@@ -47,6 +47,7 @@
 #include <net/ethernet.h>
 #include <net/bridge/if_bridgevar.h>
 #include <stdio.h>
+#include <signal.h>
 #include <stdlib.h>
 #include <stddef.h>
 #include <string.h>
@@ -54,6 +55,7 @@
 #include <fcntl.h>
 #include <errno.h>
 #include <assert.h>
+#include <err.h>
 #include <grp.h>
 
 #include <pthread.h>