xref: /dflybsd-src/test/kvm/kvm_file/test_kvm_file.c (revision a1282e19b2c1f3e28f20d1aa56231c18453c6b6e)
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