Subject: [alpine-aports] [PATCH] dhcpcd - Describe dhcp6 error code if no text present

From: sillysausage <[email-masked]>
Date: Sat, 14 Nov 2015 00:39:18 +1030

Patch from upstream, will be included in dhcpcd-6.9.4 when released

http://roy.marples.name/projects/dhcpcd/vpatch?from=d8f8999d1efb4376c29d7d2c13b0de1c6da52226&to=90e878f68804cb98e03e90b33233e607e6541358
---
 main/dhcpcd/APKBUILD                        | 15 ++++--
 main/dhcpcd/describe_dhcp6_error_code.patch | 77 +++++++++++++++++++++++++++++
 2 files changed, 87 insertions(+), 5 deletions(-)
 create mode 100644 main/dhcpcd/describe_dhcp6_error_code.patch

diff --git a/main/dhcpcd/APKBUILD b/main/dhcpcd/APKBUILD
index 27e4406..a0cb0e0 100644
--- a/main/dhcpcd/APKBUILD
+++ b/main/dhcpcd/APKBUILD
@@ -3,7 +3,7 @@
 # Maintainer: Natanael Copa <[email-masked]>
 pkgname=dhcpcd
 pkgver=6.9.3
-pkgrel=1
+pkgrel=2
 pkgdesc="RFC2131 compliant DHCP client"
 url="http://roy.marples.name/projects/dhcpcd/"
 arch="all"
@@ -15,7 +15,8 @@ install=""
 subpackages="$pkgname-doc"
 source="http://roy.marples.name/downloads/dhcpcd/$pkgname-$pkgver.tar.xz
 	busybox-logger.patch
-	dhcpcd.initd"
+	dhcpcd.initd
+	describe_dhcp6_error_code.patch"
 
 prepare() {
 	cd "$srcdir/$pkgname-$pkgver"
@@ -24,6 +25,7 @@ prepare() {
 		*.patch) msg $i; patch -p1 -i "$srcdir"/$i || return 1;;
 		esac
 	done
+
 }
 
 build() {
@@ -47,10 +49,13 @@ package() {
 
 md5sums="8357d023c4687d27bc6ea7964236b2a6  dhcpcd-6.9.3.tar.xz
 231d2b03e7e93fa6cc7406889e9945e3  busybox-logger.patch
-5cd5809d11b77b30f21df8418729d70b  dhcpcd.initd"
+5cd5809d11b77b30f21df8418729d70b  dhcpcd.initd
+a748946c8d88610e696ba2706cffca6d  describe_dhcp6_error_code.patch"
 sha256sums="6089471ed695fa62ac8351466b96b4b6365fd14ec455a120a6524663808eae53  dhcpcd-6.9.3.tar.xz
 aec6c5d7a41551ca7cd3849a53621692ee0a1a6d259892beaf448eb1f2d4af01  busybox-logger.patch
-6bb9b8b0075e45e63e898ed043f3c5951dc3e95c1fa62d22cc6e0616c792ecd1  dhcpcd.initd"
+6bb9b8b0075e45e63e898ed043f3c5951dc3e95c1fa62d22cc6e0616c792ecd1  dhcpcd.initd
+53b089720c73f1565e04e36be2360f91036664b0d0a4ddb702219b4df3e88bb2  describe_dhcp6_error_code.patch"
 sha512sums="0a895f17fa093ac758224bfddad003ee25f81fe96331b1952264c3623018e00048603c9a3c5ba385a93441e987b1ce4cd02ec1f42e1caca2e646a6ac4781c3d9  dhcpcd-6.9.3.tar.xz
 83dc7bfd36b6b416c931775bb35a0d2951ed04c421195c45bfed80a11a7adbed7c80ade1c1246847c2fb1bf15a7b6e83100f16605ee84f750440d7bc9f7f5ef3  busybox-logger.patch
-6d3220155f2d9ed3e3a00afd378eeb70d435e19804201f8bb35498f1f7f3dfdaeaa2f4a01a18f5e96b457d9c173bc6a206b3e67ebf6d95da7e7b350dcd153fde  dhcpcd.initd"
+6d3220155f2d9ed3e3a00afd378eeb70d435e19804201f8bb35498f1f7f3dfdaeaa2f4a01a18f5e96b457d9c173bc6a206b3e67ebf6d95da7e7b350dcd153fde  dhcpcd.initd
+9f108e9df6a673e618abe55d70769a43a59d97c172d4721527ced6bd549cf61995e559037f8ec05657cdf76c2dfe62ff4d050d46783cdf770a4e91831f53e50a  describe_dhcp6_error_code.patch"
diff --git a/main/dhcpcd/describe_dhcp6_error_code.patch b/main/dhcpcd/describe_dhcp6_error_code.patch
new file mode 100644
index 0000000..cd72206
--- /dev/null
+++ b/main/dhcpcd/describe_dhcp6_error_code.patch
@@ -0,0 +1,77 @@
+--- ./dhcp6.c
++++ ./dhcp6.c
+@@ -111,11 +111,12 @@
+ 	"Success",
+ 	"Unspecified Failure",
+ 	"No Addresses Available",
+ 	"No Binding",
+ 	"Not On Link",
+-	"Use Multicast"
++	"Use Multicast",
++	"No Prefix Available"
+ };
+ 
+ struct dhcp6_ia_addr {
+ 	struct in6_addr addr;
+ 	uint32_t pltime;
+@@ -1660,11 +1661,12 @@
+ dhcp6_checkstatusok(const struct interface *ifp,
+     const struct dhcp6_message *m, const uint8_t *p, size_t len)
+ {
+ 	const struct dhcp6_option *o;
+ 	uint16_t code;
+-	char *status;
++	char buf[32], *sbuf;
++	const char *status;
+ 
+ 	if (p)
+ 		o = dhcp6_findoption(D6_OPTION_STATUS_CODE, p, len);
+ 	else
+ 		o = dhcp6_getmoption(D6_OPTION_STATUS_CODE, m, len);
+@@ -1686,28 +1688,29 @@
+ 		return 1;
+ 
+ 	len -= sizeof(code);
+ 
+ 	if (len == 0) {
+-		if (code < sizeof(dhcp6_statuses) / sizeof(char *)) {
+-			p = (const uint8_t *)dhcp6_statuses[code];
+-			len = strlen((const char *)p);
+-		} else
+-			p = NULL;
+-	} else
+-		p += sizeof(code);
++		sbuf = NULL;
++		if (code < sizeof(dhcp6_statuses) / sizeof(char *))
++			status = dhcp6_statuses[code];
++		else {
++			snprintf(buf, sizeof(buf), "Unknown Status (%d)", code);
++			status = buf;
++		}
++	} else {
++		if ((sbuf = malloc(len + 1)) == NULL) {
++			logger(ifp->ctx, LOG_ERR, "%s: %m", __func__);
++			return -1;
++		}
++		memcpy(sbuf, p + sizeof(code), len);
++		sbuf[len] = '\0';
++		status = sbuf;
++	}
+ 
+-	status = malloc(len + 1);
+-	if (status == NULL) {
+-		logger(ifp->ctx, LOG_ERR, "%s: %m", __func__);
+-		return -1;
+-	}
+-	if (p)
+-		memcpy(status, p, len);
+-	status[len] = '\0';
+ 	logger(ifp->ctx, LOG_ERR, "%s: DHCPv6 REPLY: %s", ifp->name, status);
+-	free(status);
++	free(sbuf);
+ 	return -1;
+ }
+ 
+ const struct ipv6_addr *
+ dhcp6_iffindaddr(const struct interface *ifp, const struct in6_addr *addr,
+
-- 
2.4.1

---
Unsubscribe:  [email-masked]
Help:         [email-masked]
---