2021-10-11 18:37:13 -03:00

195 lines
3.3 KiB
C

/* @(#)modstat.c 1.1 94/10/31 SMI */
/*
* Copyright (c) 1988 by Sun Microsystems, Inc.
*/
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/errno.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <machine/param.h>
#include <sun/vddrv.h>
#include <stdio.h>
extern void error();
struct vdioctl_stat vdistat;
int stat_all, verbose;
/*
* Display status of all loaded modules
*/
main(argc, argv)
int argc;
char **argv;
{
struct vdstat vdstat;
int first_mod = 1, fd;
/*
* Open the pseudo-driver.
*/
if ((fd = open("/dev/vd", O_RDONLY, 0)) < 0)
error("can't open /dev/vd");
get_args(argc, argv);
do {
vdistat.vdi_vdstat = &vdstat; /* status buffer */
vdistat.vdi_vdstatsize = sizeof (struct vdstat); /* buf size*/
/*
* Get info about a loaded module.
*/
if (ioctl(fd, VDSTAT, (char *)&vdistat) < 0)
error("can't get module status");
if (vdistat.vdi_vdstatsize == 0) {
if (verbose)
printf("no modules loaded\n");
exit(0); /* nothing loaded */
}
if (first_mod) {
first_mod = 0;
printf(
"Id Type Loadaddr Size B-major C-major Sysnum Mod Name\n");
}
print_status(&vdstat);
} while (stat_all && vdistat.vdi_id != -1);
exit(0);
/* NOTREACHED */
}
get_args(argc, argv)
int argc;
char **argv;
{
verbose = 0;
stat_all = 1;
vdistat.vdi_id = -1;
while (--argc != 0) {
if (**++argv != '-')
usage("Invalid option %s\n", *argv);
switch ((*argv)[1]) {
case 'i':
if ((*argv)[2] != 'd')
usage("Invalid option %s\n", *argv);
if (--argc == 0)
usage("Missing module id\n");
++argv;
if (sscanf(*argv, "%d", &vdistat.vdi_id) != 1)
usage("Invalid id %s\n", *argv);
if (vdistat.vdi_id <= 0 || vdistat.vdi_id > VD_MAXID)
usage("Invalid id %d\n", vdistat.vdi_id);
stat_all = 0;
break;
case 'v':
verbose = 1;
break;
default:
usage("Invalid option %s\n", *argv);
break;
}
}
}
/*
* Display info about a loaded module.
*/
print_status(vds)
struct vdstat *vds;
{
register int magic = vds->vds_magic;
register char *type;
printf("%2d ", vds->vds_id);
switch (magic) {
case VDMAGIC_DRV:
type = " Drv";
break;
case VDMAGIC_NET:
type = " Net";
break;
case VDMAGIC_SYS:
type = " Sys";
break;
case VDMAGIC_USER:
type = "User";
break;
case VDMAGIC_PSEUDO:
type = "Pdrv";
break;
case VDMAGIC_MBDRV:
type = "Mdrv";
break;
case VDMAGIC_MBNET:
type = "Mnet";
break;
default:
type = "????";
break;
}
printf("%4.4s %8x %8x ", type, vds->vds_vaddr, vds->vds_size);
switch (magic) {
case VDMAGIC_DRV:
case VDMAGIC_PSEUDO:
case VDMAGIC_MBDRV:
if (vds->vds_modinfo[0])
printf("%3d. ", (vds->vds_modinfo[0] & 0xff));
else
printf(" ");
if (vds->vds_modinfo[1])
printf("%3d. ", (vds->vds_modinfo[1] & 0xff));
else
printf(" ");
printf(" ");
break;
case VDMAGIC_SYS:
printf(" %3d ",
(vds->vds_modinfo[0] & 0xff));
break;
default:
printf(" ");
}
vds->vds_modname[VDMAXNAMELEN - 1] = '\0';
printf("%s\n",vds->vds_modname);
}
#include <varargs.h>
/* VARARGS */
usage(va_alist)
va_dcl
{
va_list args;
char *fmt;
va_start(args);
fmt = va_arg(args, char *);
(void)vfprintf(stderr, fmt, args);
va_end(args);
(void)fprintf(stderr, "Usage: modstat [-v] [-id <N>]\n");
exit(1);
}