From owner-p4-projects@FreeBSD.ORG Sun Mar 30 19:46:25 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id C9EF51065672; Sun, 30 Mar 2008 19:46:25 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6FB95106566C for ; Sun, 30 Mar 2008 19:46:25 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 517258FC1D for ; Sun, 30 Mar 2008 19:46:25 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m2UJkP6u012411 for ; Sun, 30 Mar 2008 19:46:25 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m2UJkPJ8012409 for perforce@freebsd.org; Sun, 30 Mar 2008 19:46:25 GMT (envelope-from sam@freebsd.org) Date: Sun, 30 Mar 2008 19:46:25 GMT Message-Id: <200803301946.m2UJkPJ8012409@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 139003 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 30 Mar 2008 19:46:26 -0000 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),