summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorbz <bz@FreeBSD.org>2009-07-26 11:25:57 +0000
committerbz <bz@FreeBSD.org>2009-07-26 11:25:57 +0000
commit0de8238d45da1b7b3bf6f6206fbba3b8534c683a (patch)
tree2920fff090554b69fb150de93f495120a800c9a9 /sbin
parent5c4797878dc3d05276b18c182eba9191dfa0e718 (diff)
downloadFreeBSD-src-0de8238d45da1b7b3bf6f6206fbba3b8534c683a.zip
FreeBSD-src-0de8238d45da1b7b3bf6f6206fbba3b8534c683a.tar.gz
Make ifconfig ifN -vnet <jname|jid> actually work:
- fix ifconfig to ignore the non-existent interface in the current network stack in case of '-vnet'. - in ifconfig: actually use the local variables defined for the vnet functions rather than modifying the global. Reviewed by: rwatson Approved by: re (kib)
Diffstat (limited to 'sbin')
-rw-r--r--sbin/ifconfig/ifconfig.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index 12c64d6..f05374c 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -252,6 +252,19 @@ main(int argc, char *argv[])
ifconfig(argc, argv, 1, NULL);
exit(0);
}
+ /*
+ * NOTE: We have to special-case the `-vnet' command
+ * right here as we would otherwise fail when trying
+ * to find the interface as it lives in another vnet.
+ */
+ if (argc > 0 && (strcmp(argv[0], "-vnet") == 0)) {
+ iflen = strlcpy(name, ifname, sizeof(name));
+ if (iflen >= sizeof(name))
+ errx(1, "%s: interface name too long",
+ ifname);
+ ifconfig(argc, argv, 0, NULL);
+ exit(0);
+ }
errx(1, "interface %s does not exist", ifname);
}
}
@@ -636,10 +649,10 @@ setifvnet(const char *jname, int dummy __unused, int s,
struct ifreq my_ifr;
memcpy(&my_ifr, &ifr, sizeof(my_ifr));
- ifr.ifr_jid = jail_getid(jname);
- if (ifr.ifr_jid < 0)
+ my_ifr.ifr_jid = jail_getid(jname);
+ if (my_ifr.ifr_jid < 0)
errx(1, "%s", jail_errmsg);
- if (ioctl(s, SIOCSIFVNET, &ifr) < 0)
+ if (ioctl(s, SIOCSIFVNET, &my_ifr) < 0)
err(1, "SIOCSIFVNET");
}
@@ -650,11 +663,11 @@ setifrvnet(const char *jname, int dummy __unused, int s,
struct ifreq my_ifr;
memcpy(&my_ifr, &ifr, sizeof(my_ifr));
- ifr.ifr_jid = jail_getid(jname);
- if (ifr.ifr_jid < 0)
+ my_ifr.ifr_jid = jail_getid(jname);
+ if (my_ifr.ifr_jid < 0)
errx(1, "%s", jail_errmsg);
- if (ioctl(s, SIOCSIFRVNET, &ifr) < 0)
- err(1, "SIOCSIFRVNET");
+ if (ioctl(s, SIOCSIFRVNET, &my_ifr) < 0)
+ err(1, "SIOCSIFRVNET(%d, %s)", my_ifr.ifr_jid, my_ifr.ifr_name);
}
static void
OpenPOWER on IntegriCloud