From eec0503cfc36f63d777f5cb3f2719cecedcb8468 Mon Sep 17 00:00:00 2001
From: Haris Okanovic <haris.okanovic@ni.com>
Date: Mon, 7 Jan 2019 13:22:09 -0600
Subject: [PATCH] Workaround busybox limitation in Linux dhclient-script

Busybox is a lightweight implementation of coreutils commonly used on
space-constrained embedded Linux distributions. It's implementation of
chown and chmod doesn't provide a "--reference" option added to
client/scripts/linux as of commit 9261cb14. This change works around
that limitation by using stat to read ownership and permissions flags
and simple chown/chmod calls supported in both coreutils and busybox.

    modified:   client/scripts/linux

Signed-off-by: Haris Okanovic <haris.okanovic@ni.com>
Upstream-Status: Pending [ISC-Bugs #48771]
---
 client/scripts/linux | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Index: dhcp-4.4.3/client/scripts/linux
===================================================================
--- dhcp-4.4.3.orig/client/scripts/linux
+++ dhcp-4.4.3/client/scripts/linux
@@ -32,6 +32,17 @@
 # if your system holds ip tool in a non-standard location.
 ip=/sbin/ip
 
+chown_chmod_by_reference() {
+    local reference_file="$1"
+    local target_file="$2"
+
+    local owner=$(stat -c "%u:%g" "$reference_file")
+    local perm=$(stat -c "%a" "$reference_file")
+
+    chown "$owner" "$target_file"
+    chmod "$perm" "$target_file"
+}
+
 # update /etc/resolv.conf based on received values
 # This updated version mostly follows Debian script by Andrew Pollock et al.
 make_resolv_conf() {
@@ -74,8 +85,7 @@ make_resolv_conf() {
         fi
 
 	if [ -f /etc/resolv.conf ]; then
-	    chown --reference=/etc/resolv.conf $new_resolv_conf
-	    chmod --reference=/etc/resolv.conf $new_resolv_conf
+	    chown_chmod_by_reference /etc/resolv.conf $new_resolv_conf
 	fi
         mv -f $new_resolv_conf /etc/resolv.conf
     # DHCPv6
@@ -101,8 +111,7 @@ make_resolv_conf() {
         fi
 
 	if [ -f /etc/resolv.conf ]; then
-            chown --reference=/etc/resolv.conf $new_resolv_conf
-            chmod --reference=/etc/resolv.conf $new_resolv_conf
+	    chown_chmod_by_reference /etc/resolv.conf $new_resolv_conf
 	fi
         mv -f $new_resolv_conf /etc/resolv.conf
     fi
