Fix lots of non-bug questionable code:

- Don't link against libkvm and don't uselessly include <kvm.h>.
- Declare constant objects as const.
- Declare functions with the correct types.
- Call functions with the correct parameters.

Not fixed:

- The sysctl parsing remains ugly (but it may be the best we can do).
- atnetrange() should use strtoul() rather than sscanf() for better
  error checking.
This commit is contained in:
Garrett Wollman 1996-11-21 19:36:09 +00:00
parent da18dc1a65
commit a1199adebc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=19914
2 changed files with 155 additions and 112 deletions

View File

@ -1,9 +1,11 @@
# @(#)Makefile 8.1 (Berkeley) 6/5/93
# From: @(#)Makefile 8.1 (Berkeley) 6/5/93
# $Id$
PROG= ifconfig
MAN8= ifconfig.8
DPADD= ${LIBKVM} ${LIBIPX}
LDADD= -lkvm -lipx
CFLAGS+= -DNS
DPADD= ${LIBIPX}
LDADD= -lipx
COPTS= -DNS -Wall -Wmissing-prototypes -Wcast-qual -Wwrite-strings \
-Wnested-externs
.include <bsd.prog.mk>

View File

@ -31,68 +31,67 @@
* SUCH DAMAGE.
*/
/*
* 951109 - Andrew@pubnix.net - Changed to iterative buffer growing mechanism
* for ifconfig -a so all interfaces are queried.
*
* 960101 - peter@freebsd.org - Blow away the SIOCGIFCONF code and use
* sysctl() to get the structured interface conf
* and parse the messages in there. REALLY UGLY!
*/
#ifndef lint
static char copyright[] =
static const char copyright[] =
"@(#) Copyright (c) 1983, 1993\n\
The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
/*
static char sccsid[] = "@(#)ifconfig.c 8.2 (Berkeley) 2/16/94";
*/
static const char rcsid[] =
"$Id$";
#endif /* not lint */
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <net/if.h>
#include <net/if_dl.h>
#include <net/if_types.h>
#include <net/route.h>
/* IP */
#include <netinet/in.h>
#include <netinet/in_var.h>
#include <arpa/inet.h>
#include <netdb.h>
/* IPX */
#define IPXIP
#define IPTUNNEL
#include <netipx/ipx.h>
#include <netipx/ipx_if.h>
/* Appletalk */
#include <netatalk/at.h>
/* XNS */
#ifdef NS
#define NSIP
#include <netns/ns.h>
#include <netns/ns_if.h>
#endif
/* OSI */
#ifdef ISO
#define EON
#include <netiso/iso.h>
#include <netiso/iso_var.h>
#endif
#include <sys/protosw.h>
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <nlist.h>
#include <kvm.h>
#include <fcntl.h>
struct ifreq ifr, ridreq;
struct ifaliasreq addreq;
@ -116,29 +115,38 @@ int doalias;
int clearaddr;
int newaddr = 1;
int s;
kvm_t *kvmd;
extern int errno;
int setifflags(), setifaddr(), setifdstaddr(), setifnetmask();
int setifmetric(), setifmtu(), setifbroadaddr(), setifipdst();
int setatrange(), setatphase(), checkatrange();
int notealias();
struct afswtch;
void Perror __P((const char *cmd));
void checkatrange __P((struct sockaddr_at *));
int ifconfig __P((int argc, char *const *argv, int af,
const struct afswtch *rafp));
void notealias __P((const char *, int));
void printb __P((const char *s, unsigned value, const char *bits));
void rt_xaddrs __P((caddr_t, caddr_t, struct rt_addrinfo *));
void status __P((void));
typedef void c_func __P((const char *cmd, int arg));
c_func setatphase, setatrange;
c_func setifaddr, setifbroadaddr, setifdstaddr, setifnetmask;
c_func setifipdst;
c_func setifflags, setifmetric, setifmtu;
#ifdef ISO
int setsnpaoffset(), setnsellength();
c_func setsnpaoffset, setnsellength;
#endif
int notrailers();
#define NEXTARG 0xffffff
const
struct cmd {
char *c_name;
const char *c_name;
int c_parameter; /* NEXTARG means next argv */
int (*c_func)();
void (*c_func) __P((const char *, int));
} cmds[] = {
{ "up", IFF_UP, setifflags } ,
{ "down", -IFF_UP, setifflags },
{ "trailers", -1, notrailers },
{ "-trailers", 1, notrailers },
{ "arp", -IFF_NOARP, setifflags },
{ "-arp", IFF_NOARP, setifflags },
{ "debug", IFF_DEBUG, setifflags },
@ -179,23 +187,28 @@ struct cmd {
* XNS support liberally adapted from code written at the University of
* Maryland principally by James O'Toole and Chris Torek.
*/
int in_status(), in_getaddr();
int ipx_status(), ipx_getaddr();
int at_status(), at_getaddr();
typedef void af_status __P((int));
typedef void af_getaddr __P((const char *, int));
af_status in_status, ipx_status, at_status, ether_status;
af_getaddr in_getaddr, ipx_getaddr, at_getaddr;
#ifdef NS
int xns_status(), xns_getaddr();
af_status xns_status;
af_getaddr xns_getaddr;
#endif
#ifdef ISO
int iso_status(), iso_getaddr();
af_status iso_status;
af_getaddr iso_getaddr;
#endif
int ether_status();
/* Known address families */
struct afswtch {
char *af_name;
const
struct afswtch {
const char *af_name;
short af_af;
int (*af_status)();
int (*af_getaddr)();
af_status *af_status;
af_getaddr *af_getaddr;
int af_difaddr;
int af_aifaddr;
caddr_t af_ridreq;
@ -220,11 +233,7 @@ struct afswtch {
{ 0, 0, 0, 0 }
};
struct afswtch *afp; /*the address family being set or asked about*/
void rt_xaddrs __P((caddr_t, caddr_t, struct rt_addrinfo *));
int ifconfig __P((int argc, char *argv[], int af, struct afswtch *rafp));
const struct afswtch *afp; /*the address family being set or asked about*/
/*
* Expand the compacted form of addresses as returned via the
@ -263,19 +272,20 @@ struct sockaddr_dl *sdl;
struct rt_addrinfo info;
char *buf, *lim, *next;
int
main(argc, argv)
int argc;
char *argv[];
char *const *argv;
{
int af = AF_INET;
struct afswtch *rafp;
const struct afswtch *rafp;
size_t needed;
int mib[6], len;
int mib[6];
int all;
rafp = 0;
if (argc < 2) {
fprintf(stderr, "usage: ifconfig interface\n%s%s%s%s%s%s%s",
"\t[ af [ address [ dest_addr ] ] [ up ] [ down ]",
@ -374,7 +384,7 @@ main(argc, argv)
exit(1);
}
ifconfig(argc,argv,af,rafp);
ifconfig(argc, argv, af, rafp);
close(s);
@ -397,9 +407,9 @@ main(argc, argv)
int
ifconfig(argc,argv,af,rafp)
int argc;
char *argv[];
char *const *argv;
int af;
struct afswtch *rafp;
const struct afswtch *rafp;
{
strncpy(ifr.ifr_name, name, sizeof ifr.ifr_name);
@ -420,7 +430,7 @@ ifconfig(argc,argv,af,rafp)
}
while (argc > 0) {
register struct cmd *p;
register const struct cmd *p;
for (p = cmds; p->c_name; p++)
if (strcmp(*argv, p->c_name) == 0)
@ -432,7 +442,7 @@ ifconfig(argc,argv,af,rafp)
if (argv[1] == NULL)
errx(1, "'%s' requires argument",
p->c_name);
(*p->c_func)(argv[1]);
(*p->c_func)(argv[1], 0);
argc--, argv++;
} else
(*p->c_func)(*argv, p->c_parameter);
@ -504,9 +514,10 @@ ifconfig(argc,argv,af,rafp)
#define DSTADDR 3
/*ARGSUSED*/
void
setifaddr(addr, param)
char *addr;
short param;
const char *addr;
int param;
{
/*
* Delay the ioctl to set the interface addr until flags are all set.
@ -519,20 +530,26 @@ setifaddr(addr, param)
(*afp->af_getaddr)(addr, (doalias >= 0 ? ADDR : RIDADDR));
}
setifnetmask(addr)
char *addr;
void
setifnetmask(addr, dummy)
const char *addr;
int dummy __unused;
{
(*afp->af_getaddr)(addr, MASK);
}
setifbroadaddr(addr)
char *addr;
void
setifbroadaddr(addr, dummy)
const char *addr;
int dummy __unused;
{
(*afp->af_getaddr)(addr, DSTADDR);
}
setifipdst(addr)
char *addr;
void
setifipdst(addr, dummy)
const char *addr;
int dummy __unused;
{
in_getaddr(addr, DSTADDR);
setipdst++;
@ -540,9 +557,11 @@ setifipdst(addr)
newaddr = 0;
}
#define rqtosa(x) (&(((struct ifreq *)(afp->x))->ifr_addr))
/*ARGSUSED*/
void
notealias(addr, param)
char *addr;
const char *addr;
int param;
{
if (setaddr && doalias == 0 && param < 0)
bcopy((caddr_t)rqtosa(af_addreq),
@ -557,24 +576,18 @@ notealias(addr, param)
}
/*ARGSUSED*/
notrailers(vname, value)
char *vname;
int value;
{
printf("Note: trailers are no longer sent, but always received\n");
}
/*ARGSUSED*/
void
setifdstaddr(addr, param)
char *addr;
int param;
const char *addr;
int param __unused;
{
(*afp->af_getaddr)(addr, DSTADDR);
}
void
setifflags(vname, value)
char *vname;
short value;
const char *vname;
int value;
{
if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0) {
Perror("ioctl (SIOCGIFFLAGS)");
@ -593,8 +606,10 @@ setifflags(vname, value)
Perror(vname);
}
setifmetric(val)
char *val;
void
setifmetric(val, dummy)
const char *val;
int dummy __unused;
{
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
ifr.ifr_metric = atoi(val);
@ -602,8 +617,10 @@ setifmetric(val)
perror("ioctl (set metric)");
}
setifmtu(val)
char *val;
void
setifmtu(val, dummy)
const char *val;
int dummy __unused;
{
strncpy(ifr.ifr_name, name, sizeof (ifr.ifr_name));
ifr.ifr_mtu = atoi(val);
@ -612,25 +629,28 @@ setifmtu(val)
}
#ifdef ISO
setsnpaoffset(val)
void
setsnpaoffset(val, dummy)
char *val;
int dummy __unused;
{
iso_addreq.ifra_snpaoffset = atoi(val);
}
#endif
#define IFFBITS \
"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6NOTRAILERS\7RUNNING\10NOARP\
\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2\20MULTICAST"
"\020\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5POINTOPOINT\6b6\7RUNNING" \
"\10NOARP\11PROMISC\12ALLMULTI\13OACTIVE\14SIMPLEX\15LINK0\16LINK1\17LINK2" \
"\20MULTICAST"
/*
* Print the status of the interface. If an address family was
* specified, show it and it only; otherwise, show them all.
*/
void
status()
{
struct afswtch *p = NULL;
short af = ifr.ifr_addr.sa_family;
const struct afswtch *p = NULL;
char *mynext;
struct if_msghdr *myifm;
@ -688,18 +708,17 @@ status()
}
}
if (afp == NULL || afp->af_status == ether_status)
ether_status();
ether_status(0);
else if (afp && !p) {
warnx("%s has no %s IFA address!", name, afp->af_name);
}
}
void
in_status(force)
int force;
{
struct sockaddr_in *sin, null_sin;
char *inet_ntoa();
memset(&null_sin, 0, sizeof(null_sin));
@ -723,7 +742,7 @@ in_status(force)
sin = (struct sockaddr_in *)info.rti_info[RTAX_NETMASK];
if (!sin)
sin = &null_sin;
printf("netmask 0x%x ", ntohl(sin->sin_addr.s_addr));
printf("netmask 0x%lx ", (unsigned long)ntohl(sin->sin_addr.s_addr));
if (flags & IFF_BROADCAST) {
/* note RTAX_BRD overlap with IFF_POINTOPOINT */
@ -734,6 +753,7 @@ in_status(force)
putchar('\n');
}
void
ipx_status(force)
int force;
{
@ -769,6 +789,7 @@ ipx_status(force)
}
void
at_status(force)
int force;
{
@ -808,6 +829,7 @@ at_status(force)
}
#ifdef NS
void
xns_status(force)
int force;
{
@ -844,6 +866,7 @@ xns_status(force)
#endif
#ifdef ISO
void
iso_status(force)
int force;
{
@ -885,7 +908,9 @@ iso_status(force)
}
#endif
ether_status()
void
ether_status(force)
int force __unused;
{
char *cp;
int n;
@ -902,11 +927,10 @@ ether_status()
}
}
void
Perror(cmd)
char *cmd;
const char *cmd;
{
extern int errno;
switch (errno) {
case ENXIO:
@ -922,30 +946,29 @@ Perror(cmd)
}
}
struct in_addr inet_makeaddr();
#define SIN(x) ((struct sockaddr_in *) &(x))
struct sockaddr_in *sintab[] = {
SIN(ridreq.ifr_addr), SIN(addreq.ifra_addr),
SIN(addreq.ifra_mask), SIN(addreq.ifra_broadaddr)};
void
in_getaddr(s, which)
char *s;
const char *s;
int which;
{
register struct sockaddr_in *sin = sintab[which];
struct hostent *hp;
struct netent *np;
int val;
sin->sin_len = sizeof(*sin);
if (which != MASK)
sin->sin_family = AF_INET;
if (inet_aton(s, &sin->sin_addr))
;
else if (hp = gethostbyname(s))
return;
if ((hp = gethostbyname(s)) != 0)
bcopy(hp->h_addr, (char *)&sin->sin_addr, hp->h_length);
else if (np = getnetbyname(s))
else if ((np = getnetbyname(s)) != 0)
sin->sin_addr = inet_makeaddr(np->n_net, INADDR_ANY);
else
errx(1, "%s: bad value", s);
@ -954,10 +977,11 @@ in_getaddr(s, which)
/*
* Print a value a la the %b format of the kernel's printf
*/
void
printb(s, v, bits)
char *s;
register char *bits;
register unsigned short v;
const char *s;
register unsigned v;
register const char *bits;
{
register int i, any = 0;
register char c;
@ -969,7 +993,7 @@ printb(s, v, bits)
bits++;
if (bits) {
putchar('<');
while (i = *bits++) {
while ((i = *bits++) != '\0') {
if (v & (1 << (i-1))) {
if (any)
putchar(',');
@ -989,11 +1013,12 @@ struct sockaddr_ipx *sipxtab[] = {
SIPX(ridreq.ifr_addr), SIPX(addreq.ifra_addr),
SIPX(addreq.ifra_mask), SIPX(addreq.ifra_broadaddr)};
void
ipx_getaddr(addr, which)
char *addr;
const char *addr;
int which;
{
struct sockaddr_ipx *sipx = sipxtab[which];
struct ipx_addr ipx_addr();
sipx->sipx_family = AF_IPX;
sipx->sipx_len = sizeof(*sipx);
@ -1002,7 +1027,10 @@ char *addr;
printf("Attempt to set IPX netmask will be ineffectual\n");
}
at_getaddr(char *addr, int which)
void
at_getaddr(addr, which)
const char *addr;
int which;
{
struct sockaddr_at *sat = (struct sockaddr_at *) &addreq.ifra_addr;
u_int net, node;
@ -1018,7 +1046,11 @@ at_getaddr(char *addr, int which)
sat->sat_addr.s_node = node;
}
setatrange(char *range)
/* XXX FIXME -- should use strtoul for better parsing. */
void
setatrange(range, dummy)
const char *range;
int dummy __unused;
{
u_short first = 123, last = 123;
@ -1030,7 +1062,10 @@ setatrange(char *range)
at_nr.nr_lastnet = htons(last);
}
setatphase(char *phase)
void
setatphase(phase, dummy)
const char *phase;
int dummy __unused;
{
if (!strcmp(phase, "1"))
at_nr.nr_phase = 1;
@ -1040,6 +1075,7 @@ setatphase(char *phase)
errx(1, "%s: illegal phase", phase);
}
void
checkatrange(struct sockaddr_at *sat)
{
if (at_nr.nr_phase == 0)
@ -1064,11 +1100,12 @@ struct sockaddr_ns *snstab[] = {
SNS(ridreq.ifr_addr), SNS(addreq.ifra_addr),
SNS(addreq.ifra_mask), SNS(addreq.ifra_broadaddr)};
void
xns_getaddr(addr, which)
char *addr;
const char *addr;
int which;
{
struct sockaddr_ns *sns = snstab[which];
struct ns_addr ns_addr();
sns->sns_family = AF_NS;
sns->sns_len = sizeof(*sns);
@ -1084,6 +1121,7 @@ struct sockaddr_iso *sisotab[] = {
SISO(iso_ridreq.ifr_Addr), SISO(iso_addreq.ifra_addr),
SISO(iso_addreq.ifra_mask), SISO(iso_addreq.ifra_dstaddr)};
void
iso_getaddr(addr, which)
char *addr;
{
@ -1100,6 +1138,7 @@ char *addr;
}
}
void
setnsellength(val)
char *val;
{
@ -1110,6 +1149,7 @@ setnsellength(val)
errx(1, "Setting NSEL length valid only for iso");
}
void
fixnsel(s)
register struct sockaddr_iso *s;
{
@ -1118,6 +1158,7 @@ register struct sockaddr_iso *s;
s->siso_tlen = nsellength;
}
void
adjust_nsellength()
{
fixnsel(sisotab[RIDADDR]);