Argh! - besides everything what jmc@ said, it should have been
the following diff *for sure*:
diff --git a/sbin/dhclient/dhclient.8 b/sbin/dhclient/dhclient.8
index 9d77c7e..b6094c1 100644
--- a/sbin/dhclient/dhclient.8
+++ b/sbin/dhclient/dhclient.8
@@ -57,6 +57,16 @@ The name of the network interface that
.Nm
should attempt to
configure must be specified on the command line.
+If the given name starts with the character
+.Cm = ,
+then
+.Nm
+will treat the remaining characters as the name of a group defined by
+.Xr ifconfig 8 ,
+and try to use the interface which is marked in that group.
+See
+.Xr ifconfig 8
+for more on groups.
.Pp
The options are as follows:
.Bl -tag -width "-p port"
@@ -169,7 +179,8 @@ database of acquired leases
.Xr dhclient-script 8 ,
.Xr dhcp 8 ,
.Xr dhcpd 8 ,
-.Xr dhcrelay 8
+.Xr dhcrelay 8 ,
+.Xr ifconfig 8
.Sh AUTHORS
.An -nosplit
.Nm
diff --git a/sbin/dhclient/dhclient.c b/sbin/dhclient/dhclient.c
index 8d35021..3fb1bf7 100644
--- a/sbin/dhclient/dhclient.c
+++ b/sbin/dhclient/dhclient.c
@@ -2073,41 +2073,57 @@ fork_privchld(int fd, int fd2)
void
get_ifname(char *ifname, char *arg)
{
+#ifdef SMALL
+ if (strlcpy(ifi->name, arg, IFNAMSIZ) >= IFNAMSIZ)
+ error("Interface name too long");
+#else
struct ifgroupreq ifgr;
struct ifg_req *ifg;
+ char *group;
int s, len;
- if (!strcmp(arg, "egress")) {
- s = socket(AF_INET, SOCK_DGRAM, 0);
- if (s == -1)
- error("socket error");
- bzero(&ifgr, sizeof(ifgr));
- strlcpy(ifgr.ifgr_name, "egress", sizeof(ifgr.ifgr_name));
- if (ioctl(s, SIOCGIFGMEMB, (caddr_t)&ifgr) == -1) {
- if (errno == ENOENT)
- error("no interface in group egress found");
- error("ioctl SIOCGIFGMEMB: %m");
- }
- len = ifgr.ifgr_len;
- if ((ifgr.ifgr_groups = calloc(1, len)) == NULL)
- error("get_ifname");
- if (ioctl(s, SIOCGIFGMEMB, (caddr_t)&ifgr) == -1)
- error("ioctl SIOCGIFGMEMB: %m");
-
- arg = NULL;
- for (ifg = ifgr.ifgr_groups;
- ifg && len >= sizeof(struct ifg_req); ifg++) {
- len -= sizeof(struct ifg_req);
- if (arg)
- error("too many interfaces in group egress");
- arg = ifg->ifgrq_member;
- }
-
+ if (*arg == '=')
+ ++arg;
+ /* 'egress' for compatibility */
+ else if (strcmp(arg, "egress")) {
if (strlcpy(ifi->name, arg, IFNAMSIZ) >= IFNAMSIZ)
- error("Interface name too long: %m");
+ error("Interface name too long");
+ return;
+ }
- free(ifgr.ifgr_groups);
- close(s);
- } else if (strlcpy(ifi->name, arg, IFNAMSIZ) >= IFNAMSIZ)
+ /* Try deduce interface from if */
+ group = arg;
+
+ s = socket(AF_INET, SOCK_DGRAM, 0);
+ if (s == -1)
+ error("socket error");
+ bzero(&ifgr, sizeof(ifgr));
+
+ if (strlcpy(ifgr.ifgr_name, group, IFNAMSIZ) >= IFNAMSIZ)
error("Interface name too long");
+
+ if (ioctl(s, SIOCGIFGMEMB, (caddr_t)&ifgr) == -1) {
+ if (errno == ENOENT)
+ error("no interface in group %s found", group);
+ error("ioctl SIOCGIFGMEMB: %m");
+ }
+ len = ifgr.ifgr_len;
+ if ((ifgr.ifgr_groups = calloc(1, len)) == NULL)
+ error("get_ifname");
+ if (ioctl(s, SIOCGIFGMEMB, (caddr_t)&ifgr) == -1)
+ error("ioctl SIOCGIFGMEMB: %m");
+
+ arg = NULL;
+ for (ifg = ifgr.ifgr_groups;
+ ifg && len >= sizeof(struct ifg_req); ifg++) {
+ len -= sizeof(struct ifg_req);
+ if (arg)
+ error("too many interfaces in group %s", group);
+ arg = ifg->ifgrq_member;
+ }
+ (void)strlcpy(ifi->name, arg, IFNAMSIZ);
+
+ free(ifgr.ifgr_groups);
+ close(s);
+#endif /* SMALL */
}