1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-14 10:09:48 +00:00

De-cruftify.

Use the link MIB interface rather than groveling around in kmem.
(No longer works on dead kernels, big deal.)
This commit is contained in:
Garrett Wollman 1996-10-11 18:47:10 +00:00
parent a3af8d44a3
commit cdee44e4cb
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=18873
3 changed files with 101 additions and 194 deletions

View File

@ -1,11 +1,7 @@
# from: @(#)Makefile 5.6 (Berkeley) 4/23/91
# $Id: Makefile,v 1.2 1994/10/17 06:05:31 davidg Exp $
# $Id: Makefile,v 1.3 1996/09/05 17:15:39 bde Exp $
PROG= slstat
MAN8= slstat.8
DPADD= ${LIBKVM}
LDADD= -lkvm
BINGRP= kmem
BINMODE=2555
.include <bsd.prog.mk>

View File

@ -29,9 +29,10 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)slstat.8 6.8 (Berkeley) 6/20/91
.\" From: @(#)slstat.8 6.8 (Berkeley) 6/20/91
.\" $Id$
.\"
.Dd June 20, 1991
.Dd October 11, 1996
.Dt SLSTAT 8
.Os BSD 4
.Sh NAME
@ -42,10 +43,10 @@
.Op Fl i Ar interval
.Op Fl vr
.Op Ar unit
.Op Ar system
.Op Ar core
.Sh DESCRIPTION
.Nm Slstat
The
.Nm slstat
utility
reports certain kernel statistics kept about serial line internet
protocol traffic.
.Pp
@ -63,20 +64,12 @@ Verbose display of extra fields of information.
.It Fl r
Display all values in rate per second that amount per interval.
.It Ar unit
Is a single digit specifying the slip interface. The default unit is
Is a single digit specifying the
.Tn SLIP
interface, or an interface name. The default unit is
.Sy 0
for interface
.Sy sl0 .
.It Ar system
Extract the name list from the specified
.Ar system
instead of the default,
.Pa /kernel .
.It Ar core
Extract values associated with the name list from the specified
.Ar core
instead of the default,
.Pa /dev/kmem .
.El
.Pp
By default,
@ -119,13 +112,6 @@ The command:
.Dl slstat -i 5
will print what the system is doing every five
seconds.
.Sh FILES
.Bl -tag -width /dev/kmemxxxx -compact
.It Pa /kernel
default kernel namelist
.It Pa /dev/kmem
default memory file
.El
.Sh SEE ALSO
.Xr fstat 1 ,
.Xr netstat 1 ,

View File

@ -1,6 +1,6 @@
/*
* print serial line IP statistics:
* slstat [-i interval] [-v] [interface] [system] [core]
* slstat [-i interval] [-v] [interface]
*
* Copyright (c) 1989, 1990, 1991, 1992 Regents of the University of
* California. All rights reserved.
@ -22,143 +22,118 @@
*/
#ifndef lint
static char rcsid[] = "$Id: slstat.c,v 1.4 1995/05/30 03:52:30 rgrimes Exp $";
static char rcsid[] = "$Id: slstat.c,v 1.5 1996/05/30 02:19:55 pst Exp $";
#endif
#include <sys/param.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/sysctl.h>
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <paths.h>
#include <nlist.h>
#include <kvm.h>
#include <stdlib.h>
#define INET
#include <limits.h>
#include <sys/param.h>
#include <sys/mbuf.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <sys/file.h>
#include <errno.h>
#include <signal.h>
#include <net/if.h>
#include <net/if_mib.h>
#include <net/if_types.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
#include <net/slcompress.h>
#include <net/if_slvar.h>
struct nlist nl[] = {
#define N_SOFTC 0
{ "_sl_softc" },
{ 0 }
};
static void usage __P((const char *argv0));
static void intpr __P((void));
static void catchalarm __P((int));
#define INTERFACE_PREFIX "sl%d"
char interface[IFNAMSIZ];
const char *system = NULL;
char *kmemf = NULL;
kvm_t *kvm_h;
int kflag;
int rflag;
int vflag;
unsigned interval = 5;
int unit;
int name[6];
extern char *malloc();
extern off_t lseek();
int
main(argc, argv)
int argc;
char *argv[];
{
int c;
char errbuf[_POSIX2_LINE_MAX];
int c, i;
size_t len;
int maxifno;
int index;
struct ifmibdata ifmd;
system = getbootfile();
--argc; ++argv;
while (argc > 0) {
if (strcmp(argv[0], "-v") == 0) {
while ((c = getopt(argc, argv, "vri:")) != -1) {
switch(c) {
case 'v':
++vflag;
++argv, --argc;
continue;
}
if (strcmp(argv[0], "-r") == 0) {
break;
case 'r':
++rflag;
++argv, --argc;
continue;
}
if (strcmp(argv[0], "-i") == 0 && argv[1] &&
isdigit(argv[1][0])) {
interval = atoi(argv[1]);
break;
case 'i':
interval = atoi(optarg);
if (interval <= 0)
usage();
++argv, --argc;
++argv, --argc;
continue;
}
if (isdigit(argv[0][0])) {
int s;
struct ifreq ifr;
unit = atoi(argv[0]);
if (unit < 0)
usage();
sprintf(interface, INTERFACE_PREFIX, unit);
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s < 0)
err(1, "creating socket");
strcpy(ifr.ifr_name, interface);
if (ioctl(s, SIOCGIFFLAGS, (caddr_t)&ifr) < 0)
errx(1,
"unable to confirm existence of interface '%s'",
interface);
++argv, --argc;
continue;
}
if (kflag)
usage();
system = *argv;
++argv, --argc;
if (argc > 0) {
kmemf = *argv++;
--argc;
kflag++;
usage(argv[0]);
break;
default:
usage(argv[0]);
}
}
/*
* Discard setgid privileges if not the running kernel so that bad
* guys can't print interesting stuff from kernel memory.
*/
if (system != NULL || kmemf != NULL)
setgid(getgid());
kvm_h = kvm_openfiles(system, kmemf, NULL, O_RDONLY, errbuf);
if (kvm_h == 0) {
(void)fprintf(stderr,
"slstat: kvm_openfiles(%s,%s,0): %s\n",
system, kmemf, errbuf);
exit(1);
name[0] = CTL_NET;
name[1] = PF_LINK;
name[2] = NETLINK_GENERIC;
name[3] = IFMIB_SYSTEM;
name[4] = IFMIB_IFCOUNT;
len = sizeof maxifno;
if (sysctl(name, 5, &maxifno, &len, 0, 0) < 0)
err(1, "sysctl net.link.generic.system.ifcount");
if (isdigit(argv[optind][0])) {
int s;
struct ifmibdata ifmd;
unit = atoi(argv[optind]);
if (unit < 0)
usage(argv[0]);
sprintf(interface, INTERFACE_PREFIX, unit);
} else if(strncmp(argv[optind], "sl", 2) == 0
&& isdigit(argv[optind][2])
&& sscanf(argv[optind], "sl%d", &unit) == 1) {
strncpy(interface, argv[optind], IFNAMSIZ);
} else {
usage(argv[0]);
}
if ((c = kvm_nlist(kvm_h, nl)) != 0) {
if (c > 0) {
(void)fprintf(stderr,
"slstat: undefined symbols in %s:", system);
for (c = 0; c < sizeof(nl)/sizeof(nl[0]); c++)
if (nl[c].n_type == 0)
fprintf(stderr, " %s", nl[c].n_name);
(void)fputc('\n', stderr);
} else
(void)fprintf(stderr, "slstat: kvm_nlist: %s\n",
kvm_geterr(kvm_h));
exit(1);
name[3] = IFMIB_IFDATA;
name[5] = IFDATA_GENERAL;
len = sizeof ifmd;
for (i = 1; i <= maxifno; i++) {
name[4] = i;
if (sysctl(name, 6, &ifmd, &len, 0, 0) < 0)
err(1, "sysctl");
if (strncmp(interface, ifmd.ifmd_name, IFNAMSIZ) == 0
&& ifmd.ifmd_data.ifi_type == IFT_SLIP) {
index = i;
break;
}
}
if (i > maxifno)
errx(1, "interface %s does not exist", interface);
name[4] = index;
name[5] = IFDATA_LINKSPECIFIC;
intpr();
exit(0);
}
@ -167,12 +142,12 @@ main(argc, argv)
(rflag ? interval : 1)) : sc->offset)
#define AMT (sizeof(*sc) - 2 * sizeof(sc->sc_comp.tstate))
usage()
static void
usage(argv0)
const char *argv0;
{
static char umsg[] =
"usage: slstat [-i interval] [-v] [unit] [system] [core]\n";
fprintf(stderr, umsg);
fprintf(stderr, "%s: usage:\n\t%s [-i interval] [-rv] [unit]\n",
argv0, argv0);
exit(1);
}
@ -184,22 +159,24 @@ u_char signalled; /* set if alarm goes off "early" */
* collected over that interval. Assumes that interval is non-zero.
* First line printed at top of screen is always cumulative.
*/
static void
intpr()
{
register int line = 0;
int oldmask;
void catchalarm();
struct sl_softc *sc, *osc;
off_t addr;
size_t len;
addr = nl[N_SOFTC].n_value + unit * sizeof(struct sl_softc);
sc = (struct sl_softc *)malloc(AMT);
osc = (struct sl_softc *)malloc(AMT);
bzero((char *)osc, AMT);
len = AMT;
while (1) {
if (kvm_read(kvm_h, addr, (char *)sc, AMT) < 0)
perror("kmem read");
if (sysctl(name, 6, sc, &len, 0, 0) < 0)
err(1, "sysctl linkspecific");
(void)signal(SIGALRM, catchalarm);
signalled = 0;
(void)alarm(interval);
@ -261,62 +238,10 @@ intpr()
* Called if an interval expires before sidewaysintpr has completed a loop.
* Sets a flag to not wait for the alarm.
*/
void
catchalarm()
static void
catchalarm(sig)
int sig;
{
signalled = 1;
}
#if 0
#include <kvm.h>
#include <fcntl.h>
int kd;
kopen(system, kmemf, errstr)
char *system;
char *kmemf;
char *errstr;
{
if (strcmp(system, _PATH_UNIX) == 0 &&
strcmp(kmemf, _PATH_KMEM) == 0) {
system = 0;
kmemf = 0;
}
kd = kvm_openfiles(system, kmemf, (void *)0);
if (kd == 0)
return -1;
return 0;
}
int
knlist(system, nl, errstr)
char *system;
struct nlist *nl;
char *errstr;
{
if (kd == 0)
/* kopen() must be called first */
abort();
if (kvm_nlist(nl) < 0 || nl[0].n_type == 0) {
fprintf(stderr, "%s: %s: no namelist\n", errstr, system);
return -1;
}
return 0;
}
int
kread(addr, buf, size)
off_t addr;
char *buf;
int size;
{
if (kvm_read((char *)addr, buf, size) != size)
return -1;
return 0;
}
#endif