Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37427373
en ru br
Репозитории ALT
S:9.4.0-alt2
D:4.0.0-alt0.1.rc4
5.1: 4.0.15-alt4.M51.1
4.1: 3.0.17-alt4
4.0: 3.0.17-alt2.M40.1
3.0: 1.3.22pl4-alt3
+backports:3.0.17-alt3.M30
www.altlinux.org/Changes

Группа :: Система/Серверы
Пакет: dhcpcd

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: dhcpcd-4.0.15-alt4.M51.1.patch
Скачать


 bpf-filter.h                    |    2 +
 client.c                        |    1 +
 common.c                        |    4 +-
 common.h                        |    2 +-
 dhcp.c                          |    5 +++
 dhcpcd-hooks/10-mtu             |    2 +-
 dhcpcd-hooks/20-resolv.conf     |   33 ++++++++++++++++++++----
 dhcpcd-hooks/29-lookup-hostname |    2 +-
 dhcpcd-hooks/30-hostname        |   13 ++++++++-
 dhcpcd-hooks/50-dhcpcd-compat   |    6 ++--
 dhcpcd-hooks/50-ntp.conf        |   50 ++++++++++++++++++++++++------------
 dhcpcd-hooks/50-yp.conf         |    5 +++
 dhcpcd-run-hooks.8.in           |    8 ++++++
 dhcpcd-run-hooks.in             |   52 +++++++++++++++++++++++++++++++++++++++
 dhcpcd.c                        |   11 +++-----
 dhcpcd.conf                     |    9 ++++++
 if-linux.c                      |   38 ++++++++++++++++++++++------
 logger.c                        |   13 ++++++++-
 net.c                           |   18 ++++++-------
 19 files changed, 214 insertions(+), 60 deletions(-)
diff --git a/bpf-filter.h b/bpf-filter.h
index 881f678..4e48951 100644
--- a/bpf-filter.h
+++ b/bpf-filter.h
@@ -24,6 +24,8 @@
  * SUCH DAMAGE.
  */
 
+#include <net/if_arp.h>
+
 #ifndef BPF_ETHCOOK
 # define BPF_ETHCOOK 0
 #endif
diff --git a/client.c b/client.c
index 90657b3..363741d 100644
--- a/client.c
+++ b/client.c
@@ -29,6 +29,7 @@
 #include <sys/time.h>
 #include <sys/types.h>
 #include <arpa/inet.h>
+#include <net/if_arp.h>
 
 #ifdef __linux__
 # include <netinet/ether.h>
diff --git a/common.c b/common.c
index da22a5c..8d88884 100644
--- a/common.c
+++ b/common.c
@@ -93,10 +93,10 @@ uint32_t arc4random(void)
 			seed = time(0);
 		if (fd >= 0)
 			close(fd);
-		srandom(seed);
+		srand(seed);
 	}
 
-	return (uint32_t)random();
+	return (uint32_t)rand();
 }
 #endif
 
diff --git a/common.h b/common.h
index 2522663..6959be2 100644
--- a/common.h
+++ b/common.h
@@ -44,7 +44,7 @@
 #endif
 
 #ifndef HAVE_ARC4RANDOM
-# ifdef __GLIBC__
+# if defined(__GLIBC__) || defined(__dietlibc__)
 uint32_t arc4random(void);
 #else
 # define HAVE_ARC4RANDOM
diff --git a/dhcp.c b/dhcp.c
index aed06bf..ab7b6ec 100644
--- a/dhcp.c
+++ b/dhcp.c
@@ -31,6 +31,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <net/if_arp.h>
 
 #include "config.h"
 #include "common.h"
@@ -936,6 +937,8 @@ make_message(struct dhcp_message **message,
 		n_params = p;
 		*p++ = 0;
 		for (opt = dhcp_opts; opt->option; opt++) {
+			if (has_option_mask (options->nomask, opt->option))
+				continue;
 			if (!(opt->type & REQUEST || 
 			      has_option_mask(options->requestmask, opt->option)))
 				continue;
@@ -1056,6 +1059,8 @@ print_string(char *s, ssize_t len, int dl, const uint8_t *data)
 			case '$':  /* FALLTHROUGH */
 			case '`':  /* FALLTHROUGH */
 			case '\\': /* FALLTHROUGH */
+			case '|':  /* FALLTHROUGH */
+			case '&':
 				if (s) {
 					if (len < 3) {
 						errno = ENOBUFS;
diff --git a/dhcpcd-hooks/10-mtu b/dhcpcd-hooks/10-mtu
index 4265b48..08c9167 100644
--- a/dhcpcd-hooks/10-mtu
+++ b/dhcpcd-hooks/10-mtu
@@ -1,5 +1,5 @@
 # Configure the MTU for the interface
 
 if [ -n "${new_interface_mtu}" ]; then
-	ifconfig "${interface}" mtu "${new_interface_mtu}"
+	ip link set ${interface} mtu ${new_interface_mtu}
 fi
diff --git a/dhcpcd-hooks/20-resolv.conf b/dhcpcd-hooks/20-resolv.conf
index e757ddf..717c05d 100644
--- a/dhcpcd-hooks/20-resolv.conf
+++ b/dhcpcd-hooks/20-resolv.conf
@@ -7,11 +7,12 @@
 # or dnsmasq. This is important as the libc resolver isn't that powerful.
 
 resolv_conf_dir="${state_dir}/resolv.conf"
+uchrooted=/sbin/update_chrooted
 
 build_resolv_conf()
 {
 	local cf="/etc/resolv.conf.${interface}"
-	local interfaces= header= search= srvs= servers= x=
+	local interfaces= header= domain= search= srvs= servers= x=
 
 	# Build a list of interfaces
 	interfaces=$(list_interfaces "${resolv_conf_dir}")
@@ -24,8 +25,11 @@ build_resolv_conf()
 		done
 
 		# Build the search list
-		search=$(cd "${resolv_conf_dir}"; \
+		domain=$(cd "$resolv_conf_dir"; \
+			key_get_value "domain " ${interfaces})
+		search=$(cd "$resolv_conf_dir"; \
 			key_get_value "search " ${interfaces})
+		[ -n "$domain" ] && domain="domain $domain\n"
 		[ -n "${search}" ] && search="search $(uniqify ${search})\n"
 
 		# Build the nameserver list
@@ -45,13 +49,14 @@ build_resolv_conf()
 	else
 		echo "# /etc/resolv.conf.head can replace this line" >> "${cf}"
 	fi
-	printf "${search}${servers}" >> "${cf}"
+	printf "${domain}${search}${servers}" >> "${cf}"
 	if [ -f /etc/resolv.conf.tail ]; then
 		cat /etc/resolv.conf.tail >> "${cf}"
 	else
 		echo "# /etc/resolv.conf.tail can replace this line" >> "${cf}"
 	fi
 	mv -f "${cf}" /etc/resolv.conf
+    [ ! -x "$uchrooted" ] || "$uchrooted" conf
 }
 
 add_resolv_conf()
@@ -66,10 +71,26 @@ add_resolv_conf()
 		return $?
 	fi
 
+	if [ -n "$new_domain_name" ]; then
+		set -- $new_domain_name
+		new_domain_name="$1"
+		if valid_domainname "$new_domain_name"; then
+			conf="${conf}domain $new_domain_name\n"
+		else
+			syslog err "Invalid domain name: $new_domain_name"
+		fi
+		# Support RFC violating search in domain
+		if [ -z "$new_domain_search" -a -n "$2" ]; then
+			new_domain_search="$@"
+		fi
+	fi
+
 	if [ -n "${new_domain_search}" ]; then
-		conf="${conf}search ${new_domain_search}\n"
-	elif [ -n "${new_domain_name}" ]; then
-		conf="${conf}search ${new_domain_name}\n"
+		if valid_domainname_list "$new_domain_search"; then
+			conf="${conf}search ${new_domain_search}\n"
+		else
+			syslog err "Invalid domain name: $new_domain_search"
+		fi
 	fi
 	for x in ${new_domain_name_servers}; do
 		conf="${conf}nameserver ${x}\n"
diff --git a/dhcpcd-hooks/29-lookup-hostname b/dhcpcd-hooks/29-lookup-hostname
index 3dfade3..f592c31 100644
--- a/dhcpcd-hooks/29-lookup-hostname
+++ b/dhcpcd-hooks/29-lookup-hostname
@@ -8,7 +8,7 @@ lookup_hostname()
 	if type dig >/dev/null 2>&1; then
 		h=`dig +short -x ${new_ip_address}`
 		if [ $? = 0 ]; then
-			echo "${h}" | sed 's/\.$//'
+			echo "${h%.}"
 			return 0
 		fi
 	elif type host >/dev/null 2>&1; then
diff --git a/dhcpcd-hooks/30-hostname b/dhcpcd-hooks/30-hostname
index b2e5fc8..903c573 100644
--- a/dhcpcd-hooks/30-hostname
+++ b/dhcpcd-hooks/30-hostname
@@ -12,13 +12,22 @@ need_hostname()
 	esac
 }
 
+try_hostname()
+{
+	if valid_domainname "$1"; then
+		hostname "$1"
+	else
+		syslog err "Invalid hostname: $1"
+	fi
+}
+
 set_hostname()
 {
 	if need_hostname; then
 		if [ -n "${new_host_name}" ]; then
-			hostname "${new_host_name}"
+			try_hostname "${new_host_name}"
 		else
-			hostname "${new_fqdn_name}"
+			try_hostname "${new_fqdn_name}"
 		fi
 	fi
 }
diff --git a/dhcpcd-hooks/50-dhcpcd-compat b/dhcpcd-hooks/50-dhcpcd-compat
index bb31fd3..f37e7b0 100644
--- a/dhcpcd-hooks/50-dhcpcd-compat
+++ b/dhcpcd-hooks/50-dhcpcd-compat
@@ -30,12 +30,12 @@ BOUND|INFORM|REBIND|REBOOT|TEST|TIMEOUT|IPV4LL) x="new";;
 esac
 
 if [ "${reason}" != "down" ]; then
-	rm -f /var/lib/dhcpcd-"${INTERFACE}".info
+	rm -f /var/lib/dhcpcd/dhcpcd-"${INTERFACE}".info
 	for x in IPADDR INTERFACE NETMASK BROADCAST NETWORK DHCPSID GATEWAYS \
 		DNSSERVERS DNSDOMAIN DNSSEARCH NISDOMAIN NISSERVERS \
 		NTPSERVERS GATEWAY DNS; do
-		eval echo "${x}=\'\$${x}\'" >> /var/lib/dhcpcd-"${INTERFACE}".info
+		eval echo "${x}=\'\$${x}\'" >> /var/lib/dhcpcd/dhcpcd-"${INTERFACE}".info
 	done
 fi
 
-set -- /var/lib/dhcpcd-"${INTERFACE}".info "${x}"
+set -- /var/lib/dhcpcd/dhcpcd-"${INTERFACE}".info "${x}"
diff --git a/dhcpcd-hooks/50-ntp.conf b/dhcpcd-hooks/50-ntp.conf
index 8c92f27..9c34a21 100644
--- a/dhcpcd-hooks/50-ntp.conf
+++ b/dhcpcd-hooks/50-ntp.conf
@@ -8,24 +8,21 @@
 #   NTP_CONF=/usr/pkg/etc/ntpd.conf
 # to use openntpd from pkgsrc instead of the system provided ntp.
 
-# Detect OpenRC or BSD rc
-# Distributions may want to just have their command here instead of this
-if type rc-service >/dev/null 2>&1 && rc-service --exists ntpd; then
-	ntpd_restart_cmd="rc-service ntpd -- --ifstarted --quiet restart"
-elif [ -x /etc/rc.d/ntpd ]; then
-	ntpd_restart_cmd="/etc/rc.d/ntpd status && /etc/rc.d/ntpd restart"
-elif [ -x /usr/local/etc/rc.d/ntpd ]; then
-	ntpd_restart_cmd="/usr/local/etc/rc.d/ntpd status && /usr/local/etc/rc.d/ntpd restart"
+if [ -x /etc/init.d/ntpd ]; then
+	ntpd_restart_cmd="/sbin/service ntpd condrestart"
 fi
 
 ntp_conf_dir="${state_dir}/ntp.conf"
-ntp_conf=${NTP_CONF:-/etc/ntp.conf}
 
 build_ntp_conf()
 {
+	local ntp_conf="$1"
+	local server_keyword=${2:-server}
 	local cf="${ntp_conf}.${interface}"
 	local interfaces= header= srvs= servers= x=
 
+	[ -w ${ntp_conf} ] || return 1
+
 	# Build a list of interfaces
 	interfaces=$(list_interfaces "${ntp_conf_dir}")
 
@@ -40,7 +37,7 @@ build_ntp_conf()
 			key_get_value "server " ${interfaces})
 		if [ -n "${srvs}" ]; then
 			for x in $(uniqify ${srvs}); do
-				servers="${servers}server ${x}\n"
+				servers="${servers}${server_keyword} ${x}\n"
 			done
 		fi
 	fi
@@ -48,17 +45,36 @@ build_ntp_conf()
 	# Merge our config into ntp.conf
 	[ -e "${cf}" ] && rm -f "${cf}"
 	remove_markers "${signature_base}" "${signature_base_end}" \
-		/etc/ntp.conf > "${cf}"
+		${ntp_conf} > "${cf}"
 	if [ -n "${servers}" ]; then
 		echo "${signature_base}${header:+ ${from} }${header}" >> "${cf}"
-		printf "${search}${servers}" >> "${cf}"
+		printf "${servers}" >> "${cf}"
 		echo "${signature_base_end}${header:+ ${from} }${header}" >> "${cf}"
 	fi
 
-	# If we changed anything, restart ntpd
-	if change_file "${ntp_conf}" "${cf}"; then
-		[ -n "${ntpd_restart_cmd}" ] && eval ${ntpd_restart_cmd}
+	# If we changed anything, will restart ntpd
+	change_file "${ntp_conf}" "${cf}"
+}
+
+
+build_all_ntp_conf()
+{
+	local ret=1
+	if [ -n "$NTP_CONF" ]; then
+		build_ntp_conf "$NTP_CONF" && ret=0
+	else 
+		#for openntpd will be used "servers" keyword instead "server"
+		build_ntp_conf "/etc/ntpd.conf" "servers" && ret=0
+
+		build_ntp_conf "/etc/ntp.conf" && ret=0
 	fi
+
+	return ${ret}
+}
+
+restart_ntpd()
+{
+	[ -n "${ntpd_restart_cmd}" ] && eval ${ntpd_restart_cmd}
 }
 
 add_ntp_conf()
@@ -72,7 +88,7 @@ add_ntp_conf()
 			echo "server ${x}" >> "${cf}"
 		done
 	fi
-	build_ntp_conf
+	build_all_ntp_conf && restart_ntpd
 }
 
 remove_ntp_conf()
@@ -80,7 +96,7 @@ remove_ntp_conf()
 	if [ -e "${ntp_conf_dir}/${interface}" ]; then
 		rm "${ntp_conf_dir}/${interface}"
 	fi
-	build_ntp_conf
+	build_all_ntp_conf && restart_ntpd
 }
 
 case "${reason}" in
diff --git a/dhcpcd-hooks/50-yp.conf b/dhcpcd-hooks/50-yp.conf
index a2296eb..99506aa 100644
--- a/dhcpcd-hooks/50-yp.conf
+++ b/dhcpcd-hooks/50-yp.conf
@@ -13,6 +13,11 @@ make_yp_conf()
 	rm -f "${cf}"
 	echo "${signature}" > "${cf}"
 	if [ -n "${new_nis_domain}" ]; then
+		if ! valid_domainname "$new_nis_domain"; then
+			syslog err "Invalid NIS domain name: $new_nis_domain"
+			rm -f "$cf"
+			return 1
+		fi
 		domainname "${new_nis_domain}"
 		if [ -n "${new_nis_servers}" ]; then
 			prefix="domain ${new_nis_domain} server "
diff --git a/dhcpcd-run-hooks.8.in b/dhcpcd-run-hooks.8.in
index 6776cf8..ae8846d 100644
--- a/dhcpcd-run-hooks.8.in
+++ b/dhcpcd-run-hooks.8.in
@@ -112,3 +112,11 @@ in a lexical order and then finally
 .An Roy Marples <roy@marples.name>
 .Sh BUGS
 Please report them to http://roy.marples.name/projects/dhcpcd
+.Sh SECURITY CONSIDERATIONS
+Little validation of DHCP options is done in dhcpcd itself.
+Instead, it is up to the hooks to handle any validation needed.
+To this end, some helper functions are provided, such as valid_domainname as
+used by the
+.Pa 20-resolv.conf
+hook to ensure that the hostname is not set to an invalid value.
+valid_path is also provided, but is currently unused by a stock hook script.
diff --git a/dhcpcd-run-hooks.in b/dhcpcd-run-hooks.in
index a848260..c53cf8e 100644
--- a/dhcpcd-run-hooks.in
+++ b/dhcpcd-run-hooks.in
@@ -115,6 +115,58 @@ restore_conf()
 	mv -f "$1"-pre."${interface}" "$1"
 }
 
+# Write a syslog entry
+syslog()
+{
+	local lvl="$1"
+
+	[ -n "$lvl" ] && shift
+	if [ -n "$*" ]; then
+		if type logger >/dev/null 2>&1; then
+			logger -t dhcpcd -p daemon."$lvl" -s "$*"
+		fi
+	fi
+}
+
+# Check for a valid domain name as per RFC1123 with the exception of
+# allowing - and _ as they seem to be widely used.
+valid_domainname()
+{
+	local name="$1" label
+
+	[ -z "$name" -o ${#name} -gt 255 ] && return 1
+
+	while [ -n "$name" ]; do
+		label="${name%%.*}"
+		[ -z "$label" -o ${#label} -gt 63 ] && return 1
+		case "$label" in
+			-*|_*|*-|*_)		return 1;;
+			*[![:alnum:]-_]*)	return 1;;
+		esac
+		[ "$name" = "${name#*.}" ] && break
+		name="${name#*.}"
+	done
+	return 0
+}
+
+valid_domainname_list()
+{
+	local name
+
+	for name in $@; do
+		valid_domainname "$name" || return $?
+	done
+	return 0
+}
+
+# Check for a valid path
+valid_path()
+{
+	case "$@" in
+		*[![:alnum:]#%+-_:\.,@~\\/\[\]=\ ]*) return 1;;
+	esac
+	return 0
+}
 
 # We source each script into this one so that scripts run earlier can
 # remove variables from the environment so later scripts don't see them.
diff --git a/dhcpcd.c b/dhcpcd.c
index 1b2e600..6543b56 100644
--- a/dhcpcd.c
+++ b/dhcpcd.c
@@ -602,7 +602,6 @@ main(int argc, char **argv)
 	struct options *options;
 	int opt;
 	int option_index = 0;
-	char *prefix;
 	pid_t pid;
 	int debug = 0;
 	int i, r;
@@ -620,7 +619,7 @@ main(int argc, char **argv)
 	/* Saves calling fflush(stream) in the logger */
 	setlinebuf(stdout);
 	openlog(PACKAGE, LOG_PID, LOG_DAEMON);
-	setlogprefix(PACKAGE ": ");
+	setlogprefix(PACKAGE);
 
 	options = xzalloc(sizeof(*options));
 	options->options |= DHCPCD_GATEWAY | DHCPCD_DAEMONISE;
@@ -653,7 +652,8 @@ main(int argc, char **argv)
 	/* Ensure that the hostname is NULL terminated */ 
 	options->hostname[HOSTNAME_MAX_LEN] = '\0';
 	if (strcmp(options->hostname, "(none)") == 0 ||
-	    strcmp(options->hostname, "localhost") == 0)
+	    strcmp(options->hostname, "localhost") == 0 ||
+	    strcmp(options->hostname, "localhost.localdomain") == 0)
 		options->hostname[0] = '\0';
 
 	while ((opt = getopt_long(argc, argv, OPTS EXTRA_OPTS,
@@ -849,12 +849,9 @@ main(int argc, char **argv)
 		}
 	}
 
-	prefix = xmalloc(sizeof(char) * (IF_NAMESIZE + 3));
-	snprintf(prefix, IF_NAMESIZE, "%s: ", options->interface);
-	setlogprefix(prefix);
+	setlogprefix(options->interface);
 	snprintf(options->pidfile, sizeof(options->pidfile), PIDFILE,
 		 options->interface);
-	free(prefix);
 
 	if (options->request_address.s_addr == 0 &&
 	    (options->options & DHCPCD_INFORM ||
diff --git a/dhcpcd.conf b/dhcpcd.conf
index cce1795..8be414d 100644
--- a/dhcpcd.conf
+++ b/dhcpcd.conf
@@ -11,3 +11,12 @@ option ntp_servers
 # However, a lot of buggy DHCP servers set invalid MTUs so this is not
 # enabled by default.
 #option interface_mtu
+
+# Don't attempt to obtain an IPv4LL address if we failed to get one via DHCP.
+noipv4ll
+
+#Don`t attempt to lookup the hostname in DNS by default
+nohook lookup-hostname
+
+#Don't send any ARP requests.
+noarp
diff --git a/if-linux.c b/if-linux.c
index a754554..19affcb 100644
--- a/if-linux.c
+++ b/if-linux.c
@@ -56,8 +56,6 @@
 #include "dhcp.h"
 #include "net.h"
 
-#define BUFFERLEN 256
-
 int
 open_link_socket(struct interface *iface)
 {
@@ -83,14 +81,38 @@ get_netlink(int fd, int flags,
 	    int (*callback)(struct nlmsghdr *, const char *),
 	    const char *ifname)
 {
-	char *buffer = NULL;
-	ssize_t bytes;
+	char *buf = NULL, *nbuf;
+	ssize_t buflen = 0, bytes;
 	struct nlmsghdr *nlm;
 	int r = -1;
 
-	buffer = xzalloc(sizeof(char) * BUFFERLEN);
 	for (;;) {
-		bytes = recv(fd, buffer, BUFFERLEN, flags);
+		bytes = recv(fd, NULL, 0,
+		    flags | MSG_PEEK | MSG_DONTWAIT | MSG_TRUNC);
+		if (bytes == -1) {
+			if (errno == EAGAIN) {
+				r = 0;
+				goto eexit;
+			}
+			if (errno == EINTR)
+				continue;
+			goto eexit;
+		} else if (bytes == buflen) {
+			/* Support kernels older than 2.6.22 */
+			if (bytes == 0)
+				bytes = 512;
+			else
+				bytes *= 2;
+		}
+		if (buflen < bytes) {
+			/* Alloc 1 more so we work with older kernels */
+			buflen = bytes + 1;
+			nbuf = realloc(buf, buflen);
+			if (nbuf == NULL)
+				goto eexit;
+			buf = nbuf;
+		}
+		bytes = recv(fd, buf, buflen, flags);
 		if (bytes == -1) {
 			if (errno == EAGAIN) {
 				r = 0;
@@ -100,7 +122,7 @@ get_netlink(int fd, int flags,
 				continue;
 			goto eexit;
 		}
-		for (nlm = (struct nlmsghdr *)buffer;
+		for (nlm = (struct nlmsghdr *)buf;
 		     NLMSG_OK(nlm, (size_t)bytes);
 		     nlm = NLMSG_NEXT(nlm, bytes))
 		{
@@ -111,7 +133,7 @@ get_netlink(int fd, int flags,
 	}
 
 eexit:
-	free(buffer);
+	free(buf);
 	return r;
 }
 
diff --git a/logger.c b/logger.c
index 15c6cf7..849c108 100644
--- a/logger.c
+++ b/logger.c
@@ -36,7 +36,7 @@
 #include "logger.h"
 
 static int loglevel = LOG_INFO;
-static char logprefix[12] = {0};
+static char *logprefix = NULL;
 
 void
 setloglevel(int level)
@@ -47,7 +47,16 @@ setloglevel(int level)
 void
 setlogprefix(const char *prefix)
 {
-	strlcpy(logprefix, prefix, sizeof(logprefix));
+	size_t size = strlen(prefix) + 3;
+
+	free (logprefix);
+	logprefix = malloc(size);
+	if(logprefix)
+		snprintf(logprefix, size, "%s: ", prefix);
+	else {
+		syslog(LOG_ERR, "setlogprefix: memory exhausted");
+		exit(EXIT_FAILURE);
+	}
 }
 
 void
diff --git a/net.c b/net.c
index 29344f8..e5b2e80 100644
--- a/net.c
+++ b/net.c
@@ -40,9 +40,7 @@
 #endif
 #include <netinet/in.h>
 #include <netinet/ip.h>
-#define __FAVOR_BSD /* Nasty glibc hack so we can use BSD semantics for UDP */
 #include <netinet/udp.h>
-#undef __FAVOR_BSD
 #ifdef SIOCGIFMEDIA
 #include <net/if_media.h>
 #endif
@@ -602,11 +600,11 @@ make_udp_packet(uint8_t **packet, const uint8_t *data, size_t length,
 	else
 		ip->ip_dst.s_addr = dest.s_addr;
 
-	udp->uh_sport = htons(DHCP_CLIENT_PORT);
-	udp->uh_dport = htons(DHCP_SERVER_PORT);
-	udp->uh_ulen = htons(sizeof(*udp) + length);
-	ip->ip_len = udp->uh_ulen;
-	udp->uh_sum = checksum(udpp, sizeof(*udpp));
+	udp->source = htons(DHCP_CLIENT_PORT);
+	udp->dest = htons(DHCP_SERVER_PORT);
+	udp->len = htons(sizeof(*udp) + length);
+	ip->ip_len = udp->len;
+	udp->check = checksum(udpp, sizeof(*udpp));
 
 	ip->ip_v = IPVERSION;
 	ip->ip_hl = 5;
@@ -654,12 +652,12 @@ valid_udp_packet(const uint8_t *data, size_t data_len)
 		errno = EINVAL;
 		return -1;
 	}
-	udpsum = packet.udp.uh_sum;
-	packet.udp.uh_sum = 0;
+	udpsum = packet.udp.check;
+	packet.udp.check = 0;
 	packet.ip.ip_hl = 0;
 	packet.ip.ip_v = 0;
 	packet.ip.ip_tos = 0;
-	packet.ip.ip_len = packet.udp.uh_ulen;
+	packet.ip.ip_len = packet.udp.len;
 	packet.ip.ip_id = 0;
 	packet.ip.ip_off = 0;
 	packet.ip.ip_ttl = 0;
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin