Module Name: src Committed By: nat Date: Wed Aug 17 12:35:11 UTC 2022
Modified Files: src/sbin/ifconfig: af_inetany.c Log Message: Use existing address when setting parameters. No need to specify address every time when setting broadcast address or netmask. Hopefully successfully re addresses PR bin/10911. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sbin/ifconfig/af_inetany.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/ifconfig/af_inetany.c diff -u src/sbin/ifconfig/af_inetany.c:1.21 src/sbin/ifconfig/af_inetany.c:1.22 --- src/sbin/ifconfig/af_inetany.c:1.21 Tue Aug 16 22:31:24 2022 +++ src/sbin/ifconfig/af_inetany.c Wed Aug 17 12:35:10 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: af_inetany.c,v 1.21 2022/08/16 22:31:24 nat Exp $ */ +/* $NetBSD: af_inetany.c,v 1.22 2022/08/17 12:35:10 nat Exp $ */ /*- * Copyright (c) 2008 David Young. All rights reserved. @@ -27,7 +27,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: af_inetany.c,v 1.21 2022/08/16 22:31:24 nat Exp $"); +__RCSID("$NetBSD: af_inetany.c,v 1.22 2022/08/17 12:35:10 nat Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -68,6 +68,7 @@ commit_address(prop_dictionary_t env, pr const struct afparam *param) { const char *ifname; + struct ifreq ifr; int af, rc, s; bool alias, delete, replace; prop_data_t d; @@ -88,8 +89,19 @@ commit_address(prop_dictionary_t env, pr if ((d = (prop_data_t)prop_dictionary_get(env, "address")) != NULL) addr = prop_data_value(d); - else if (!prop_dictionary_get_bool(env, "alias", &alias) || alias || - param->gifaddr.cmd == 0) + else if (param->gifaddr.cmd == 0) + return; + else if (!prop_dictionary_get_bool(env, "alias", &alias)) { + static struct paddr_prefix existingaddr; + + memset(&ifr, 0, sizeof(ifr)); + estrlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name)); + if (prog_ioctl(s, SIOCGIFADDR, &ifr) == -1) + return; + + existingaddr.pfx_addr = ifr.ifr_addr; + addr = &existingaddr; + } else if (alias) return; else if (prog_ioctl(s, param->gifaddr.cmd, param->dgreq.buf) == -1) err(EXIT_FAILURE, "%s", param->gifaddr.desc);