1a79fe607SDoug Rabson /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 31de7b4b8SPedro F. Giffuni * 4a79fe607SDoug Rabson * Copyright (c) 1997 Doug Rabson 5a79fe607SDoug Rabson * All rights reserved. 6a79fe607SDoug Rabson * 7a79fe607SDoug Rabson * Redistribution and use in source and binary forms, with or without 8a79fe607SDoug Rabson * modification, are permitted provided that the following conditions 9a79fe607SDoug Rabson * are met: 10a79fe607SDoug Rabson * 1. Redistributions of source code must retain the above copyright 11a79fe607SDoug Rabson * notice, this list of conditions and the following disclaimer. 12a79fe607SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright 13a79fe607SDoug Rabson * notice, this list of conditions and the following disclaimer in the 14a79fe607SDoug Rabson * documentation and/or other materials provided with the distribution. 15a79fe607SDoug Rabson * 16a79fe607SDoug Rabson * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17a79fe607SDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18a79fe607SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19a79fe607SDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20a79fe607SDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21a79fe607SDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22a79fe607SDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23a79fe607SDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24a79fe607SDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25a79fe607SDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26a79fe607SDoug Rabson * SUCH DAMAGE. 27a79fe607SDoug Rabson */ 28a79fe607SDoug Rabson 29c69284caSDavid E. O'Brien #include <sys/cdefs.h> 30c69284caSDavid E. O'Brien __FBSDID("$FreeBSD$"); 3157e78ffbSPhilippe Charnier 32a79fe607SDoug Rabson #include <sys/types.h> 33a79fe607SDoug Rabson #include <sys/param.h> 34a79fe607SDoug Rabson #include <sys/module.h> 35a79fe607SDoug Rabson #include <sys/linker.h> 36a79fe607SDoug Rabson 3783237efcSHans Petter Selasky #include <err.h> 3883237efcSHans Petter Selasky #include <libutil.h> 3983237efcSHans Petter Selasky #include <stdio.h> 4083237efcSHans Petter Selasky #include <stdlib.h> 4183237efcSHans Petter Selasky #include <strings.h> 4283237efcSHans Petter Selasky #include <unistd.h> 4383237efcSHans Petter Selasky 4483237efcSHans Petter Selasky #define PTR_WIDTH ((int)(sizeof(void *) * 2 + 2)) 4583237efcSHans Petter Selasky 4683237efcSHans Petter Selasky static void printmod(int); 4783237efcSHans Petter Selasky static void printfile(int, int, int); 4883237efcSHans Petter Selasky static void usage(void) __dead2; 49fb2ef615SMarcel Moolenaar 50637733b1SJulian Elischer static int showdata = 0; 51637733b1SJulian Elischer 522830148aSJohn-Mark Gurney static void 532830148aSJohn-Mark Gurney printmod(int modid) 54a79fe607SDoug Rabson { 55a79fe607SDoug Rabson struct module_stat stat; 56a79fe607SDoug Rabson 57637733b1SJulian Elischer bzero(&stat, sizeof(stat)); 58a79fe607SDoug Rabson stat.version = sizeof(struct module_stat); 5983237efcSHans Petter Selasky if (modstat(modid, &stat) < 0) { 6057e78ffbSPhilippe Charnier warn("can't stat module id %d", modid); 6183237efcSHans Petter Selasky return; 6283237efcSHans Petter Selasky } 6383237efcSHans Petter Selasky if (showdata) { 64337c8143SHans Petter Selasky printf("\t\t%3d %s (%d, %u, 0x%lx)\n", stat.id, 65337c8143SHans Petter Selasky stat.name, stat.data.intval, stat.data.uintval, 66337c8143SHans Petter Selasky stat.data.ulongval); 6783237efcSHans Petter Selasky } else 68294b242dSMichael Tuexen printf("\t\t%3d %s\n", stat.id, stat.name); 69a79fe607SDoug Rabson } 70a79fe607SDoug Rabson 7135e3987fSKonstantin Belousov static void 721b18fc10SEdward Tomasz Napierala printfile(int fileid, int verbose, int humanized) 73a79fe607SDoug Rabson { 74a79fe607SDoug Rabson struct kld_file_stat stat; 75a79fe607SDoug Rabson int modid; 761b18fc10SEdward Tomasz Napierala char buf[5]; 77a79fe607SDoug Rabson 78a79fe607SDoug Rabson stat.version = sizeof(struct kld_file_stat); 7983237efcSHans Petter Selasky if (kldstat(fileid, &stat) < 0) 8035e3987fSKonstantin Belousov err(1, "can't stat file id %d", fileid); 811b18fc10SEdward Tomasz Napierala if (humanized) { 821b18fc10SEdward Tomasz Napierala humanize_number(buf, sizeof(buf), stat.size, 831b18fc10SEdward Tomasz Napierala "", HN_AUTOSCALE, HN_DECIMAL | HN_NOSPACE); 841b18fc10SEdward Tomasz Napierala 856130efe4SMichael Tuexen printf("%2d %4d %*p %5s %s", 8683237efcSHans Petter Selasky stat.id, stat.refs, PTR_WIDTH, stat.address, 87337c8143SHans Petter Selasky buf, stat.name); 881b18fc10SEdward Tomasz Napierala } else { 896130efe4SMichael Tuexen printf("%2d %4d %*p %8zx %s", 9083237efcSHans Petter Selasky stat.id, stat.refs, PTR_WIDTH, stat.address, 91337c8143SHans Petter Selasky stat.size, stat.name); 921b18fc10SEdward Tomasz Napierala } 93a79fe607SDoug Rabson 94a79fe607SDoug Rabson if (verbose) { 9597a7a569SAndrew Thompson printf(" (%s)\n", stat.pathname); 96a79fe607SDoug Rabson printf("\tContains modules:\n"); 9761c3dd35SPaul Saab printf("\t\t Id Name\n"); 98337c8143SHans Petter Selasky for (modid = kldfirstmod(fileid); modid > 0; modid = modfnext(modid)) 99a79fe607SDoug Rabson printmod(modid); 10097a7a569SAndrew Thompson } else 10197a7a569SAndrew Thompson printf("\n"); 102a79fe607SDoug Rabson } 103a79fe607SDoug Rabson 10483237efcSHans Petter Selasky static void __dead2 1052830148aSJohn-Mark Gurney usage(void) 106a79fe607SDoug Rabson { 10783237efcSHans Petter Selasky fprintf(stderr, "usage: %1$s [-dhqv] [-i id] [-n filename]\n" 10883237efcSHans Petter Selasky " %1$s [-dq] [-m modname]\n", getprogname()); 109a79fe607SDoug Rabson exit(1); 110a79fe607SDoug Rabson } 111a79fe607SDoug Rabson 1122830148aSJohn-Mark Gurney int 11383237efcSHans Petter Selasky main(int argc, char *argv[]) 114a79fe607SDoug Rabson { 11583237efcSHans Petter Selasky struct module_stat stat; 1161b18fc10SEdward Tomasz Napierala int humanized = 0; 117a79fe607SDoug Rabson int verbose = 0; 118a79fe607SDoug Rabson int fileid = 0; 11990217cddSPawel Jakub Dawidek int quiet = 0; 12083237efcSHans Petter Selasky int c, modid; 1217f107457SJohan Karlsson char *filename = NULL; 1225d6d6d38SMax Khon char *modname = NULL; 1239c4c393aSJuli Mallett char *p; 124a79fe607SDoug Rabson 12583237efcSHans Petter Selasky while ((c = getopt(argc, argv, "dhi:m:n:qv")) != -1) { 126a79fe607SDoug Rabson switch (c) { 127637733b1SJulian Elischer case 'd': 128637733b1SJulian Elischer showdata = 1; 129637733b1SJulian Elischer break; 1301b18fc10SEdward Tomasz Napierala case 'h': 1311b18fc10SEdward Tomasz Napierala humanized = 1; 1321b18fc10SEdward Tomasz Napierala break; 133a79fe607SDoug Rabson case 'i': 1349c4c393aSJuli Mallett fileid = (int)strtoul(optarg, &p, 10); 1359c4c393aSJuli Mallett if (*p != '\0') 1369c4c393aSJuli Mallett usage(); 137a79fe607SDoug Rabson break; 1385d6d6d38SMax Khon case 'm': 1395d6d6d38SMax Khon modname = optarg; 1405d6d6d38SMax Khon break; 141a79fe607SDoug Rabson case 'n': 142a79fe607SDoug Rabson filename = optarg; 143a79fe607SDoug Rabson break; 14490217cddSPawel Jakub Dawidek case 'q': 14590217cddSPawel Jakub Dawidek quiet = 1; 14690217cddSPawel Jakub Dawidek break; 1472830148aSJohn-Mark Gurney case 'v': 1482830148aSJohn-Mark Gurney verbose = 1; 1492830148aSJohn-Mark Gurney break; 150a79fe607SDoug Rabson default: 151a79fe607SDoug Rabson usage(); 152a79fe607SDoug Rabson } 15383237efcSHans Petter Selasky } 154a79fe607SDoug Rabson argc -= optind; 155a79fe607SDoug Rabson argv += optind; 156a79fe607SDoug Rabson 157a79fe607SDoug Rabson if (argc != 0) 158a79fe607SDoug Rabson usage(); 159a79fe607SDoug Rabson 1605d6d6d38SMax Khon if (modname != NULL) { 16190217cddSPawel Jakub Dawidek if ((modid = modfind(modname)) < 0) { 16290217cddSPawel Jakub Dawidek if (!quiet) 16390217cddSPawel Jakub Dawidek warn("can't find module %s", modname); 16483237efcSHans Petter Selasky return (1); 16583237efcSHans Petter Selasky } else if (quiet) 16683237efcSHans Petter Selasky return (0); 1675d6d6d38SMax Khon 1685d6d6d38SMax Khon stat.version = sizeof(struct module_stat); 1695d6d6d38SMax Khon if (modstat(modid, &stat) < 0) 1705d6d6d38SMax Khon warn("can't stat module id %d", modid); 1715d6d6d38SMax Khon else { 172637733b1SJulian Elischer if (showdata) { 173637733b1SJulian Elischer printf("Id Refs Name data..(int, uint, ulong)\n"); 174337c8143SHans Petter Selasky printf("%3d %4d %s (%d, %u, 0x%lx)\n", 175337c8143SHans Petter Selasky stat.id, stat.refs, stat.name, 176337c8143SHans Petter Selasky stat.data.intval, stat.data.uintval, 177337c8143SHans Petter Selasky stat.data.ulongval); 178637733b1SJulian Elischer } else { 1795d6d6d38SMax Khon printf("Id Refs Name\n"); 180337c8143SHans Petter Selasky printf("%3d %4d %s\n", stat.id, stat.refs, 181337c8143SHans Petter Selasky stat.name); 1825d6d6d38SMax Khon } 183637733b1SJulian Elischer } 1845d6d6d38SMax Khon 18583237efcSHans Petter Selasky return (0); 1865d6d6d38SMax Khon } 1875d6d6d38SMax Khon 1887f107457SJohan Karlsson if (filename != NULL) { 1893e8cf495SBaptiste Daroussin if ((fileid = kldfind(filename)) < 0) { 1903e8cf495SBaptiste Daroussin if (!quiet) 1913e8cf495SBaptiste Daroussin warn("can't find file %s", filename); 19283237efcSHans Petter Selasky return (1); 19383237efcSHans Petter Selasky } else if (quiet) 19483237efcSHans Petter Selasky return (0); 195a79fe607SDoug Rabson } 196a79fe607SDoug Rabson 19783237efcSHans Petter Selasky if (humanized) { 19883237efcSHans Petter Selasky printf("Id Refs Address%*c %5s Name\n", PTR_WIDTH - 7, 199337c8143SHans Petter Selasky ' ', "Size"); 20083237efcSHans Petter Selasky } else { 20183237efcSHans Petter Selasky printf("Id Refs Address%*c %8s Name\n", PTR_WIDTH - 7, 202337c8143SHans Petter Selasky ' ', "Size"); 20383237efcSHans Petter Selasky } 2047f107457SJohan Karlsson if (fileid != 0) 2051b18fc10SEdward Tomasz Napierala printfile(fileid, verbose, humanized); 206a79fe607SDoug Rabson else 207a79fe607SDoug Rabson for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) 2081b18fc10SEdward Tomasz Napierala printfile(fileid, verbose, humanized); 209a79fe607SDoug Rabson 21083237efcSHans Petter Selasky return (0); 211a79fe607SDoug Rabson } 212