Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Mar 2008 19:46:25 GMT
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 139003 for review
Message-ID:  <200803301946.m2UJkPJ8012409@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=139003

Change 139003 by sam@sam_ebb on 2008/03/30 19:46:12

	push clone create operation on seeing the first non-clone-related
	cmd line argument; this fixes doing stuff like:
	
	ifconfig lo1 create inet 5.5.5.5 netmask 255.255.255.0
	
	Inspired by:	Eugene Grosbein

Affected files ...

.. //depot/projects/vap/sbin/ifconfig/ifconfig.c#6 edit
.. //depot/projects/vap/sbin/ifconfig/ifconfig.h#5 edit
.. //depot/projects/vap/sbin/ifconfig/ifieee80211.c#16 edit
.. //depot/projects/vap/sbin/ifconfig/ifvlan.c#5 edit

Differences ...

==== //depot/projects/vap/sbin/ifconfig/ifconfig.c#6 (text+ko) ====

@@ -93,7 +93,8 @@
 int	supmedia = 0;
 int	printkeys = 0;		/* Print keying material for interfaces. */
 
-static	int ifconfig(int argc, char *const *argv, const struct afswtch *afp);
+static	int ifconfig(int argc, char *const *argv, int iscreate,
+		const struct afswtch *afp);
 static	void status(const struct afswtch *afp, const struct sockaddr_dl *sdl,
 		struct ifaddrs *ifa);
 static	void tunnel_status(int s);
@@ -247,7 +248,7 @@
 				if (iflen >= sizeof(name))
 					errx(1, "%s: cloning name too long",
 					    ifname);
-				ifconfig(argc, argv, NULL);
+				ifconfig(argc, argv, 1, NULL);
 				exit(0);
 			}
 			errx(1, "interface %s does not exist", ifname);
@@ -305,7 +306,7 @@
 		}
 
 		if (argc > 0)
-			ifconfig(argc, argv, afp);
+			ifconfig(argc, argv, 0, afp);
 		else
 			status(afp, sdl, ifa);
 	}
@@ -433,17 +434,19 @@
 	DEF_CMD("ifdstaddr", 0, setifdstaddr);
 
 static int
-ifconfig(int argc, char *const *argv, const struct afswtch *afp)
+ifconfig(int argc, char *const *argv, int iscreate, const struct afswtch *afp)
 {
+	const struct afswtch *nafp;
 	struct callback *cb;
 	int s;
 
+	strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
+top:
 	if (afp == NULL)
 		afp = af_getbyname("inet");
 	ifr.ifr_addr.sa_family =
 		afp->af_af == AF_LINK || afp->af_af == AF_UNSPEC ?
 		AF_INET : afp->af_af;
-	strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
 
 	if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
 		err(1, "socket(family %u,SOCK_DGRAM", ifr.ifr_addr.sa_family);
@@ -460,6 +463,33 @@
 			p = (setaddr ? &setifdstaddr_cmd : &setifaddr_cmd);
 		}
 		if (p->c_u.c_func || p->c_u.c_func2) {
+			if (iscreate && !p->c_iscloneop) { 
+				/*
+				 * Push the clone create callback so the new
+				 * device is created and can be used for any
+				 * remaining arguments.
+				 */
+				cb = callbacks;
+				if (cb == NULL)
+					errx(1, "internal error, no callback");
+				callbacks = cb->cb_next;
+				cb->cb_func(s, cb->cb_arg);
+				iscreate = 0;
+				/*
+				 * Handle any address family spec that
+				 * immediately follows and potentially
+				 * recreate the socket.
+				 */
+				nafp = af_getbyname(*argv);
+				if (nafp != NULL) {
+					argc--, argv++;
+					if (nafp != afp) {
+						close(s);
+						afp = nafp;
+						goto top;
+					}
+				}
+			}
 			if (p->c_parameter == NEXTARG) {
 				if (argv[1] == NULL)
 					errx(1, "'%s' requires argument",

==== //depot/projects/vap/sbin/ifconfig/ifconfig.h#5 (text+ko) ====

@@ -52,6 +52,7 @@
 		c_func	*c_func;
 		c_func2	*c_func2;
 	} c_u;
+	int	c_iscloneop;
 	struct cmd *c_next;
 };
 void	cmd_register(struct cmd *);
@@ -71,6 +72,8 @@
 #define	DEF_CMD_ARG(name, func)		{ name, NEXTARG, { .c_func = func } }
 #define	DEF_CMD_OPTARG(name, func)	{ name, OPTARG, { .c_func = func } }
 #define	DEF_CMD_ARG2(name, func)	{ name, NEXTARG2, { .c_func2 = func } }
+#define	DEF_CLONE_CMD(name, param, func) { name, param, { .c_func = func }, 1 }
+#define	DEF_CLONE_CMD_ARG(name, func)	{ name, NEXTARG, { .c_func = func }, 1 }
 
 struct ifaddrs;
 struct addrinfo;

==== //depot/projects/vap/sbin/ifconfig/ifieee80211.c#16 (text+ko) ====

@@ -4473,15 +4473,15 @@
 	DEF_CMD_ARG("chanswitch",	set80211chanswitch),
 
 	/* vap cloning support */
-	DEF_CMD_ARG("wlanbssid",	set80211clone_wlanbssid),
-	DEF_CMD_ARG("wlandev",		set80211clone_wlandev),
-	DEF_CMD_ARG("wlanmode",		set80211clone_wlanmode),
-	DEF_CMD("beacons",	1,	set80211clone_beacons),
-	DEF_CMD("-beacons",	0,	set80211clone_beacons),
-	DEF_CMD("bssid",	1,	set80211clone_bssid),
-	DEF_CMD("-bssid",	0,	set80211clone_bssid),
-	DEF_CMD("wdslegacy",	1,	set80211clone_wdslegacy),
-	DEF_CMD("-wdslegacy",	0,	set80211clone_wdslegacy),
+	DEF_CLONE_CMD_ARG("wlanbssid",	set80211clone_wlanbssid),
+	DEF_CLONE_CMD_ARG("wlandev",	set80211clone_wlandev),
+	DEF_CLONE_CMD_ARG("wlanmode",	set80211clone_wlanmode),
+	DEF_CLONE_CMD("beacons", 1,	set80211clone_beacons),
+	DEF_CLONE_CMD("-beacons", 0,	set80211clone_beacons),
+	DEF_CLONE_CMD("bssid",	1,	set80211clone_bssid),
+	DEF_CLONE_CMD("-bssid",	0,	set80211clone_bssid),
+	DEF_CLONE_CMD("wdslegacy", 1,	set80211clone_wdslegacy),
+	DEF_CLONE_CMD("-wdslegacy", 0,	set80211clone_wdslegacy),
 };
 static struct afswtch af_ieee80211 = {
 	.af_name	= "af_ieee80211",

==== //depot/projects/vap/sbin/ifconfig/ifvlan.c#5 (text+ko) ====

@@ -172,8 +172,8 @@
 }
 
 static struct cmd vlan_cmds[] = {
-	DEF_CMD_ARG("vlan",				setvlantag),
-	DEF_CMD_ARG("vlandev",				setvlandev),
+	DEF_CLONE_CMD_ARG("vlan",			setvlantag),
+	DEF_CLONE_CMD_ARG("vlandev",			setvlandev),
 	/* XXX For compatibility.  Should become DEF_CMD() some day. */
 	DEF_CMD_OPTARG("-vlandev",			unsetvlandev),
 	DEF_CMD("vlanmtu",	IFCAP_VLAN_MTU,		setifcap),



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803301946.m2UJkPJ8012409>