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