use getifaddrs. avoid "extern int errno".
(sync with latest kame code)
This commit is contained in:
parent
54ffe9e871
commit
a5ad88b8e0
@ -1,8 +1,9 @@
|
||||
# $NetBSD: Makefile,v 1.1 1999/07/02 11:47:12 itojun Exp $
|
||||
# $NetBSD: Makefile,v 1.2 2000/02/25 06:22:05 itojun Exp $
|
||||
|
||||
PROG= route6d
|
||||
MAN= route6d.8
|
||||
|
||||
CPPFLAGS+= -Dss_len=__ss_len -Dss_family=__ss_family -DADVAPI -DINET6
|
||||
CPPFLAGS+=-Dss_len=__ss_len -Dss_family=__ss_family -DADVAPI -DINET6 \
|
||||
-DHAVE_GETIFADDRS
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
|
@ -1,3 +1,6 @@
|
||||
.\" $NetBSD: route6d.8,v 1.5 2000/02/25 06:22:05 itojun Exp $
|
||||
.\" $KAME: route6d.8,v 1.5 2000/02/25 06:15:05 itojun Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1996 WIDE Project. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
@ -12,8 +15,6 @@
|
||||
.\" LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
.\" A PARTICULAR PURPOSE.
|
||||
.\"
|
||||
.\" $NetBSD: route6d.8,v 1.4 1999/12/16 05:55:54 itojun Exp $
|
||||
.\"
|
||||
.Dd January 31, 1997
|
||||
.Dt ROUTE6D 8
|
||||
.Os
|
||||
|
@ -1,6 +1,4 @@
|
||||
/*
|
||||
* KAME Header: /cvsroot/kame/kame/kame/kame/route6d/route6d.c,v 1.6 1999/09/10 08:20:59 itojun Exp
|
||||
*/
|
||||
/* $KAME: route6d.c,v 1.14 2000/02/25 06:15:57 itojun Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||
@ -33,7 +31,7 @@
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: route6d.c,v 1.9 1999/09/13 11:07:52 itojun Exp $");
|
||||
__RCSID("$NetBSD: route6d.c,v 1.10 2000/02/25 06:22:05 itojun Exp $");
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
@ -50,6 +48,7 @@ __RCSID("$NetBSD: route6d.c,v 1.9 1999/09/13 11:07:52 itojun Exp $");
|
||||
#endif
|
||||
#include <syslog.h>
|
||||
#include <stddef.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -58,7 +57,6 @@ __RCSID("$NetBSD: route6d.c,v 1.9 1999/09/13 11:07:52 itojun Exp $");
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <sys/errno.h>
|
||||
#ifdef ADVAPI
|
||||
#include <sys/uio.h>
|
||||
#endif
|
||||
@ -67,13 +65,18 @@ __RCSID("$NetBSD: route6d.c,v 1.9 1999/09/13 11:07:52 itojun Exp $");
|
||||
#include <net/if_var.h>
|
||||
#endif /* __FreeBSD__ >= 3 */
|
||||
#define KERNEL 1
|
||||
#define _KERNEL 1
|
||||
#include <net/route.h>
|
||||
#undef KERNEL
|
||||
#undef _KERNEL
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/in_var.h>
|
||||
#include <netinet/ip6.h>
|
||||
#include <netinet/udp.h>
|
||||
#include <netdb.h>
|
||||
#ifdef HAVE_GETIFADDRS
|
||||
#include <ifaddrs.h>
|
||||
#endif
|
||||
|
||||
#include <arpa/inet.h>
|
||||
|
||||
@ -206,8 +209,6 @@ static u_long seq = 0;
|
||||
#define RTF_CHANGED 0x80000000
|
||||
#define RTF_ROUTE_H 0xffff
|
||||
|
||||
extern int errno;
|
||||
|
||||
int main __P((int, char **));
|
||||
void ripalarm __P((int));
|
||||
void riprecv __P((void));
|
||||
@ -215,7 +216,7 @@ void ripsend __P((struct ifc *, struct sockaddr_in6 *, int));
|
||||
void init __P((void));
|
||||
void sockopt __P((struct ifc *));
|
||||
void ifconfig __P((void));
|
||||
void ifconfig1 __P((struct ifreq *, struct ifc *, int));
|
||||
void ifconfig1 __P((const char *, const struct sockaddr *, struct ifc *, int));
|
||||
void rtrecv __P((void));
|
||||
int rt_del __P((const struct sockaddr_in6 *, const struct sockaddr_in6 *,
|
||||
const struct sockaddr_in6 *));
|
||||
@ -545,8 +546,15 @@ init()
|
||||
fatal("rip IPV6_MULTICAST_LOOP");
|
||||
#ifdef ADVAPI
|
||||
i = 1;
|
||||
if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_PKTINFO, &i, sizeof(i)) < 0)
|
||||
#ifdef IPV6_RECVPKTINFO
|
||||
if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_RECVPKTINFO, &i,
|
||||
sizeof(i)) < 0)
|
||||
fatal("rip IPV6_RECVPKTINFO");
|
||||
#else /* old adv. API */
|
||||
if (setsockopt(ripsock, IPPROTO_IPV6, IPV6_PKTINFO, &i,
|
||||
sizeof(i)) < 0)
|
||||
fatal("rip IPV6_PKTINFO");
|
||||
#endif
|
||||
#endif /*ADVAPI*/
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
@ -1204,6 +1212,65 @@ riprequest(ifcp, np, nn, sin)
|
||||
void
|
||||
ifconfig()
|
||||
{
|
||||
#ifdef HAVE_GETIFADDRS
|
||||
struct ifaddrs *ifap, *ifa;
|
||||
struct ifc *ifcp;
|
||||
struct ipv6_mreq mreq;
|
||||
int s;
|
||||
|
||||
if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
|
||||
fatal("socket");
|
||||
|
||||
if (getifaddrs(&ifap) != 0)
|
||||
fatal("getifaddrs");
|
||||
|
||||
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
||||
if (ifa->ifa_addr->sa_family != AF_INET6)
|
||||
continue;
|
||||
ifcp = ifc_find(ifa->ifa_name);
|
||||
/* we are interested in multicast-capable interfaces */
|
||||
if ((ifa->ifa_flags & IFF_MULTICAST) == 0)
|
||||
continue;
|
||||
if (!ifcp) {
|
||||
/* new interface */
|
||||
ifcp = (struct ifc *)malloc(sizeof(*ifcp));
|
||||
memset(ifcp, 0, sizeof(*ifcp));
|
||||
ifcp->ifc_index = -1;
|
||||
ifcp->ifc_next = ifc;
|
||||
ifc = ifcp;
|
||||
nifc++;
|
||||
ifcp->ifc_name = allocopy(ifa->ifa_name);
|
||||
ifcp->ifc_addr = 0;
|
||||
ifcp->ifc_filter = 0;
|
||||
ifcp->ifc_flags = ifa->ifa_flags;
|
||||
trace(1, "newif %s <%s>\n", ifcp->ifc_name,
|
||||
ifflags(ifcp->ifc_flags));
|
||||
if (!strcmp(ifcp->ifc_name, LOOPBACK_IF))
|
||||
loopifcp = ifcp;
|
||||
} else {
|
||||
/* update flag, this may be up again */
|
||||
if (ifcp->ifc_flags != ifa->ifa_flags) {
|
||||
trace(1, "%s: <%s> -> ", ifcp->ifc_name,
|
||||
ifflags(ifcp->ifc_flags));
|
||||
trace(1, "<%s>\n", ifflags(ifa->ifa_flags));
|
||||
}
|
||||
ifcp->ifc_flags = ifa->ifa_flags;
|
||||
}
|
||||
ifconfig1(ifa->ifa_name, ifa->ifa_addr, ifcp, s);
|
||||
if ((ifcp->ifc_flags & (IFF_LOOPBACK | IFF_UP)) == IFF_UP
|
||||
&& 0 < ifcp->ifc_index && !ifcp->ifc_joined) {
|
||||
mreq.ipv6mr_multiaddr = ifcp->ifc_ripsin.sin6_addr;
|
||||
mreq.ipv6mr_interface = ifcp->ifc_index;
|
||||
if (setsockopt(ripsock, IPPROTO_IPV6,
|
||||
IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) < 0)
|
||||
fatal("IPV6_JOIN_GROUP");
|
||||
trace(1, "join %s %s\n", ifcp->ifc_name, RIP6_DEST);
|
||||
ifcp->ifc_joined++;
|
||||
}
|
||||
}
|
||||
close(s);
|
||||
freeifaddrs(ifap);
|
||||
#else
|
||||
int s, i;
|
||||
char *buf;
|
||||
struct ifconf ifconf;
|
||||
@ -1231,6 +1298,8 @@ ifconfig()
|
||||
fatal("ioctl: SIOCGIFCONF");
|
||||
i = ifconf.ifc_len;
|
||||
while (1) {
|
||||
char *newbuf;
|
||||
|
||||
ifconf.ifc_buf = buf;
|
||||
ifconf.ifc_len = bufsiz;
|
||||
if (ioctl(s, SIOCGIFCONF, (char *)&ifconf) < 0)
|
||||
@ -1239,8 +1308,11 @@ ifconfig()
|
||||
break;
|
||||
i = ifconf.ifc_len;
|
||||
bufsiz *= 2;
|
||||
if ((buf = (char *)realloc(buf, bufsiz)) == NULL)
|
||||
if ((newbuf = (char *)realloc(buf, bufsiz)) == NULL) {
|
||||
free(buf);
|
||||
fatal("realloc");
|
||||
}
|
||||
buf = newbuf;
|
||||
}
|
||||
for (i = 0; i < ifconf.ifc_len; ) {
|
||||
ifrp = (struct ifreq *)(buf + i);
|
||||
@ -1278,7 +1350,7 @@ ifconfig()
|
||||
}
|
||||
ifcp->ifc_flags = ifr.ifr_flags;
|
||||
}
|
||||
ifconfig1(ifrp, ifcp, s);
|
||||
ifconfig1(ifrp->ifr_name, &ifrp->ifr_addr, ifcp, s);
|
||||
if ((ifcp->ifc_flags & (IFF_LOOPBACK | IFF_UP)) == IFF_UP
|
||||
&& 0 < ifcp->ifc_index && !ifcp->ifc_joined) {
|
||||
mreq.ipv6mr_multiaddr = ifcp->ifc_ripsin.sin6_addr;
|
||||
@ -1298,11 +1370,13 @@ skip:
|
||||
}
|
||||
close(s);
|
||||
free(buf);
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
ifconfig1(ifrp, ifcp, s)
|
||||
struct ifreq *ifrp;
|
||||
ifconfig1(name, sa, ifcp, s)
|
||||
const char *name;
|
||||
const struct sockaddr *sa;
|
||||
struct ifc *ifcp;
|
||||
int s;
|
||||
{
|
||||
@ -1312,9 +1386,9 @@ ifconfig1(ifrp, ifcp, s)
|
||||
int plen;
|
||||
char buf[BUFSIZ];
|
||||
|
||||
sin = (struct sockaddr_in6 *)&ifrp->ifr_addr;
|
||||
sin = (struct sockaddr_in6 *)sa;
|
||||
ifr.ifr_addr = *sin;
|
||||
strcpy(ifr.ifr_name, ifrp->ifr_name);
|
||||
strcpy(ifr.ifr_name, name);
|
||||
if (ioctl(s, SIOCGIFNETMASK_IN6, (char *)&ifr) < 0)
|
||||
fatal("ioctl: SIOCGIFNETMASK_IN6");
|
||||
plen = mask2len(&ifr.ifr_addr.sin6_addr, 16);
|
||||
|
@ -1,8 +1,5 @@
|
||||
/* $NetBSD: route6d.h,v 1.4 1999/12/16 05:55:54 itojun Exp $ */
|
||||
|
||||
/*
|
||||
* KAME Header: /cvsroot/kame/kame/kame/kame/route6d/route6d.h,v 1.2 1999/12/16 05:38:44 jinmei Exp
|
||||
*/
|
||||
/* $NetBSD: route6d.h,v 1.5 2000/02/25 06:22:05 itojun Exp $ */
|
||||
/* $KAME: route6d.h,v 1.3 2000/02/25 06:15:06 itojun Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
||||
|
Loading…
Reference in New Issue
Block a user