1*0db87cb7SSepherosa Ziehau #include <sys/types.h>
2*0db87cb7SSepherosa Ziehau #define _KERNEL_STRUCTURES
3*0db87cb7SSepherosa Ziehau #include <sys/file.h>
4*0db87cb7SSepherosa Ziehau #include <sys/kinfo.h>
5*0db87cb7SSepherosa Ziehau
6*0db87cb7SSepherosa Ziehau #include <err.h>
7*0db87cb7SSepherosa Ziehau #include <fcntl.h>
8*0db87cb7SSepherosa Ziehau #include <kvm.h>
9*0db87cb7SSepherosa Ziehau #include <limits.h>
10*0db87cb7SSepherosa Ziehau #include <stdio.h>
11*0db87cb7SSepherosa Ziehau #include <stdlib.h>
12*0db87cb7SSepherosa Ziehau #include <unistd.h>
13*0db87cb7SSepherosa Ziehau
14*0db87cb7SSepherosa Ziehau static void
usage(const char * cmd)15*0db87cb7SSepherosa Ziehau usage(const char *cmd)
16*0db87cb7SSepherosa Ziehau {
17*0db87cb7SSepherosa Ziehau fprintf(stderr, "%s [-N kern] [-M core]\n", cmd);
18*0db87cb7SSepherosa Ziehau exit(1);
19*0db87cb7SSepherosa Ziehau }
20*0db87cb7SSepherosa Ziehau
21*0db87cb7SSepherosa Ziehau static const char *
typestr(short type)22*0db87cb7SSepherosa Ziehau typestr(short type)
23*0db87cb7SSepherosa Ziehau {
24*0db87cb7SSepherosa Ziehau static char buf[32];
25*0db87cb7SSepherosa Ziehau
26*0db87cb7SSepherosa Ziehau switch (type) {
27*0db87cb7SSepherosa Ziehau case DTYPE_VNODE:
28*0db87cb7SSepherosa Ziehau return "file";
29*0db87cb7SSepherosa Ziehau case DTYPE_SOCKET:
30*0db87cb7SSepherosa Ziehau return "socket";
31*0db87cb7SSepherosa Ziehau case DTYPE_PIPE:
32*0db87cb7SSepherosa Ziehau return "pipe";
33*0db87cb7SSepherosa Ziehau case DTYPE_FIFO:
34*0db87cb7SSepherosa Ziehau return "fifo";
35*0db87cb7SSepherosa Ziehau case DTYPE_KQUEUE:
36*0db87cb7SSepherosa Ziehau return "kqueue";
37*0db87cb7SSepherosa Ziehau case DTYPE_CRYPTO:
38*0db87cb7SSepherosa Ziehau return "crypto";
39*0db87cb7SSepherosa Ziehau case DTYPE_MQUEUE:
40*0db87cb7SSepherosa Ziehau return "mqueue";
41*0db87cb7SSepherosa Ziehau default:
42*0db87cb7SSepherosa Ziehau snprintf(buf, sizeof(buf), "?%d", type);
43*0db87cb7SSepherosa Ziehau return buf;
44*0db87cb7SSepherosa Ziehau }
45*0db87cb7SSepherosa Ziehau }
46*0db87cb7SSepherosa Ziehau
47*0db87cb7SSepherosa Ziehau int
main(int argc,char * argv[])48*0db87cb7SSepherosa Ziehau main(int argc, char *argv[])
49*0db87cb7SSepherosa Ziehau {
50*0db87cb7SSepherosa Ziehau const char *file, *core;
51*0db87cb7SSepherosa Ziehau char *errbuf;
52*0db87cb7SSepherosa Ziehau kvm_t *kd;
53*0db87cb7SSepherosa Ziehau int opt, kfile_cnt, i;
54*0db87cb7SSepherosa Ziehau struct kinfo_file *kfile;
55*0db87cb7SSepherosa Ziehau
56*0db87cb7SSepherosa Ziehau file = NULL;
57*0db87cb7SSepherosa Ziehau core = NULL;
58*0db87cb7SSepherosa Ziehau
59*0db87cb7SSepherosa Ziehau while ((opt = getopt(argc, argv, "M:N:")) != -1) {
60*0db87cb7SSepherosa Ziehau switch (opt) {
61*0db87cb7SSepherosa Ziehau case 'M':
62*0db87cb7SSepherosa Ziehau core = optarg;
63*0db87cb7SSepherosa Ziehau break;
64*0db87cb7SSepherosa Ziehau
65*0db87cb7SSepherosa Ziehau case 'N':
66*0db87cb7SSepherosa Ziehau file = optarg;
67*0db87cb7SSepherosa Ziehau break;
68*0db87cb7SSepherosa Ziehau
69*0db87cb7SSepherosa Ziehau default:
70*0db87cb7SSepherosa Ziehau usage(argv[0]);
71*0db87cb7SSepherosa Ziehau }
72*0db87cb7SSepherosa Ziehau }
73*0db87cb7SSepherosa Ziehau
74*0db87cb7SSepherosa Ziehau errbuf = malloc(_POSIX2_LINE_MAX);
75*0db87cb7SSepherosa Ziehau if (errbuf == NULL)
76*0db87cb7SSepherosa Ziehau err(2, "malloc %d failed", _POSIX2_LINE_MAX);
77*0db87cb7SSepherosa Ziehau
78*0db87cb7SSepherosa Ziehau kd = kvm_openfiles(file, core, NULL, O_RDONLY, errbuf);
79*0db87cb7SSepherosa Ziehau if (kd == NULL)
80*0db87cb7SSepherosa Ziehau errx(2, "%s", errbuf);
81*0db87cb7SSepherosa Ziehau
82*0db87cb7SSepherosa Ziehau kfile = kvm_getfiles(kd, 0, 0, &kfile_cnt);
83*0db87cb7SSepherosa Ziehau if (kfile == NULL)
84*0db87cb7SSepherosa Ziehau errx(2, "kvm_getfiles failed %s", kvm_geterr(kd));
85*0db87cb7SSepherosa Ziehau
86*0db87cb7SSepherosa Ziehau for (i = 0; i < kfile_cnt; ++i) {
87*0db87cb7SSepherosa Ziehau printf("pid %d, fd %d, type %s\n",
88*0db87cb7SSepherosa Ziehau kfile[i].f_pid, kfile[i].f_fd, typestr(kfile[i].f_type));
89*0db87cb7SSepherosa Ziehau }
90*0db87cb7SSepherosa Ziehau
91*0db87cb7SSepherosa Ziehau kvm_close(kd);
92*0db87cb7SSepherosa Ziehau
93*0db87cb7SSepherosa Ziehau return 0;
94*0db87cb7SSepherosa Ziehau }
95