summaryrefslogtreecommitdiffstats
path: root/usr.sbin/gifconfig/gifconfig.c
diff options
context:
space:
mode:
authoritojun <itojun@FreeBSD.org>2000-07-05 08:42:07 +0000
committeritojun <itojun@FreeBSD.org>2000-07-05 08:42:07 +0000
commit733c29e0b9f1d6a941892312edf4238d4490d467 (patch)
treeaf345f155b4ffc70337d8dc589c241f171b5b187 /usr.sbin/gifconfig/gifconfig.c
parent44ab6a4c89ef91aa29d8a3b3e071ea1fda6b9f0e (diff)
downloadFreeBSD-src-733c29e0b9f1d6a941892312edf4238d4490d467.zip
FreeBSD-src-733c29e0b9f1d6a941892312edf4238d4490d467.tar.gz
sync with more recent KAME tree. handles scoped IPv6 notation.
supports "delete" subcommand. corrects PR 19663.
Diffstat (limited to 'usr.sbin/gifconfig/gifconfig.c')
-rw-r--r--usr.sbin/gifconfig/gifconfig.c127
1 files changed, 93 insertions, 34 deletions
diff --git a/usr.sbin/gifconfig/gifconfig.c b/usr.sbin/gifconfig/gifconfig.c
index 49d0ba0..d93d741 100644
--- a/usr.sbin/gifconfig/gifconfig.c
+++ b/usr.sbin/gifconfig/gifconfig.c
@@ -1,3 +1,6 @@
+/* $FreeBSD$ */
+/* $KAME: gifconfig.c,v 1.12 2000/05/22 05:50:43 itojun Exp $ */
+
/*
* Copyright (c) 1983, 1993
* The Regents of the University of California. All rights reserved.
@@ -29,8 +32,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * $FreeBSD$
*/
/*
@@ -57,7 +58,9 @@
#include <sys/sysctl.h>
#include <net/if.h>
+#if defined(__FreeBSD__) && __FreeBSD__ >= 3
#include <net/if_var.h>
+#endif /* __FreeBSD__ >= 3 */
#include <net/if_dl.h>
#include <net/if_types.h>
#include <net/route.h>
@@ -91,9 +94,9 @@ int flags;
int metric;
int mtu;
int setpsrc = 0;
+int newaddr = 0;
int s;
kvm_t *kvmd;
-extern int errno;
#ifdef INET6
char ntop_buf[INET6_ADDRSTRLEN]; /*inet_ntop()*/
@@ -102,7 +105,9 @@ char ntop_buf[INET6_ADDRSTRLEN]; /*inet_ntop()*/
void setifpsrc __P((char *, int));
void setifpdst __P((char *, int));
void setifflags __P((char *, int));
-
+#ifdef SIOCDIFPHYADDR
+void delifaddrs __P((char *, int));
+#endif
#define NEXTARG 0xffffff
@@ -113,6 +118,9 @@ struct cmd {
} cmds[] = {
{ "up", IFF_UP, setifflags } ,
{ "down", -IFF_UP, setifflags },
+#ifdef SIOCDIFPHYADDR
+ { "delete", 0, delifaddrs },
+#endif
{ 0, 0, setifpsrc },
{ 0, 0, setifpdst },
};
@@ -151,7 +159,7 @@ struct afswtch {
caddr_t af_addreq;
caddr_t af_req;
} afs[] = {
-#define C(x) ((caddr_t) &x)
+#define C(x) ((caddr_t) &x)
{ "inet", AF_INET, in_status, in_getaddr, 0,
SIOCSIFPHYADDR, C(addreq), C(ifr) },
#ifdef INET6
@@ -174,9 +182,9 @@ int ifconfig __P((int argc, char *argv[], int af, struct afswtch *rafp));
* configuration read via sysctl().
*/
-#define ROUNDUP(a) \
+#define ROUNDUP(a) \
((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
-#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
+#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
void
rt_xaddrs(cp, cplim, rtinfo)
@@ -219,8 +227,14 @@ main(argc, argv)
int all;
if (argc < 2) {
- fprintf(stderr, "usage: gifconfig interface %s",
- "[ af ] physsrc physdst\n");
+ fprintf(stderr,
+ "usage: gifconfig interface [af] [physsrc physdst]\n");
+#ifdef SIOCDIFPHYADDR
+ fprintf(stderr,
+ " gifconfig interface delete\n");
+#endif
+ fprintf(stderr,
+ " gifconfig -a\n");
exit(1);
}
argc--, argv++;
@@ -335,7 +349,7 @@ main(argc, argv)
if (all == 0)
errx(1, "interface %s does not exist", name);
-
+
exit (0);
}
@@ -395,15 +409,18 @@ ifconfig(argc, argv, af, rafp)
}
argc--, argv++;
}
- if (1 /*newaddr*/) {
+ if (newaddr) {
strncpy(rafp->af_addreq, name, sizeof ifr.ifr_name);
if (ioctl(s, rafp->af_pifaddr, rafp->af_addreq) < 0)
Perror("ioctl (SIOCSIFPHYADDR)");
}
+ else if (setpsrc) {
+ errx(1, "destination is not specified");
+ }
return(0);
}
-#define PSRC 0
-#define PDST 1
+#define PSRC 0
+#define PDST 1
/*ARGSUSED*/
void
@@ -424,6 +441,7 @@ setifpdst(addr, param)
{
param = 0; /*fool gcc*/
(*afp->af_getaddr)(addr, PDST);
+ newaddr = 1;
}
void
@@ -448,6 +466,21 @@ setifflags(vname, value)
Perror(vname);
}
+#ifdef SIOCDIFPHYADDR
+/* ARGSUSED */
+void
+delifaddrs(vname, param)
+ char *vname;
+ int param;
+{
+ param = 0; /* fool gcc */
+ vname = NULL; /* ditto */
+
+ if (ioctl(s, SIOCDIFPHYADDR, (caddr_t)&ifr) < 0)
+ err(1, "ioctl(SIOCDIFPHYADDR)");
+}
+#endif
+
#define IFFBITS \
"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\
\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2\20MULTICAST"
@@ -536,24 +569,35 @@ phys_status(force)
int flags = NI_NUMERICHOST;
struct ifreq *ifrp;
char *ver = "";
+#ifdef INET6
+ int s6;
+#endif
force = 0; /*fool gcc*/
psrcaddr[0] = pdstaddr[0] = '\0';
#ifdef INET6
- srccmd = SIOCGIFPSRCADDR_IN6;
- dstcmd = SIOCGIFPDSTADDR_IN6;
- ifrp = (struct ifreq *)&in6_ifr;
+ s6 = socket(AF_INET6, SOCK_DGRAM, 0);
+ if (s6 < 0) {
+ ifrp = &ifr;
+ srccmd = SIOCGIFPSRCADDR;
+ dstcmd = SIOCGIFPDSTADDR;
+ } else {
+ close(s6);
+ srccmd = SIOCGIFPSRCADDR_IN6;
+ dstcmd = SIOCGIFPDSTADDR_IN6;
+ ifrp = (struct ifreq *)&in6_ifr;
+ }
#else /* INET6 */
- ifrp = ifr;
+ ifrp = &ifr;
srccmd = SIOCGIFPSRCADDR;
dstcmd = SIOCGIFPDSTADDR;
#endif /* INET6 */
if (0 <= ioctl(s, srccmd, (caddr_t)ifrp)) {
getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len,
- hostname, NI_MAXHOST, 0, 0, flags);
+ hostname, sizeof(hostname), 0, 0, flags);
#ifdef INET6
if (ifrp->ifr_addr.sa_family == AF_INET6)
ver = "6";
@@ -562,7 +606,7 @@ phys_status(force)
}
if (0 <= ioctl(s, dstcmd, (caddr_t)ifrp)) {
getnameinfo(&ifrp->ifr_addr, ifrp->ifr_addr.sa_len,
- hostname, NI_MAXHOST, 0, 0, flags);
+ hostname, sizeof(hostname), 0, 0, flags);
sprintf(pdstaddr, "%s", hostname);
}
printf("\tphysical address %s --> %s\n", psrcaddr, pdstaddr);
@@ -576,7 +620,7 @@ in_status(force)
#if 0
char *inet_ntoa();
#endif
-
+
memset(&null_sin, 0, sizeof(null_sin));
sin = (struct sockaddr_in *)info.rti_info[RTAX_IFA];
@@ -616,12 +660,13 @@ in6_status(force)
int force;
{
struct sockaddr_in6 *sin, null_sin;
-#if 0
- char *inet_ntop();
-#endif
-
+ char hostname[NI_MAXHOST];
+ int niflags = NI_NUMERICHOST;
memset(&null_sin, 0, sizeof(null_sin));
+#ifdef NI_WITHSCOPEID
+ niflags |= NI_WITHSCOPEID;
+#endif
sin = (struct sockaddr_in6 *)info.rti_info[RTAX_IFA];
if (!sin || sin->sin6_family != AF_INET6) {
@@ -630,8 +675,17 @@ in6_status(force)
/* warnx("%s has no AF_INET6 IFA address!", name); */
sin = &null_sin;
}
- printf("\tinet6 %s ", inet_ntop(AF_INET6, &sin->sin6_addr,
- ntop_buf, sizeof(ntop_buf)));
+#ifdef __KAME__
+ if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr)) {
+ sin->sin6_scope_id =
+ ntohs(*(u_int16_t *)&sin->sin6_addr.s6_addr[2]);
+ sin->sin6_addr.s6_addr[2] = 0;
+ sin->sin6_addr.s6_addr[3] = 0;
+ }
+#endif
+ getnameinfo((struct sockaddr *)sin, sin->sin6_len,
+ hostname, sizeof(hostname), 0, 0, niflags);
+ printf("\tinet6 %s ", hostname);
if (flags & IFF_POINTOPOINT) {
/* note RTAX_BRD overlap with IFF_BROADCAST */
@@ -641,10 +695,17 @@ in6_status(force)
* address.
*/
if (sin->sin6_family == AF_INET6) {
- if (!sin)
- sin = &null_sin;
- printf("--> %s ", inet_ntop(AF_INET6, &sin->sin6_addr,
- ntop_buf, sizeof(ntop_buf)));
+#ifdef __KAME__
+ if (IN6_IS_ADDR_LINKLOCAL(&sin->sin6_addr)) {
+ sin->sin6_scope_id =
+ ntohs(*(u_int16_t *)&sin->sin6_addr.s6_addr[2]);
+ sin->sin6_addr.s6_addr[2] = 0;
+ sin->sin6_addr.s6_addr[3] = 0;
+ }
+#endif
+ getnameinfo((struct sockaddr *)sin, sin->sin6_len,
+ hostname, sizeof(hostname), 0, 0, niflags);
+ printf("--> %s ", hostname);
}
}
@@ -684,8 +745,6 @@ void
Perror(cmd)
char *cmd;
{
- extern int errno;
-
switch (errno) {
case ENXIO:
@@ -701,7 +760,7 @@ Perror(cmd)
}
}
-#define SIN(x) ((struct sockaddr_in *) &(x))
+#define SIN(x) ((struct sockaddr_in *) &(x))
struct sockaddr_in *sintab[] = {
SIN(addreq.ifra_addr), SIN(addreq.ifra_dstaddr)};
@@ -728,7 +787,7 @@ in_getaddr(s, which)
}
#ifdef INET6
-#define SIN6(x) ((struct sockaddr_in6 *) &(x))
+#define SIN6(x) ((struct sockaddr_in6 *) &(x))
struct sockaddr_in6 *sin6tab[] = {
SIN6(in6_addreq.ifra_addr), SIN6(in6_addreq.ifra_dstaddr)};
OpenPOWER on IntegriCloud