kldstat.c revision 113936
125540Sdfr/*- 225540Sdfr * Copyright (c) 1997 Doug Rabson 325540Sdfr * All rights reserved. 425540Sdfr * 525540Sdfr * Redistribution and use in source and binary forms, with or without 625540Sdfr * modification, are permitted provided that the following conditions 725540Sdfr * are met: 825540Sdfr * 1. Redistributions of source code must retain the above copyright 925540Sdfr * notice, this list of conditions and the following disclaimer. 1025540Sdfr * 2. Redistributions in binary form must reproduce the above copyright 1125540Sdfr * notice, this list of conditions and the following disclaimer in the 1225540Sdfr * documentation and/or other materials provided with the distribution. 1325540Sdfr * 1425540Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1525540Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1625540Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1725540Sdfr * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1825540Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1925540Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2025540Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2125540Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2225540Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2325540Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2425540Sdfr * SUCH DAMAGE. 2525540Sdfr */ 2625540Sdfr 2732270Scharnier#ifndef lint 2832270Scharnierstatic const char rcsid[] = 2950476Speter "$FreeBSD: head/sbin/kldstat/kldstat.c 113936 2003-04-23 20:33:57Z johan $"; 3032270Scharnier#endif /* not lint */ 3132270Scharnier 3230573Sjmg#include <err.h> 33113933Sjohan#include <stdint.h> 3425540Sdfr#include <stdio.h> 3530573Sjmg#include <stdlib.h> 3625540Sdfr#include <unistd.h> 3725540Sdfr#include <sys/types.h> 3825540Sdfr#include <sys/param.h> 3925540Sdfr#include <sys/module.h> 4025540Sdfr#include <sys/linker.h> 4125540Sdfr 4254130Smarcel#if defined(__alpha__) 4354130Smarcel#define POINTER_WIDTH 18 4454130Smarcel#else 4554130Smarcel#define POINTER_WIDTH 10 4654130Smarcel#endif 4754130Smarcel 4830627Sjmgstatic void 4930627Sjmgprintmod(int modid) 5025540Sdfr{ 5125540Sdfr struct module_stat stat; 5225540Sdfr 5325540Sdfr stat.version = sizeof(struct module_stat); 5425540Sdfr if (modstat(modid, &stat) < 0) 5532270Scharnier warn("can't stat module id %d", modid); 5625540Sdfr else 5762327Sps printf("\t\t%2d %s\n", stat.id, stat.name); 5825540Sdfr} 5925540Sdfr 6025540Sdfrstatic void printfile(int fileid, int verbose) 6125540Sdfr{ 6225540Sdfr struct kld_file_stat stat; 6325540Sdfr int modid; 6425540Sdfr 6525540Sdfr stat.version = sizeof(struct kld_file_stat); 6625540Sdfr if (kldstat(fileid, &stat) < 0) 6732270Scharnier warn("can't stat file id %d", fileid); 6825540Sdfr else 69113933Sjohan printf("%2d %4d %p %-8jx %s\n", 70113933Sjohan stat.id, stat.refs, stat.address, (uintmax_t)stat.size, 71113933Sjohan stat.name); 7225540Sdfr 7325540Sdfr if (verbose) { 7425540Sdfr printf("\tContains modules:\n"); 7562327Sps printf("\t\tId Name\n"); 7625540Sdfr for (modid = kldfirstmod(fileid); modid > 0; 7725540Sdfr modid = modfnext(modid)) 7825540Sdfr printmod(modid); 7925540Sdfr } 8025540Sdfr} 8125540Sdfr 8225540Sdfrstatic void 8330627Sjmgusage(void) 8425540Sdfr{ 8532270Scharnier fprintf(stderr, "usage: kldstat [-v] [-i id] [-n name]\n"); 8625540Sdfr exit(1); 8725540Sdfr} 8825540Sdfr 8930627Sjmgint 9030627Sjmgmain(int argc, char** argv) 9125540Sdfr{ 9225540Sdfr int c; 9325540Sdfr int verbose = 0; 9425540Sdfr int fileid = 0; 95113936Sjohan char* filename = NULL; 9625540Sdfr 9730627Sjmg while ((c = getopt(argc, argv, "i:n:v")) != -1) 9825540Sdfr switch (c) { 9925540Sdfr case 'i': 10025540Sdfr fileid = atoi(optarg); 10125540Sdfr break; 10225540Sdfr case 'n': 10325540Sdfr filename = optarg; 10425540Sdfr break; 10530627Sjmg case 'v': 10630627Sjmg verbose = 1; 10730627Sjmg break; 10825540Sdfr default: 10925540Sdfr usage(); 11025540Sdfr } 11125540Sdfr argc -= optind; 11225540Sdfr argv += optind; 11325540Sdfr 11425540Sdfr if (argc != 0) 11525540Sdfr usage(); 11625540Sdfr 117113936Sjohan if (filename != NULL) { 11830627Sjmg if ((fileid = kldfind(filename)) < 0) 11932270Scharnier err(1, "can't find file %s", filename); 12025540Sdfr } 12125540Sdfr 12254130Smarcel printf("Id Refs Address%*c Size Name\n", POINTER_WIDTH - 7, ' '); 123113936Sjohan if (fileid != 0) 12425540Sdfr printfile(fileid, verbose); 12525540Sdfr else 12625540Sdfr for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) 12725540Sdfr printfile(fileid, verbose); 12825540Sdfr 12925540Sdfr return 0; 13025540Sdfr} 131