]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
Add the option "--no-pid" to the client, relay and server code,
authorShawn Routhier <sar@isc.org>
Fri, 15 Apr 2011 22:12:51 +0000 (22:12 +0000)
committerShawn Routhier <sar@isc.org>
Fri, 15 Apr 2011 22:12:51 +0000 (22:12 +0000)
to disable writing a pid file.  Add the option "-pf pidfile"
to the relay to allow the user to supply the pidfile name at
runtime.  Add the "with-relay6-pid-file" option to configure
to allow the user to supply the pidfile name for the relay
in v6 mode at configure time.
[ISC-Bugs #23351] [ISC-Bugs #17541]

RELNOTES
client/dhclient.8
client/dhclient.c
configure.ac
relay/dhcrelay.8
relay/dhcrelay.c
server/dhcpd.8
server/dhcpd.c

index 01ae579732918923668a858e0e4c3899afe17b1a..a1759758e331dcfb030503d843c3a666febca4a6 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -49,6 +49,14 @@ work on other platforms. Please report any problems and suggested fixes to
 
 - DHCPv6 server now responds properly if client asks for a prefix that
   is already assigned to a different client. [ISC-Bugs #23948]
+
+- Add the option "--no-pid" to the client, relay and server code,
+  to disable writing a pid file.  Add the option "-pf pidfile"
+  to the relay to allow the user to supply the pidfile name at
+  runtime.  Add the "with-relay6-pid-file" option to configure
+  to allow the user to supply the pidfile name for the relay
+  in v6 mode at configure time.
+  [ISC-Bugs #23351] [ISC-Bugs #17541]
   
                        Changes since 4.2.1rc1
 
index 9014c1fbd4165b8a6dcda37ee8125e2485139dad..7ca8c57c5ab9f3249cf1aecf8900a3016b0cd52c 100644 (file)
@@ -1,6 +1,6 @@
-.\"    $Id: dhclient.8,v 1.32.24.3 2010/07/14 20:09:34 sar Exp $
+.\"    $Id: dhclient.8,v 1.32.24.4 2011/04/15 22:12:50 sar Exp $
 .\"
-.\" Copyright (c) 2004,2007-2010 by Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (c) 2004,2007-2011 by Internet Systems Consortium, Inc. ("ISC")
 .\" Copyright (c) 1996-2003 by Internet Software Consortium
 .\"
 .\" Permission to use, copy, modify, and distribute this software for any
@@ -90,6 +90,9 @@ dhclient - Dynamic Host Configuration Protocol Client
 .I pid-file
 ]
 [
+.B --no-pid
+]
+[
 .B -cf
 .I config-file
 ]
@@ -99,7 +102,7 @@ dhclient - Dynamic Host Configuration Protocol Client
 ]
 [
 .B -s
-.I server
+.I server-addr
 ]
 [
 .B -g
@@ -305,7 +308,7 @@ If a different port is specified on which the client should listen and
 transmit, the client will also use a different destination port -
 one less than the specified port.
 .TP
-.BI \-s \ server
+.BI \-s \ server-addr
 Specify the server IP address or fully qualified domain name to use as
 a destination for DHCP protocol messages before 
 .B dhclient
@@ -381,6 +384,12 @@ Path to the process ID file.  If unspecified, the default
 .B RUNDIR/dhclient.pid
 is used.
 .TP
+.BI \--no-pid
+Option to disable writing pid files.  By default the program
+will write a pid file.  If the program is invoked with this
+option it will not attempt to kill any existing client processes
+even if invoked with \fB-r\fR or \fB-x\fR.
+.TP
 .BI \-sf \ script-file
 Path to the network configuration script invoked by
 .B dhclient
index f816fbf23a0590a333efbf409865a5e56cc073fb..f9248f4171f6247f3d5cbbba860b0ef6901f03a0 100644 (file)
@@ -48,6 +48,9 @@ const char *path_dhclient_pid = NULL;
 static char path_dhclient_script_array[] = _PATH_DHCLIENT_SCRIPT;
 char *path_dhclient_script = path_dhclient_script_array;
 
+/* False (default) => we write and use a pid file */
+isc_boolean_t no_pid_file = ISC_FALSE;
+
 int dhcp_max_agent_option_packet_length = 0;
 
 int interfaces_requested = 0;
@@ -198,6 +201,8 @@ main(int argc, char **argv) {
                                usage();
                        path_dhclient_pid = argv[i];
                        no_dhclient_pid = 1;
+               } else if (!strcmp(argv[i], "--no-pid")) {
+                       no_pid_file = ISC_TRUE;
                } else if (!strcmp(argv[i], "-cf")) {
                        if (++i == argc)
                                usage();
@@ -387,8 +392,13 @@ main(int argc, char **argv) {
                        log_fatal("%s: %s", path, strerror(errno));
        }
 
-       /* first kill off any currently running client */
-       if (release_mode || exit_mode) {
+       /*
+        * See if we should  kill off any currently running client
+        * we don't try to kill it off if the user told us not
+        * to write a pid file - we assume they are controlling
+        * the process in some other fashion.
+        */
+       if ((release_mode || exit_mode) && (no_pid_file == ISC_FALSE)) {
                FILE *pidfd;
                pid_t oldpid;
                long temp;
@@ -679,16 +689,17 @@ static void usage()
        log_info(arr);
        log_info(url);
 
-       log_error("Usage: dhclient %s %s",
+
+       log_fatal("Usage: dhclient "
 #ifdef DHCPv6
-                 "[-4|-6] [-SNTP1dvrx] [-nw] [-p <port>] [-D LL|LLT]",
+                 "[-4|-6] [-SNTP1dvrx] [-nw] [-p <port>] [-D LL|LLT]\n"
 #else /* DHCPv6 */
-                 "[-1dvrx] [-nw] [-p <port>]",
+                 "[-1dvrx] [-nw] [-p <port>]\n"
 #endif /* DHCPv6 */
-                 "[-s server]");
-       log_error("                [-cf config-file] [-lf lease-file]%s",
-                 "[-pf pid-file] [-e VAR=val]");
-       log_fatal("                [-sf script-file] [interface]");
+                 "                [-s server-addr] [-cf config-file] "
+                 "[-lf lease-file]\n"
+                 "                [-pf pid-file] [--no-pid] [-e VAR=val]\n"
+                 "                [-sf script-file] [interface]");
 }
 
 void run_stateless(int exit_mode)
@@ -3372,6 +3383,11 @@ void write_client_pid_file ()
        FILE *pf;
        int pfdesc;
 
+       /* nothing to do if the user doesn't want a pid file */
+       if (no_pid_file == ISC_TRUE) {
+               return;
+       }
+
        pfdesc = open (path_dhclient_pid, O_CREAT | O_TRUNC | O_WRONLY, 0644);
 
        if (pfdesc < 0) {
index ad5a7cb47f6d517b9443218a312eb90df048a0dd..39b4e7f7719997a9fc6a92f8b9294661f0ceff43 100644 (file)
@@ -317,6 +317,12 @@ AC_ARG_WITH(relay-pid-file,
                        (default is LOCALSTATEDIR/run/dhcrelay.pid)]),
        AC_DEFINE_UNQUOTED([_PATH_DHCRELAY_PID], ["$withval"],
                           [File for dhcrelay process information.]))
+AC_ARG_WITH(relay6-pid-file,
+       AC_HELP_STRING([--with-relay6-pid-file=PATH],
+                      [File for dhcrelay6 process information
+                       (default is LOCALSTATEDIR/run/dhcrelay6.pid)]),
+       AC_DEFINE_UNQUOTED([_PATH_DHCRELAY6_PID], ["$withval"],
+                          [File for dhcrelay6 process information.]))
 
 # Check basic types.
 AC_TYPE_INT8_T
index f3829a08303abd6059c8e2c3a2689f8d61169742..d6f2188493db076d274fecfe31f12c079e4a6b0e 100644 (file)
@@ -1,6 +1,6 @@
 .\"    dhcrelay.8
 .\"
-.\" Copyright (c) 2009-2010 by Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (c) 2009-2011 by Internet Systems Consortium, Inc. ("ISC")
 .\" Copyright (c) 2004,2007 by Internet Systems Consortium, Inc. ("ISC")
 .\" Copyright (c) 1997-2003 by Internet Software Consortium
 .\"
@@ -28,7 +28,7 @@
 .\" Support and other services are available for ISC products - see
 .\" https://www.isc.org for more information or to learn more about ISC.
 .\"
-.\" $Id: dhcrelay.8,v 1.16.24.2 2010/07/06 19:03:12 sar Exp $
+.\" $Id: dhcrelay.8,v 1.16.24.3 2011/04/15 22:12:50 sar Exp $
 .\"
 .TH dhcrelay 8
 .SH NAME
@@ -54,6 +54,13 @@ dhcrelay - Dynamic Host Configuration Protocol Relay Agent
 .I length
 ]
 [
+.B -pf
+.I pid-file
+]
+[
+.B --no-pid
+]
+[
 .B -m
 .I append
 |
@@ -89,6 +96,13 @@ dhcrelay - Dynamic Host Configuration Protocol Relay Agent
 .B -c
 .I count
 ]
+[
+.B -pf
+.I pid-file
+]
+[
+.B --no-pid
+]
 .B -l
 .I lower0
 [
@@ -150,6 +164,13 @@ purposes.  Default is port 67 for DHCPv4/BOOTP, or port 547 for DHCPv6.
 -q
 Quiet mode.  Prevents dhcrelay6 from printing its network configuration
 on startup.
+.TP
+-pf pid-file
+Path to alternate pid file.
+.TP
+--no-pid
+Option to disable writing pid files.  By default the program
+will write a pid file.
 .PP
 \fIOptions available in DHCPv4 mode only:\fR
 .TP
index 351484915a4e6829db8ec9e5bd11a8f9d82148d2..325fc9d0b60b3ee31cedc25e14e97e8269093777 100644 (file)
@@ -49,6 +49,9 @@ char *token_line;
 char *tlname;
 
 const char *path_dhcrelay_pid = _PATH_DHCRELAY_PID;
+isc_boolean_t no_dhcrelay_pid = ISC_FALSE;
+/* False (default) => we write and use a pid file */
+isc_boolean_t no_pid_file = ISC_FALSE;
 
 int bogus_agent_drops = 0;     /* Packets dropped because agent option
                                   field was specified and we're not relaying
@@ -138,10 +141,12 @@ static const char url[] =
 #define DHCRELAY_USAGE \
 "Usage: dhcrelay [-4] [-d] [-q] [-a] [-D]\n"\
 "                     [-A <length>] [-c <hops>] [-p <port>]\n" \
+"                     [-pf <pid-file>] [--no-pid]\n"\
 "                     [-m append|replace|forward|discard]\n" \
 "                     [-i interface0 [ ... -i interfaceN]\n" \
 "                     server0 [ ... serverN]\n\n" \
 "       dhcrelay -6   [-d] [-q] [-I] [-c <hops>] [-p <port>]\n" \
+"                     [-pf <pid-file>] [--no-pid]\n"\
 "                     -l lower0 [ ... -l lowerN]\n" \
 "                     -u upper0 [ ... -u upperN]\n" \
 "       lower (client link): [address%%]interface[#index]\n" \
@@ -149,6 +154,7 @@ static const char url[] =
 #else
 #define DHCRELAY_USAGE \
 "Usage: dhcrelay [-d] [-q] [-a] [-D] [-A <length>] [-c <hops>] [-p <port>]\n" \
+"                [-pf <pid-file>] [--no-pid]\n"\
 "                [-m append|replace|forward|discard]\n" \
 "                [-i interface0 [ ... -i interfaceN]\n" \
 "                server0 [ ... serverN]\n\n"
@@ -350,6 +356,13 @@ main(int argc, char **argv) {
                        sl->next = upstreams;
                        upstreams = sl;
 #endif
+               } else if (!strcmp(argv[i], "-pf")) {
+                       if (++i == argc)
+                               usage();
+                       path_dhcrelay_pid = argv[i];
+                       no_dhcrelay_pid = ISC_TRUE;
+               } else if (!strcmp(argv[i], "--no-pid")) {
+                       no_pid_file = ISC_TRUE;
                } else if (!strcmp(argv[i], "--version")) {
                        log_info("isc-dhcrelay-%s", PACKAGE_VERSION);
                        exit(0);
@@ -394,18 +407,24 @@ main(int argc, char **argv) {
                }
        }
 
-       if (local_family == AF_INET) {
-               path_dhcrelay_pid = getenv("PATH_DHCRELAY_PID");
-               if (path_dhcrelay_pid == NULL)
-                       path_dhcrelay_pid = _PATH_DHCRELAY_PID;
-       }
+       /*
+        * If the user didn't specify a pid file directly
+        * find one from environment variables or defaults
+        */
+       if (no_dhcrelay_pid == ISC_FALSE) {
+               if (local_family == AF_INET) {
+                       path_dhcrelay_pid = getenv("PATH_DHCRELAY_PID");
+                       if (path_dhcrelay_pid == NULL)
+                               path_dhcrelay_pid = _PATH_DHCRELAY_PID;
+               }
 #ifdef DHCPv6
-       else {
-               path_dhcrelay_pid = getenv("PATH_DHCRELAY6_PID");
-               if (path_dhcrelay_pid == NULL)
-                       path_dhcrelay_pid = _PATH_DHCRELAY6_PID;
-       }
+               else {
+                       path_dhcrelay_pid = getenv("PATH_DHCRELAY6_PID");
+                       if (path_dhcrelay_pid == NULL)
+                               path_dhcrelay_pid = _PATH_DHCRELAY6_PID;
+               }
 #endif
+       }
 
        if (!quiet) {
                log_info("%s %s", message, PACKAGE_VERSION);
@@ -519,20 +538,23 @@ main(int argc, char **argv) {
                else if (pid)
                        exit(0);
 
-               pfdesc = open(path_dhcrelay_pid,
-                              O_CREAT | O_TRUNC | O_WRONLY, 0644);
+               if (no_pid_file == ISC_FALSE) {
+                       pfdesc = open(path_dhcrelay_pid,
+                                     O_CREAT | O_TRUNC | O_WRONLY, 0644);
 
-               if (pfdesc < 0) {
-                       log_error("Can't create %s: %m", path_dhcrelay_pid);
-               } else {
-                       pf = fdopen(pfdesc, "w");
-                       if (!pf)
-                               log_error("Can't fdopen %s: %m",
-                                     path_dhcrelay_pid);
-                       else {
-                               fprintf(pf, "%ld\n",(long)getpid());
-                               fclose(pf);
-                       }       
+                       if (pfdesc < 0) {
+                               log_error("Can't create %s: %m",
+                                         path_dhcrelay_pid);
+                       } else {
+                               pf = fdopen(pfdesc, "w");
+                               if (!pf)
+                                       log_error("Can't fdopen %s: %m",
+                                                 path_dhcrelay_pid);
+                               else {
+                                       fprintf(pf, "%ld\n",(long)getpid());
+                                       fclose(pf);
+                               }       
+                       }
                }
 
                close(0);
index 463baee6af133f1847688b92b27bf8ba63d8e8de..9a1d93a085bc998fc82af5c3cdff1a966301f0d3 100644 (file)
@@ -1,6 +1,6 @@
 .\"    dhcpd.8
 .\"
-.\" Copyright (c) 2009-2010 by Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (c) 2009-2011 by Internet Systems Consortium, Inc. ("ISC")
 .\" Copyright (c) 2004-2007 by Internet Systems Consortium, Inc. ("ISC")
 .\" Copyright (c) 1996-2003 by Internet Software Consortium
 .\"
@@ -28,7 +28,7 @@
 .\" Support and other services are available for ISC products - see
 .\" https://www.isc.org for more information or to learn more about ISC.
 .\"
-.\" $Id: dhcpd.8,v 1.30.24.3 2010/07/14 20:09:34 sar Exp $
+.\" $Id: dhcpd.8,v 1.30.24.4 2011/04/15 22:12:50 sar Exp $
 .\"
 .TH dhcpd 8
 .SH NAME
@@ -75,6 +75,9 @@ dhcpd - Dynamic Host Configuration Protocol Server
 .I pid-file
 ]
 [
+.B --no-pid
+]
+[
 .B -tf
 .I trace-output-file
 ]
@@ -283,6 +286,11 @@ Path to alternate lease file.
 .TP
 .BI \-pf \ pid-file
 Path to alternate pid file.
+.TP
+.BI \--no-pid
+Option to disable writing pid files.  By default the program
+will write a pid file.  If the program is invoked with this
+option it will not check for an existing server process.
 .PP
 .SH CONFIGURATION
 The syntax of the dhcpd.conf(5) file is discussed separately.   This
index d8d419d50bf0740dac58357a10a700575346df0b..7e15e3a4b1835fe8576d3f24097a4c72aa0b7523 100644 (file)
@@ -160,6 +160,8 @@ int ddns_update_style;
 const char *path_dhcpd_conf = _PATH_DHCPD_CONF;
 const char *path_dhcpd_db = _PATH_DHCPD_DB;
 const char *path_dhcpd_pid = _PATH_DHCPD_PID;
+/* False (default) => we write and use a pid file */
+isc_boolean_t no_pid_file = ISC_FALSE;
 
 int dhcp_max_agent_option_packet_length = DHCP_MTU_MAX;
 
@@ -351,6 +353,8 @@ main(int argc, char **argv) {
                                usage ();
                        path_dhcpd_pid = argv [i];
                        no_dhcpd_pid = 1;
+               } else if (!strcmp(argv[i], "--no-pid")) {
+                       no_pid_file = ISC_TRUE;
                 } else if (!strcmp (argv [i], "-t")) {
                        /* test configurations only */
 #ifndef DEBUG
@@ -783,33 +787,41 @@ main(int argc, char **argv) {
        }
 #endif /* PARANOIA */
 
-       /* Read previous pid file. */
-       if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) {
-               status = read(i, pbuf, (sizeof pbuf) - 1);
-               close (i);
-               if (status > 0) {
-                       pbuf[status] = 0;
-                       pid = atoi(pbuf);
-
-                       /*
-                         * If there was a previous server process and it's
-                         * is still running, abort
-                         */
-                       if (!pid || (pid != getpid() && kill(pid, 0) == 0))
-                               log_fatal("There's already a "
-                                          "DHCP server running.");
+       /*
+        * Deal with pid files.  If the user told us
+        * not to write a file we don't read one either
+        */
+       if (no_pid_file == ISC_FALSE) {
+               /*Read previous pid file. */
+               if ((i = open (path_dhcpd_pid, O_RDONLY)) >= 0) {
+                       status = read(i, pbuf, (sizeof pbuf) - 1);
+                       close (i);
+                       if (status > 0) {
+                               pbuf[status] = 0;
+                               pid = atoi(pbuf);
+
+                               /*
+                                * If there was a previous server process and
+                                * it is still running, abort
+                                */
+                               if (!pid ||
+                                   (pid != getpid() && kill(pid, 0) == 0))
+                                       log_fatal("There's already a "
+                                                 "DHCP server running.");
+                       }
                }
-       }
-
-        /* Write new pid file. */
-        if ((i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644)) >= 0) {
-                sprintf(pbuf, "%d\n", (int) getpid());
-                IGNORE_RET (write(i, pbuf, strlen(pbuf)));
-                close(i);
-        } else {
-                log_error("Can't create PID file %s: %m.", path_dhcpd_pid);
-        }
 
+               /* Write new pid file. */
+               i = open(path_dhcpd_pid, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+               if (i >= 0) {
+                       sprintf(pbuf, "%d\n", (int) getpid());
+                       IGNORE_RET (write(i, pbuf, strlen(pbuf)));
+                       close(i);
+               } else {
+                       log_error("Can't create PID file %s: %m.",
+                                 path_dhcpd_pid);
+               }
+       }
 
        /* If we were requested to log to stdout on the command line,
           keep doing so; otherwise, stop. */
@@ -902,7 +914,7 @@ void postconf_initialization (int quiet)
                                   &global_scope, oc, MDL)) {
                s = dmalloc (db.len + 1, MDL);
                if (!s)
-                       log_fatal ("no memory for lease db filename.");
+                       log_fatal ("no memory for pid filename.");
                memcpy (s, db.data, db.len);
                s [db.len] = 0;
                data_string_forget (&db, MDL);
@@ -938,7 +950,7 @@ void postconf_initialization (int quiet)
                                           oc, MDL)) {
                         s = dmalloc (db.len + 1, MDL);
                         if (!s)
-                                log_fatal ("no memory for lease db filename.");
+                                log_fatal ("no memory for pid filename.");
                         memcpy (s, db.data, db.len);
                         s [db.len] = 0;
                         data_string_forget (&db, MDL);
@@ -1210,7 +1222,8 @@ usage(void) {
                  "             [-tf trace-output-file]\n"
                  "             [-play trace-input-file]\n"
 #endif /* TRACING */
-                 "             [-pf pid-file] [-s server] [if0 [...ifN]]");
+                 "             [-pf pid-file] [--no-pid] [-s server]\n"
+                 "             [if0 [...ifN]]");
 }
 
 void lease_pinged (from, packet, length)