7079458 Update ISC DHCP to 4.1-ESV-R3
7078575 Problem with network/dhcp_server
7076635 isc-dhcp missing dependency on system/network for net_include.sh
--- a/components/isc-dhcp/Makefile Mon Aug 15 11:41:24 2011 -0700
+++ b/components/isc-dhcp/Makefile Mon Aug 15 13:46:43 2011 -0700
@@ -24,9 +24,9 @@
COMPONENT_NAME= dhcp
COMPONENT_VERSION= 4.1
-COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION)-ESV-R1
+COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION)-ESV-R3
COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.gz
-COMPONENT_ARCHIVE_HASH= sha1:64664b2fd3ce9e372785cbbef685f86ee3dcd53a
+COMPONENT_ARCHIVE_HASH= sha1:6fc5ad06b1192c76edb1a35980fcf070a393c075
COMPONENT_ARCHIVE_URL= http://ftp.isc.org/isc/dhcp/$(COMPONENT_ARCHIVE)
include ../../make-rules/prep.mk
@@ -39,7 +39,7 @@
CONFIGURE_OPTIONS += --sysconfdir=$(ETCDIR)/inet
CONFIGURE_OPTIONS += --sbindir=$(USRLIBDIR)/inet
CONFIGURE_OPTIONS += --bindir=$(USRSBINDIR)
-CONFIGURE_OPTIONS += CFLAGS="$(CFLAGS) -DUSE_SOCKETS"
+CONFIGURE_OPTIONS += --enable-use-sockets --enable-ipv4-pktinfo
build: $(BUILD_32)
--- a/components/isc-dhcp/dhcp.p5m Mon Aug 15 11:41:24 2011 -0700
+++ b/components/isc-dhcp/dhcp.p5m Mon Aug 15 13:46:43 2011 -0700
@@ -30,8 +30,7 @@
value=org.opensolaris.category.2008:System/Services
set name=info.source-url value=$(COMPONENT_ARCHIVE_URL)
set name=info.upstream-url value=http://www.isc.org/software/dhcp/
-set name=org.opensolaris.arc-caseid \
- value=PSARC/2011/043
+set name=org.opensolaris.arc-caseid value=PSARC/2011/043
set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
#
dir path=etc
@@ -94,3 +93,5 @@
license LICENSE license="ISC BSD"
user username=dhcpserv ftpuser=false gcos-field="DHCP Configuration Admin" \
group=netadm uid=18
+depend fmri=__TBD pkg.debug.depend.file=lib/svc/share/net_include.sh \
+ pkg.debug.reason=lib/svc/method/isc-dhcp type=require
--- a/components/isc-dhcp/patches/nopidfile.patch Mon Aug 15 11:41:24 2011 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,657 +0,0 @@
-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)
--- a/components/isc-dhcp/patches/sockets.patch Mon Aug 15 11:41:24 2011 -0700
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,457 +0,0 @@
---- dhcp-4.1-ESV-R1/common/discover.c Tue Sep 29 12:44:49 2009
-+++ dhcp-4.1-ESV-R1-patched/common/discover.c Thu May 26 11:49:33 2011
[email protected]@ -309,6 +309,7 @@
- next_iface(struct iface_info *info, int *err, struct iface_conf_list *ifaces) {
- struct LIFREQ *p;
- struct LIFREQ tmp;
-+ isc_boolean_t foundif;
- #if defined(sun) || defined(__linux)
- /* Pointer used to remove interface aliases. */
- char *s;
[email protected]@ -315,6 +316,7 @@
- #endif
-
- do {
-+ foundif = ISC_FALSE;
- if (ifaces->next >= ifaces->num) {
- *err = 0;
- return 0;
[email protected]@ -328,6 +330,13 @@
- log_error("Interface name '%s' too long", p->lifr_name);
- return 0;
- }
-+
-+ /* Reject if interface address family does not match */
-+ if (p->lifr_addr.ss_family != local_family) {
-+ ifaces->next++;
-+ continue;
-+ }
-+
- strcpy(info->name, p->lifr_name);
- memset(&info->addr, 0, sizeof(info->addr));
- memcpy(&info->addr, &p->lifr_addr, sizeof(p->lifr_addr));
[email protected]@ -340,7 +349,9 @@
- }
- #endif /* defined(sun) || defined(__linux) */
-
-- } while (strncmp(info->name, "dummy", 5) == 0);
-+ foundif = ISC_TRUE;
-+ } while ((foundif == ISC_FALSE) ||
-+ (strncmp(p->lifr_name, "dummy", 5) == 0));
-
- memset(&tmp, 0, sizeof(tmp));
- strcpy(tmp.lifr_name, info->name);
[email protected]@ -958,7 +969,12 @@
- point-to-point in case an OS incorrectly marks them
- as broadcast). Also skip down interfaces unless we're
- trying to get a list of configurable interfaces. */
-- if (((!(info.flags & IFF_BROADCAST) ||
-+ if ((((local_family == AF_INET &&
-+ !(info.flags & IFF_BROADCAST)) ||
-+#ifdef DHCPv6
-+ (local_family == AF_INET6 &&
-+ !(info.flags & IFF_MULTICAST)) ||
-+#endif
- info.flags & IFF_LOOPBACK ||
- info.flags & IFF_POINTOPOINT) && !tmp) ||
- (!(info.flags & IFF_UP) &&
[email protected]@ -1386,6 +1402,25 @@
- if (result < DHCP_FIXED_NON_UDP - DHCP_SNAME_LEN - DHCP_FILE_LEN)
- return ISC_R_UNEXPECTED;
-
-+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
-+ {
-+ /* We retrieve the ifindex from the unused hfrom variable */
-+ unsigned int ifindex;
-+
-+ memcpy(&ifindex, hfrom.hbuf, sizeof (ifindex));
-+
-+ /*
-+ * Seek forward from the first interface to find the matching
-+ * source interface by interface index.
-+ */
-+ ip = interfaces;
-+ while ((ip != NULL) && (if_nametoindex(ip->name) != ifindex))
-+ ip = ip->next;
-+ if (ip == NULL)
-+ return ISC_R_NOTFOUND;
-+ }
-+#endif
-+
- if (bootp_packet_handler) {
- ifrom.len = 4;
- memcpy (ifrom.iabuf, &from.sin_addr, ifrom.len);
[email protected]@ -1442,7 +1477,11 @@
- ifrom.len = 16;
- memcpy(ifrom.iabuf, &from.sin6_addr, ifrom.len);
-
-- /* Seek forward to find the matching source interface. */
-+ /*
-+ * Seek forward from the first interface to find the matching
-+ * source interface by interface index.
-+ */
-+ ip = interfaces;
- while ((ip != NULL) && (if_nametoindex(ip->name) != if_idx))
- ip = ip->next;
-
---- dhcp-4.1-ESV-R1/common/socket.c Tue Oct 5 17:32:52 2010
-+++ dhcp-4.1-ESV-R1-patched/common/socket.c Thu May 12 16:11:13 2011
[email protected]@ -45,6 +45,16 @@
- #include <sys/ioctl.h>
- #include <sys/uio.h>
- #include <sys/uio.h>
-+#if defined(sun)
-+#include <sys/sysmacros.h>
-+#include <net/if.h>
-+#include <sys/sockio.h>
-+#if defined(SIOCGLIFHWADDR)
-+#include <net/if_dl.h>
-+#else
-+#include <libdlpi.h>
-+#endif
-+#endif
- #include <signal.h>
-
- #ifdef USE_SOCKET_FALLBACK
[email protected]@ -67,6 +77,16 @@
- #endif
-
- /*
-+ * We can use a single socket for AF_INET (similar to AF_INET6) on all
-+ * interfaces configured for DHCP if the system has support for IP_PKTINFO
-+ * and IP_RECVPKTINFO (f.e. Solaris 11).
-+ */
-+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
-+static unsigned int global_v4_socket_references = 0;
-+static int global_v4_socket = -1;
-+#endif
-+
-+/*
- * If we can't bind() to a specific interface, then we can only have
- * a single socket. This variable insures that we don't try to listen
- * on two sockets.
[email protected]@ -242,6 +262,20 @@
- log_fatal("Can't set IP_BROADCAST_IF on dhcp socket: %m");
- #endif
-
-+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
-+ /*
-+ * If we turn on IP_RECVPKTINFO we will be able to receive
-+ * the interface index information of the received packet.
-+ */
-+ if (family == AF_INET) {
-+ int on = 1;
-+ if (setsockopt(sock, IPPROTO_IP, IP_RECVPKTINFO,
-+ &on, sizeof(on)) != 0) {
-+ log_fatal("setsockopt: IPV_RECVPKTINFO: %m");
-+ }
-+ }
-+#endif
-+
- #ifdef DHCPv6
- /*
- * If we turn on IPV6_PKTINFO, we will be able to receive
[email protected]@ -275,10 +309,6 @@
- }
- #endif /* DHCPv6 */
-
-- /* If this is a normal IPv4 address, get the hardware address. */
-- if ((local_family == AF_INET) && (strcmp(info->name, "fallback") != 0))
-- get_hw_addr(info->name, &info->hw_address);
--
- return sock;
- }
- #endif /* USE_SOCKET_SEND || USE_SOCKET_RECEIVE || USE_SOCKET_FALLBACK */
[email protected]@ -328,9 +358,25 @@
- void if_register_receive (info)
- struct interface_info *info;
- {
-+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
-+ if (global_v4_socket_references == 0) {
-+ global_v4_socket = if_register_socket(info, AF_INET, 0);
-+ if (global_v4_socket < 0) {
-+ /*
-+ * if_register_socket() fatally logs if it fails to
-+ * create a socket, this is just a sanity check.
-+ */
-+ log_fatal("Failed to create AF_INET socket %s:%d", MDL);
-+ }
-+ }
-+
-+ info->rfdesc = global_v4_socket;
-+ global_v4_socket_references++;
-+#else
- /* If we're using the socket API for sending and receiving,
- we don't need to register this interface twice. */
- info -> rfdesc = if_register_socket (info, AF_INET, 0);
-+#endif
- if (!quiet_interface_discovery)
- log_info ("Listening on Socket/%s%s%s",
- info -> name,
[email protected]@ -337,13 +383,34 @@
- (info -> shared_network ? "/" : ""),
- (info -> shared_network ?
- info -> shared_network -> name : ""));
-+
-+ /* If this is a normal IPv4 address, get the hardware address. */
-+ if (strcmp(info->name, "fallback") != 0)
-+ get_hw_addr(info->name, &info->hw_address);
- }
-
- void if_deregister_receive (info)
- struct interface_info *info;
- {
-+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
-+ /* Dereference the global v4 socket. */
-+ if ((info->rfdesc == global_v4_socket) &&
-+ (info->wfdesc == global_v4_socket) &&
-+ (global_v4_socket_references > 0)) {
-+ global_v4_socket_references--;
-+ info->rfdesc = -1;
-+ } else {
-+ log_fatal("Impossible condition at %s:%d", MDL);
-+ }
-+
-+ if (global_v4_socket_references == 0) {
-+ close(global_v4_socket);
-+ global_v4_socket = -1;
-+ }
-+#else
- close (info -> rfdesc);
- info -> rfdesc = -1;
-+#endif
-
- if (!quiet_interface_discovery)
- log_info ("Disabling input on Socket/%s%s%s",
[email protected]@ -489,6 +556,17 @@
- int retry = 0;
- do {
- #endif
-+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
-+ struct in_pktinfo pktinfo;
-+
-+ if (interface->ifp != NULL) {
-+ memset(&pktinfo, 0, sizeof (pktinfo));
-+ pktinfo.ipi_ifindex = interface->ifp->ifr_index;
-+ if (setsockopt(interface -> wfdesc, IPPROTO_IP,
-+ IP_PKTINFO, (char *)&pktinfo, sizeof (pktinfo)) < 0)
-+ log_fatal("setsockopt: IP_PKTINFO: %m");
-+ }
-+#endif
- result = sendto (interface -> wfdesc, (char *)raw, len, 0,
- (struct sockaddr *)to, sizeof *to);
- #ifdef IGNORE_HOSTUNREACH
[email protected]@ -559,11 +637,13 @@
-
- #endif /* DHCPv6 */
-
--#ifdef DHCPv6
-+#ifdef DHCPv6 || (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO))
- /*
- * For both send_packet6() and receive_packet6() we need to allocate
- * space for the cmsg header information. We do this once and reuse
-- * the buffer.
-+ * the buffer. We also need the control buf for send_packet and
-+ * receive_packet for AF_INET when we use a single socket and IP_PKTINFO
-+ * to send the packet out the right interface.
- */
- static void *control_buf = NULL;
- static size_t control_buf_len = 0;
[email protected]@ -574,7 +654,9 @@
- control_buf = dmalloc(control_buf_len, MDL);
- return;
- }
-+#endif
-
-+#ifdef DHCPv6
- /*
- * For both send_packet6() and receive_packet6() we need to use the
- * sendmsg()/recvmsg() functions rather than the simpler send()/recv()
[email protected]@ -687,8 +769,97 @@
- int retry = 0;
- do {
- #endif
-+#if defined(IP_PKTINFO) && defined(IP_RECVPKTINFO)
-+ struct msghdr m;
-+ struct iovec v;
-+ struct cmsghdr *cmsg;
-+ struct in_pktinfo *pktinfo;
-+ unsigned int ifindex;
-+ int found_pktinfo;
-+
-+ /*
-+ * If necessary allocate space for the control message header.
-+ * The space is common between send and receive.
-+ */
-+ if (control_buf == NULL) {
-+ allocate_cmsg_cbuf();
-+ if (control_buf == NULL) {
-+ log_error("receive_packet: unable to allocate cmsg "
-+ "header");
-+ return(ENOMEM);
-+ }
-+ }
-+ memset(control_buf, 0, control_buf_len);
-+
-+ /*
-+ * Initialize our message header structure.
-+ */
-+ memset(&m, 0, sizeof(m));
-+
-+ /*
-+ * Point so we can get the from address.
-+ */
-+ m.msg_name = from;
-+ m.msg_namelen = sizeof(*from);
-+
-+ /*
-+ * Set the data buffer we're receiving. (Using this wacky
-+ * "scatter-gather" stuff... but we that doesn't really make
-+ * sense for us, so we use a single vector entry.)
-+ */
-+ v.iov_base = buf;
-+ v.iov_len = len;
-+ m.msg_iov = &v;
-+ m.msg_iovlen = 1;
-+
-+ /*
-+ * Getting the interface is a bit more involved.
-+ *
-+ * We set up some space for a "control message". We have
-+ * previously asked the kernel to give us packet
-+ * information (when we initialized the interface), so we
-+ * should get the destination address from that.
-+ */
-+ m.msg_control = control_buf;
-+ m.msg_controllen = control_buf_len;
-+
-+ result = recvmsg(interface->rfdesc, &m, 0);
-+
-+ if (result >= 0) {
-+ /*
-+ * If we did read successfully, then we need to loop
-+ * through the control messages we received and
-+ * find the one with our destination address.
-+ *
-+ * We also keep a flag to see if we found it. If we
-+ * didn't, then we consider this to be an error.
-+ */
-+ found_pktinfo = 0;
-+ cmsg = CMSG_FIRSTHDR(&m);
-+ while (cmsg != NULL) {
-+ if ((cmsg->cmsg_level == IPPROTO_IP) &&
-+ (cmsg->cmsg_type == IP_PKTINFO)) {
-+ pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
-+ ifindex = pktinfo->ipi_ifindex;
-+ /*
-+ * We pass the ifindex back to the caller using
-+ * the unused hfrom parameter avoiding interface
-+ * changes between sockets and the discover code.
-+ */
-+ memcpy(hfrom->hbuf, &ifindex, sizeof (ifindex));
-+ found_pktinfo = 1;
-+ }
-+ cmsg = CMSG_NXTHDR(&m, cmsg);
-+ }
-+ if (!found_pktinfo) {
-+ result = -1;
-+ errno = EIO;
-+ }
-+ }
-+#else
- result = recvfrom (interface -> rfdesc, (char *)buf, len, 0,
- (struct sockaddr *)from, &flen);
-+#endif
- #ifdef IGNORE_HOSTUNREACH
- } while (result < 0 &&
- (errno == EHOSTUNREACH ||
[email protected]@ -842,7 +1013,7 @@
- int supports_multiple_interfaces (ip)
- struct interface_info *ip;
- {
--#if defined (SO_BINDTODEVICE)
-+#if defined (SO_BINDTODEVICE) || (defined(IP_PKTINFO) && defined(IP_RECVPKTINFO))
- return 1;
- #else
- return 0;
[email protected]@ -876,6 +1047,80 @@
- }
- #endif
- }
-+
-+#if defined(sun)
-+void
-+get_hw_addr(const char *name, struct hardware *hw) {
-+#if defined(SIOCGLIFHWADDR)
-+ struct sockaddr_dl *dladdrp;
-+#else
-+ dlpi_handle_t dh;
-+ uint8_t pa_buf[DLPI_PHYSADDR_MAX];
-+ size_t len = sizeof (pa_buf);
-+#endif
-+ int rv, sock, i;
-+ struct lifreq lifr;
-+
-+ memset(&lifr, 0, sizeof (lifr));
-+ (void) strlcpy(lifr.lifr_name, name, sizeof (lifr.lifr_name));
-+ /*
-+ * Check if the interface is a virtual or IPMP interface - in those
-+ * cases it has no hw address, so generate a random one.
-+ */
-+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ||
-+ ioctl(sock, SIOCGLIFFLAGS, &lifr) < 0) {
-+ /*
-+ * If the interface only has IPv6, try this with an IPv6 socket.
-+ */
-+ if (sock != -1)
-+ (void) close(sock);
-+
-+ if ((sock = socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ||
-+ ioctl(sock, SIOCGLIFFLAGS, &lifr) < 0) {
-+ log_fatal("Couldn't get interface flags for %s: %m", name);
-+ }
-+ }
-+
-+ if (lifr.lifr_flags & (IFF_VIRTUAL|IFF_IPMP)) {
-+ hw->hlen = sizeof (hw->hbuf);
-+ srandom((long)gethrtime());
-+
-+ for (i = 0; i < hw->hlen; ++i) {
-+ hw->hbuf[i] = random() % 256;
-+ }
-+
-+ if (sock != -1)
-+ (void) close(sock);
-+ return;
-+ }
-+
-+#if defined(SIOCGLIFHWADDR)
-+ if (ioctl(sock, SIOCGLIFHWADDR, &lifr) < 0)
-+ log_fatal("Couldn't get interface hardware address for %s: %m", name);
-+ dladdrp = (struct sockaddr_dl *)&lifr.lifr_addr;
-+ hw->hlen = dladdrp->sdl_alen;
-+ memcpy(hw->hbuf, LLADDR(dladdrp), hw->hlen);
-+#else
-+ if ((rv = dlpi_open(name, &dh, 0)) != DLPI_SUCCESS) {
-+ log_fatal("Couldn't open DLPI device for %s: %s", name,
-+ dlpi_strerror(rv));
-+ }
-+
-+ if ((rv = dlpi_get_physaddr(dh, DL_CURR_PHYS_ADDR, pa_buf, &len))
-+ != DLPI_SUCCESS) {
-+ log_fatal("Couldn't get physical address for device %s: %s",
-+ name, dlpi_strerror(rv));
-+ }
-+
-+ hw->hlen = MIN(sizeof (hw->hbuf), len);
-+ memcpy(hw->hbuf, pa_buf, hw->hlen);
-+
-+ dlpi_close(dh);
-+#endif
-+ if (sock != -1)
-+ (void) close(sock);
-+}
-+#endif /* defined(sun) */
- #endif /* USE_SOCKET_SEND */
-
- /*