summaryrefslogtreecommitdiff
path: root/sbin/ifconfig/ifconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/ifconfig/ifconfig.c')
-rw-r--r--sbin/ifconfig/ifconfig.c86
1 files changed, 49 insertions, 37 deletions
diff --git a/sbin/ifconfig/ifconfig.c b/sbin/ifconfig/ifconfig.c
index 51294cc1334..c0b93ec92a5 100644
--- a/sbin/ifconfig/ifconfig.c
+++ b/sbin/ifconfig/ifconfig.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ifconfig.c,v 1.6 1997/01/21 18:10:39 deraadt Exp $ */
+/* $OpenBSD: ifconfig.c,v 1.7 1997/06/17 14:43:33 deraadt Exp $ */
/* $NetBSD: ifconfig.c,v 1.22 1996/01/04 20:11:20 pk Exp $ */
/*
@@ -44,7 +44,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)ifconfig.c 8.2 (Berkeley) 2/16/94";
#else
-static char rcsid[] = "$OpenBSD: ifconfig.c,v 1.6 1997/01/21 18:10:39 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: ifconfig.c,v 1.7 1997/06/17 14:43:33 deraadt Exp $";
#endif
#endif /* not lint */
@@ -154,9 +154,9 @@ struct cmd {
void adjust_nsellength();
int getinfo __P((struct ifreq *));
void getsock __P((int));
-void printall __P((void));
+void printif __P((struct ifreq *));
void printb __P((char *, unsigned short, char *));
-void status();
+void status __P((int));
void usage();
/*
@@ -227,16 +227,17 @@ main(argc, argv)
if (aflag) {
if (argc > 0)
usage();
- printall();
+ printif(NULL);
exit(0);
}
strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- if (getinfo(&ifr) < 0)
- exit(1);
if (argc == 0) {
- status();
+ printif(&ifr);
exit(0);
}
+
+ if (getinfo(&ifr) < 0)
+ exit(1);
while (argc > 0) {
register struct cmd *p;
@@ -348,11 +349,12 @@ getinfo(ifr)
}
void
-printall()
+printif(ifrm)
+ struct ifreq *ifrm;
{
char *inbuf = NULL;
struct ifconf ifc;
- struct ifreq ifreq, *ifr;
+ struct ifreq ifreq, *ifrp;
int i, len = 8192;
getsock(af);
@@ -369,22 +371,39 @@ printall()
break;
len *= 2;
}
- ifr = ifc.ifc_req;
+ ifrp = ifc.ifc_req;
ifreq.ifr_name[0] = '\0';
for (i = 0; i < ifc.ifc_len; ) {
- ifr = (struct ifreq *)((caddr_t)ifc.ifc_req + i);
- i += sizeof(ifr->ifr_name) +
- (ifr->ifr_addr.sa_len > sizeof(struct sockaddr)
- ? ifr->ifr_addr.sa_len
+ ifrp = (struct ifreq *)((caddr_t)ifc.ifc_req + i);
+ i += sizeof(ifrp->ifr_name) +
+ (ifrp->ifr_addr.sa_len > sizeof(struct sockaddr)
+ ? ifrp->ifr_addr.sa_len
: sizeof(struct sockaddr));
- if (!strncmp(ifreq.ifr_name, ifr->ifr_name,
- sizeof(ifr->ifr_name)))
+
+ if (ifrm && strncmp(ifrm->ifr_name, ifrp->ifr_name,
+ sizeof(ifrp->ifr_name)))
continue;
- strncpy(name, ifr->ifr_name, sizeof(ifr->ifr_name));
- ifreq = *ifr;
- if (getinfo(&ifreq) < 0)
+ strncpy(name, ifrp->ifr_name, sizeof(ifrp->ifr_name));
+ if (ifrp->ifr_addr.sa_family == AF_LINK) {
+ ifreq = ifr = *ifrp;
+ if (getinfo(&ifreq) < 0)
+ continue;
+ status(1);
continue;
- status();
+ }
+ if (!strncmp(ifreq.ifr_name, ifrp->ifr_name,
+ sizeof(ifrp->ifr_name))) {
+ register struct afswtch *p = afp;
+
+ ifr = *ifrp;
+ if ((p = afp) != NULL) {
+ (*p->af_status)(1);
+ } else for (p = afs; p->af_name; p++) {
+ ifr.ifr_addr.sa_family = p->af_af;
+ (*p->af_status)(0);
+ }
+ continue;
+ }
}
free(inbuf);
}
@@ -511,7 +530,8 @@ setifmetric(val)
* specified, show it and it only; otherwise, show them all.
*/
void
-status()
+status(link)
+ int link;
{
register struct afswtch *p = afp;
@@ -520,11 +540,13 @@ status()
if (metric)
printf(" metric %d", metric);
putchar('\n');
- if ((p = afp) != NULL) {
- (*p->af_status)(1);
- } else for (p = afs; p->af_name; p++) {
- ifr.ifr_addr.sa_family = p->af_af;
- (*p->af_status)(0);
+ if (link == 0) {
+ if ((p = afp) != NULL) {
+ (*p->af_status)(1);
+ } else for (p = afs; p->af_name; p++) {
+ ifr.ifr_addr.sa_family = p->af_af;
+ (*p->af_status)(0);
+ }
}
}
@@ -541,16 +563,6 @@ in_status(force)
return;
err(1, "socket");
}
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- if (ioctl(s, SIOCGIFADDR, (caddr_t)&ifr) < 0) {
- if (errno == EADDRNOTAVAIL || errno == EAFNOSUPPORT) {
- if (!force)
- return;
- memset(&ifr.ifr_addr, 0, sizeof(ifr.ifr_addr));
- } else
- warn("SIOCGIFADDR");
- }
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
sin = (struct sockaddr_in *)&ifr.ifr_addr;
printf("\tinet %s ", inet_ntoa(sin->sin_addr));