--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/isc-dhcp/patches/nopidfile.patch Thu Jun 02 13:26:03 2011 -0700
@@ -0,0 +1,657 @@
+Index: DHCP/configure
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/configure,v
+retrieving revision 1.119
+retrieving revision 1.119.6.1
+diff -u -c -r1.119 -r1.119.6.1
+*** DHCP/configure 18 Feb 2011 18:48:44 -0000 1.119
+--- DHCP/configure 11 Apr 2011 21:12:20 -0000 1.119.6.1
+***************
+*** 1328,1333 ****
+--- 1328,1336 ----
+ --with-relay-pid-file=PATH
+ File for dhcrelay process information (default is
+ LOCALSTATEDIR/run/dhcrelay.pid)
++ --with-relay6-pid-file=PATH
++ File for dhcrelay6 process information (default is
++ LOCALSTATEDIR/run/dhcrelay6.pid)
+
+ Some influential environment variables:
+ CC C compiler command
+***************
+*** 5062,5067 ****
+--- 5065,5080 ----
+ fi
+
+
++ # Check whether --with-relay6-pid-file was given.
++ if test "${with_relay6_pid_file+set}" = set; then
++ withval=$with_relay6_pid_file;
++ cat >>confdefs.h <<_ACEOF
++ #define _PATH_DHCRELAY6_PID "$withval"
++ _ACEOF
++
++ fi
++
++
+ # Check basic types.
+
+ { echo "$as_me:$LINENO: checking for int8_t" >&5
+Index: DHCP/configure.ac
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/configure.ac,v
+retrieving revision 1.47
+retrieving revision 1.47.6.1
+diff -u -c -r1.47 -r1.47.6.1
+*** DHCP/configure.ac 18 Feb 2011 18:41:25 -0000 1.47
+--- DHCP/configure.ac 9 Apr 2011 00:03:51 -0000 1.47.6.1
+***************
+*** 317,322 ****
+--- 317,328 ----
+ (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: DHCP/client/dhclient.8
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/client/dhclient.8,v
+retrieving revision 1.35
+retrieving revision 1.35.56.2
+diff -u -c -r1.35 -r1.35.56.2
+*** DHCP/client/dhclient.8 14 Jul 2010 20:01:14 -0000 1.35
+--- DHCP/client/dhclient.8 12 Apr 2011 20:47:25 -0000 1.35.56.2
+***************
+*** 90,95 ****
+--- 90,98 ----
+ .I pid-file
+ ]
+ [
++ .B --no-pid
++ ]
++ [
+ .B -cf
+ .I config-file
+ ]
+***************
+*** 99,105 ****
+ ]
+ [
+ .B -s
+! .I server
+ ]
+ [
+ .B -g
+--- 102,108 ----
+ ]
+ [
+ .B -s
+! .I server-addr
+ ]
+ [
+ .B -g
+***************
+*** 305,311 ****
+ transmit, the client will also use a different destination port -
+ one less than the specified port.
+ .TP
+! .BI \-s \ server
+ Specify the server IP address or fully qualified domain name to use as
+ a destination for DHCP protocol messages before
+ .B dhclient
+--- 308,314 ----
+ transmit, the client will also use a different destination port -
+ one less than the specified port.
+ .TP
+! .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,386 ****
+--- 384,395 ----
+ .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: DHCP/client/dhclient.c
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/client/dhclient.c,v
+retrieving revision 1.178
+retrieving revision 1.178.2.2
+diff -u -c -r1.178 -r1.178.2.2
+*** DHCP/client/dhclient.c 24 Mar 2011 21:11:00 -0000 1.178
+--- DHCP/client/dhclient.c 12 Apr 2011 20:47:25 -0000 1.178.2.2
+***************
+*** 48,53 ****
+--- 48,56 ----
+ 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;
+***************
+*** 196,201 ****
+--- 199,206 ----
+ 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();
+***************
+*** 385,392 ****
+ log_fatal("%s: %s", path, strerror(errno));
+ }
+
+! /* first kill off any currently running client */
+! if (release_mode || exit_mode) {
+ FILE *pidfd;
+ pid_t oldpid;
+ long temp;
+--- 390,402 ----
+ log_fatal("%s: %s", path, strerror(errno));
+ }
+
+! /*
+! * 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;
+***************
+*** 677,692 ****
+ log_info(arr);
+ log_info(url);
+
+! log_error("Usage: dhclient %s %s",
+ #ifdef DHCPv6
+! "[-4|-6] [-SNTP1dvrx] [-nw] [-p <port>]",
+ #else /* DHCPv6 */
+! "[-1dvrx] [-nw] [-p <port>]",
+ #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]");
+ }
+
+ void run_stateless(int exit_mode)
+--- 687,703 ----
+ log_info(arr);
+ log_info(url);
+
+!
+! log_fatal("Usage: dhclient "
+ #ifdef DHCPv6
+! "[-4|-6] [-SNTP1dvrx] [-nw] [-p <port>]\n"
+ #else /* DHCPv6 */
+! "[-1dvrx] [-nw] [-p <port>]\n"
+ #endif /* DHCPv6 */
+! " [-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)
+***************
+*** 3369,3374 ****
+--- 3380,3390 ----
+ 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: DHCP/includes/config.h.in
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/includes/config.h.in,v
+retrieving revision 1.60
+retrieving revision 1.60.6.1
+diff -u -c -r1.60 -r1.60.6.1
+*** DHCP/includes/config.h.in 18 Feb 2011 18:48:15 -0000 1.60
+--- DHCP/includes/config.h.in 11 Apr 2011 21:12:03 -0000 1.60.6.1
+***************
+*** 175,180 ****
+--- 175,183 ----
+ /* File for dhcpd process information. */
+ #undef _PATH_DHCPD_PID
+
++ /* File for dhcrelay6 process information. */
++ #undef _PATH_DHCRELAY6_PID
++
+ /* File for dhcrelay process information. */
+ #undef _PATH_DHCRELAY_PID
+
+Index: DHCP/relay/dhcrelay.8
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/relay/dhcrelay.8,v
+retrieving revision 1.18
+retrieving revision 1.18.58.2
+diff -u -c -r1.18 -r1.18.58.2
+*** DHCP/relay/dhcrelay.8 2 Jul 2010 23:09:14 -0000 1.18
+--- DHCP/relay/dhcrelay.8 12 Apr 2011 20:47:26 -0000 1.18.58.2
+***************
+*** 54,59 ****
+--- 54,66 ----
+ .I length
+ ]
+ [
++ .B -pf
++ .I pid-file
++ ]
++ [
++ .B --no-pid
++ ]
++ [
+ .B -m
+ .I append
+ |
+***************
+*** 89,94 ****
+--- 96,108 ----
+ .B -c
+ .I count
+ ]
++ [
++ .B -pf
++ .I pid-file
++ ]
++ [
++ .B --no-pid
++ ]
+ .B -l
+ .I lower0
+ [
+***************
+*** 150,155 ****
+--- 164,176 ----
+ -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: DHCP/relay/dhcrelay.c
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/relay/dhcrelay.c,v
+retrieving revision 1.79
+retrieving revision 1.79.106.2
+diff -u -c -r1.79 -r1.79.106.2
+*** DHCP/relay/dhcrelay.c 2 Feb 2010 19:58:18 -0000 1.79
+--- DHCP/relay/dhcrelay.c 12 Apr 2011 20:47:26 -0000 1.79.106.2
+***************
+*** 49,54 ****
+--- 49,57 ----
+ 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,147 ****
+--- 141,152 ----
+ #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,154 ****
+--- 154,160 ----
+ #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,355 ****
+--- 356,368 ----
+ 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,411 ****
+ }
+ }
+
+! 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;
+! }
+ #endif
+
+ if (!quiet) {
+ log_info("%s %s", message, PACKAGE_VERSION);
+--- 407,430 ----
+ }
+ }
+
+! /*
+! * 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;
+! }
+ #endif
++ }
+
+ if (!quiet) {
+ log_info("%s %s", message, PACKAGE_VERSION);
+***************
+*** 519,538 ****
+ else if (pid)
+ exit(0);
+
+! 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);
+! }
+ }
+
+ close(0);
+--- 538,560 ----
+ else if (pid)
+ exit(0);
+
+! 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);
+! }
+! }
+ }
+
+ close(0);
+Index: DHCP/server/dhcpd.8
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/server/dhcpd.8,v
+retrieving revision 1.33
+retrieving revision 1.33.56.2
+diff -u -c -r1.33 -r1.33.56.2
+*** DHCP/server/dhcpd.8 14 Jul 2010 20:01:14 -0000 1.33
+--- DHCP/server/dhcpd.8 12 Apr 2011 20:47:26 -0000 1.33.56.2
+***************
+*** 75,80 ****
+--- 75,83 ----
+ .I pid-file
+ ]
+ [
++ .B --no-pid
++ ]
++ [
+ .B -tf
+ .I trace-output-file
+ ]
+***************
+*** 283,288 ****
+--- 286,296 ----
+ .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: DHCP/server/dhcpd.c
+===================================================================
+RCS file: /proj/cvs/prod/DHCP/server/dhcpd.c,v
+retrieving revision 1.156
+retrieving revision 1.156.42.2
+diff -u -c -r1.156 -r1.156.42.2
+*** DHCP/server/dhcpd.c 8 Sep 2010 22:13:05 -0000 1.156
+--- DHCP/server/dhcpd.c 12 Apr 2011 20:47:26 -0000 1.156.42.2
+***************
+*** 160,165 ****
+--- 160,167 ----
+ 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,356 ****
+--- 353,360 ----
+ 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,815 ****
+ }
+ #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.");
+ }
+- }
+-
+- /* 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);
+- }
+
+
+ /* If we were requested to log to stdout on the command line,
+ keep doing so; otherwise, stop. */
+--- 787,827 ----
+ }
+ #endif /* PARANOIA */
+
+! /*
+! * 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. */
++ 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,908 ****
+ &global_scope, oc, MDL)) {
+ s = dmalloc (db.len + 1, MDL);
+ if (!s)
+! log_fatal ("no memory for lease db filename.");
+ memcpy (s, db.data, db.len);
+ s [db.len] = 0;
+ data_string_forget (&db, MDL);
+--- 914,920 ----
+ &global_scope, oc, MDL)) {
+ s = dmalloc (db.len + 1, MDL);
+ if (!s)
+! log_fatal ("no memory for pid filename.");
+ memcpy (s, db.data, db.len);
+ s [db.len] = 0;
+ data_string_forget (&db, MDL);
+***************
+*** 938,944 ****
+ oc, MDL)) {
+ s = dmalloc (db.len + 1, MDL);
+ if (!s)
+! log_fatal ("no memory for lease db filename.");
+ memcpy (s, db.data, db.len);
+ s [db.len] = 0;
+ data_string_forget (&db, MDL);
+--- 950,956 ----
+ oc, MDL)) {
+ s = dmalloc (db.len + 1, MDL);
+ if (!s)
+! log_fatal ("no memory for pid filename.");
+ memcpy (s, db.data, db.len);
+ s [db.len] = 0;
+ data_string_forget (&db, MDL);
+***************
+*** 1210,1216 ****
+ " [-tf trace-output-file]\n"
+ " [-play trace-input-file]\n"
+ #endif /* TRACING */
+! " [-pf pid-file] [-s server] [if0 [...ifN]]");
+ }
+
+ void lease_pinged (from, packet, length)
+--- 1222,1229 ----
+ " [-tf trace-output-file]\n"
+ " [-play trace-input-file]\n"
+ #endif /* TRACING */
+! " [-pf pid-file] [--no-pid] [-s server]\n"
+! " [if0 [...ifN]]");
+ }
+
+ void lease_pinged (from, packet, length)