]> err.no Git - varnish/commitdiff
Copy&paste -D (daemonize) from varnishlog.
authordes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Thu, 8 Nov 2007 16:28:26 +0000 (16:28 +0000)
committerdes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Thu, 8 Nov 2007 16:28:26 +0000 (16:28 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2230 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishncsa/varnishncsa.1
varnish-cache/bin/varnishncsa/varnishncsa.c

index d1c76056d46dec69a72662f2baf326657b36b861..2d60be7b4100e8be1c81c41df3cb4a1d0d75f35c 100644 (file)
@@ -28,7 +28,7 @@
 .\"
 .\" $Id$
 .\"
-.Dd June 15, 2007
+.Dd November 8, 2007
 .Dt VARNISHNCSA 1
 .Os
 .Sh NAME
 .Op Fl b
 .Op Fl C
 .Op Fl c
+.Op Fl D
 .Op Fl d
 .Op Fl I Ar regex
 .Op Fl i Ar tag
 .Op Fl n Ar varnish_name
+.Op Fl P Ar file
 .Op Fl r Ar file
 .Op Fl V
 .Op Fl w Ar file
@@ -82,6 +84,8 @@ nor
 is specified,
 .Nm
 acts as if they both were.
+.It Fl D
+Daemonize.
 .It Fl d
 Process old log entries on startup.
 Normally,
@@ -109,6 +113,9 @@ instance to get logs from.
 If
 .Fl n
 is not specified, the host name is used.
+.It Fl P Ar file
+Write the process's PID to the specified
+.Ar file .
 .It Fl r Ar file
 Read log entries from
 .Ar file
index 68a891fec1105b213ff820c68597c16aa07aa61b..f3c2fe7fbd7b712bc3579be3db1bf625881c61f5 100644 (file)
 #include <unistd.h>
 #include <limits.h>
 
+#ifndef HAVE_DAEMON
+#include "compat/daemon.h"
+#endif
+
+#include "vsb.h"
+#include "vpf.h"
+
 #include "libvarnish.h"
 #include "shmlog.h"
 #include "varnishapi.h"
-#include "vsb.h"
 
 static struct logline {
        char *df_H;                     /* %H, Protocol version */
@@ -434,7 +440,7 @@ static void
 usage(void)
 {
 
-       fprintf(stderr, "usage: varnishncsa %s [-aV] [-n varnish_name] [-w file]\n", VSL_ARGS);
+       fprintf(stderr, "usage: varnishncsa %s [-aDV] [-n varnish_name] [-P file] [-w file]\n", VSL_ARGS);
        exit(1);
 }
 
@@ -442,15 +448,17 @@ int
 main(int argc, char *argv[])
 {
        int i, c;
-       struct VSL_data *vd;
-       const char *ofn = NULL;
+       int a_flag = 0, D_flag = 0;
        const char *n_arg = NULL;
-       int append = 0;
+       const char *P_arg = NULL;
+       const char *w_arg = NULL;
+       struct pidfh *pfh = NULL;
+       struct VSL_data *vd;
        FILE *of;
 
        vd = VSL_New();
 
-       while ((c = getopt(argc, argv, VSL_ARGS "an:Vw:")) != -1) {
+       while ((c = getopt(argc, argv, VSL_ARGS "aDn:P:Vw:")) != -1) {
                i = VSL_Arg(vd, c, optarg);
                if (i < 0)
                        exit (1);
@@ -458,16 +466,22 @@ main(int argc, char *argv[])
                        continue;
                switch (c) {
                case 'a':
-                       append = 1;
+                       a_flag = 1;
+                       break;
+               case 'D':
+                       D_flag = 1;
                        break;
                case 'n':
                        n_arg = optarg;
                        break;
+               case 'P':
+                       P_arg = optarg;
+                       break;
                case 'V':
                        varnish_version("varnishncsa");
                        exit(0);
                case 'w':
-                       ofn = optarg;
+                       w_arg = optarg;
                        break;
                default:
                        if (VSL_Arg(vd, c, optarg) > 0)
@@ -479,22 +493,37 @@ main(int argc, char *argv[])
        if (VSL_OpenLog(vd, n_arg))
                exit(1);
 
-       if (ofn) {
-               of = open_log(ofn, append);
+       if (P_arg && (pfh = vpf_open(P_arg, 0600, NULL)) == NULL) {
+               perror(P_arg);
+               exit(1);
+       }
+
+       if (D_flag && daemon(0, 0) == -1) {
+               perror("daemon()");
+               if (pfh != NULL)
+                       vpf_remove(pfh);
+               exit(1);
+       }
+
+       if (pfh != NULL)
+               vpf_write(pfh);
+
+       if (w_arg) {
+               of = open_log(w_arg, a_flag);
                signal(SIGHUP, sighup);
        } else {
-               ofn = "stdout";
+               w_arg = "stdout";
                of = stdout;
        }
 
        while (VSL_Dispatch(vd, h_ncsa, of) == 0) {
                if (fflush(of) != 0) {
-                       perror(ofn);
+                       perror(w_arg);
                        exit(1);
                }
                if (reopen && of != stdout) {
                        fclose(of);
-                       of = open_log(ofn, append);
+                       of = open_log(w_arg, a_flag);
                        reopen = 0;
                }
        }