{ "-trailers", IFF_NOTRAILERS, setifflags },
{ "arp", -IFF_NOARP, setifflags },
{ "-arp", IFF_NOARP, setifflags },
{ "-trailers", IFF_NOTRAILERS, setifflags },
{ "arp", -IFF_NOARP, setifflags },
{ "-arp", IFF_NOARP, setifflags },
+ { "local", IFF_LOCAL, setifflags },
+ { "-local", -IFF_LOCAL, setifflags },
{ "debug", IFF_DEBUG, setifflags },
{ "-debug", -IFF_DEBUG, setifflags },
#ifdef notdef
{ "debug", IFF_DEBUG, setifflags },
{ "-debug", -IFF_DEBUG, setifflags },
#ifdef notdef
+ if (setaddr) {
+ strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
+ ifr.ifr_addr = *(struct sockaddr *) &sin;
+ if (ioctl(s, SIOCSIFADDR, (caddr_t)&ifr) < 0)
+ Perror("ioctl (SIOCSIFADDR)");
+ }
- getaddr(addr, (struct sockaddr_in *)&ifr.ifr_addr);
- strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
- if (ioctl(s, SIOCSIFADDR, (caddr_t)&ifr) < 0)
- Perror("ioctl (SIOCSIFADDR)");
+ getaddr(addr, &sin);
+ /*
+ * Delay the ioctl to set the interface addr until flags are all set.
+ * The address interpretation may depend on the flags,
+ * and the flags may change when the address is set.
+ */
+ setaddr++;
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
Perror(vname);
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
if (ioctl(s, SIOCSIFFLAGS, (caddr_t)&ifr) < 0)
Perror(vname);
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0)
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0)
sin = (struct sockaddr_in *)&ifr.ifr_addr;
printf("%s: %s ", name, inet_ntoa(sin->sin_addr));
#define IFFBITS \
sin = (struct sockaddr_in *)&ifr.ifr_addr;
printf("%s: %s ", name, inet_ntoa(sin->sin_addr));
#define IFFBITS \