xref: /dflybsd-src/contrib/lvm2/dist/lib/dragonfly/dev.c (revision 8bd3d23cacb2ee28cb21ee3d50f68e868fa018cc)
1*8bd3d23cSAlex Hornung /*
2*8bd3d23cSAlex Hornung  * DragonFly specific device routines are added to this file.
3*8bd3d23cSAlex Hornung  */
4*8bd3d23cSAlex Hornung 
5*8bd3d23cSAlex Hornung #include <sys/param.h>
6*8bd3d23cSAlex Hornung #include <sys/types.h>
7*8bd3d23cSAlex Hornung 
8*8bd3d23cSAlex Hornung #include <sys/sysctl.h>
9*8bd3d23cSAlex Hornung 
10*8bd3d23cSAlex Hornung #include <dirent.h>
11*8bd3d23cSAlex Hornung #include <stdio.h>
12*8bd3d23cSAlex Hornung #include <stdlib.h>
13*8bd3d23cSAlex Hornung #include <string.h>
14*8bd3d23cSAlex Hornung #include <unistd.h>
15*8bd3d23cSAlex Hornung #include <ctype.h>
16*8bd3d23cSAlex Hornung #include <fcntl.h>
17*8bd3d23cSAlex Hornung #include <limits.h>
18*8bd3d23cSAlex Hornung #include <devattr.h>
19*8bd3d23cSAlex Hornung 
20*8bd3d23cSAlex Hornung 
21*8bd3d23cSAlex Hornung #define LVM_FAILURE -1
22*8bd3d23cSAlex Hornung 
23*8bd3d23cSAlex Hornung 
24*8bd3d23cSAlex Hornung int
25*8bd3d23cSAlex Hornung dragonfly_check_dev(int major, const char *path)
26*8bd3d23cSAlex Hornung {
27*8bd3d23cSAlex Hornung 	struct udev *udev;
28*8bd3d23cSAlex Hornung 	struct udev_enumerate *udev_enum;
29*8bd3d23cSAlex Hornung 	struct udev_list_entry *udev_le, *udev_le_first;
30*8bd3d23cSAlex Hornung 	struct udev_monitor *udev_monitor;
31*8bd3d23cSAlex Hornung 	struct udev_device *udev_dev;
32*8bd3d23cSAlex Hornung 	const char *subsystem;
33*8bd3d23cSAlex Hornung 	const char *driver;
34*8bd3d23cSAlex Hornung 	const char *type;
35*8bd3d23cSAlex Hornung 	int ret, result;
36*8bd3d23cSAlex Hornung 
37*8bd3d23cSAlex Hornung 	result = LVM_FAILURE;
38*8bd3d23cSAlex Hornung 
39*8bd3d23cSAlex Hornung 	if (!strncmp(path, "/dev/", strlen("/dev/"))) {
40*8bd3d23cSAlex Hornung 		path += strlen("/dev/");
41*8bd3d23cSAlex Hornung 	}
42*8bd3d23cSAlex Hornung 
43*8bd3d23cSAlex Hornung 	udev = udev_new();
44*8bd3d23cSAlex Hornung 	if (udev == NULL) {
45*8bd3d23cSAlex Hornung 		fprintf(stderr, "udev_new failed! Need udevd running.\n");
46*8bd3d23cSAlex Hornung 		return LVM_FAILURE;
47*8bd3d23cSAlex Hornung 	}
48*8bd3d23cSAlex Hornung 
49*8bd3d23cSAlex Hornung 	udev_enum = udev_enumerate_new(udev);
50*8bd3d23cSAlex Hornung 	if (udev_enum == NULL) {
51*8bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_new failed!\n");
52*8bd3d23cSAlex Hornung 		goto out2;
53*8bd3d23cSAlex Hornung 	}
54*8bd3d23cSAlex Hornung 
55*8bd3d23cSAlex Hornung 	ret = udev_enumerate_add_match_expr(udev_enum, "name", __DECONST(char *, path));
56*8bd3d23cSAlex Hornung 	if (ret != 0) {
57*8bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_add_match_expr failed!\n");
58*8bd3d23cSAlex Hornung 		goto out;
59*8bd3d23cSAlex Hornung 	}
60*8bd3d23cSAlex Hornung 
61*8bd3d23cSAlex Hornung 	ret = udev_enumerate_scan_devices(udev_enum);
62*8bd3d23cSAlex Hornung 	if (ret != 0) {
63*8bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_scan_devices failed!\n");
64*8bd3d23cSAlex Hornung 		goto out;
65*8bd3d23cSAlex Hornung 	}
66*8bd3d23cSAlex Hornung 
67*8bd3d23cSAlex Hornung 	udev_le = udev_enumerate_get_list_entry(udev_enum);
68*8bd3d23cSAlex Hornung 	if (udev_le == NULL) {
69*8bd3d23cSAlex Hornung #if 0
70*8bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_get_list_entry failed for %s!\n", path);
71*8bd3d23cSAlex Hornung #endif
72*8bd3d23cSAlex Hornung 		goto out;
73*8bd3d23cSAlex Hornung 	}
74*8bd3d23cSAlex Hornung 
75*8bd3d23cSAlex Hornung 	udev_dev = udev_list_entry_get_device(udev_le);
76*8bd3d23cSAlex Hornung 	if (udev_dev == NULL) {
77*8bd3d23cSAlex Hornung 		fprintf(stderr, "udev_list_entry_get_device failed!\n");
78*8bd3d23cSAlex Hornung 		goto out;
79*8bd3d23cSAlex Hornung 	}
80*8bd3d23cSAlex Hornung 
81*8bd3d23cSAlex Hornung 	subsystem = udev_device_get_subsystem(udev_dev);
82*8bd3d23cSAlex Hornung 	driver = udev_device_get_driver(udev_dev);
83*8bd3d23cSAlex Hornung 	type = udev_device_get_property_value(udev_dev, "disk-type");
84*8bd3d23cSAlex Hornung 
85*8bd3d23cSAlex Hornung 	/* If it's neither a disk driver nor a raid driver, stop here */
86*8bd3d23cSAlex Hornung 	if ((subsystem == NULL) ||
87*8bd3d23cSAlex Hornung 	    ((strcmp(subsystem, "disk") != 0) &&
88*8bd3d23cSAlex Hornung 	    (strcmp(subsystem, "raid") != 0))) {
89*8bd3d23cSAlex Hornung 		goto outdev;
90*8bd3d23cSAlex Hornung 	}
91*8bd3d23cSAlex Hornung 
92*8bd3d23cSAlex Hornung 	/* We don't like malloc disks */
93*8bd3d23cSAlex Hornung 	if (driver && (strcmp(driver, "md") == 0)) {
94*8bd3d23cSAlex Hornung 		goto outdev;
95*8bd3d23cSAlex Hornung 	}
96*8bd3d23cSAlex Hornung 
97*8bd3d23cSAlex Hornung 	/* Some disk-type checks... */
98*8bd3d23cSAlex Hornung 	if (type && (strcmp(type, "optical") == 0)) {
99*8bd3d23cSAlex Hornung 		goto outdev;
100*8bd3d23cSAlex Hornung 	}
101*8bd3d23cSAlex Hornung 
102*8bd3d23cSAlex Hornung 	/* Some disk-type checks... */
103*8bd3d23cSAlex Hornung 	if (type && (strcmp(type, "floppy") == 0)) {
104*8bd3d23cSAlex Hornung 		goto outdev;
105*8bd3d23cSAlex Hornung 	}
106*8bd3d23cSAlex Hornung 
107*8bd3d23cSAlex Hornung 	/* Some disk-type checks... */
108*8bd3d23cSAlex Hornung 	if (type && (strcmp(type, "tape") == 0)) {
109*8bd3d23cSAlex Hornung 		goto outdev;
110*8bd3d23cSAlex Hornung 	}
111*8bd3d23cSAlex Hornung 
112*8bd3d23cSAlex Hornung 	/* Some disk-type checks... */
113*8bd3d23cSAlex Hornung 	if (type && (strcmp(type, "memory") == 0)) {
114*8bd3d23cSAlex Hornung 		goto outdev;
115*8bd3d23cSAlex Hornung 	}
116*8bd3d23cSAlex Hornung 
117*8bd3d23cSAlex Hornung 	result = 0;
118*8bd3d23cSAlex Hornung 
119*8bd3d23cSAlex Hornung outdev:
120*8bd3d23cSAlex Hornung 	udev_device_unref(udev_dev);
121*8bd3d23cSAlex Hornung out:
122*8bd3d23cSAlex Hornung 	udev_enumerate_unref(udev_enum);
123*8bd3d23cSAlex Hornung out2:
124*8bd3d23cSAlex Hornung 	udev_unref(udev);
125*8bd3d23cSAlex Hornung 	return result;
126*8bd3d23cSAlex Hornung }
127*8bd3d23cSAlex Hornung 
128*8bd3d23cSAlex Hornung /*
129*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for bpf4 (/dev/bpf4)!
130*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for log (/dev/log)!
131*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001 (/dev/serno/00000000000000000001)!
132*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0 (/dev/serno/00000000000000000001.s0)!
133*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0a (/dev/serno/00000000000000000001.s0a)!
134*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0b (/dev/serno/00000000000000000001.s0b)!
135*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/01000000000000000001 (/dev/serno/01000000000000000001)!
136*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sga (/dev/sga)!
137*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sgb (/dev/sgb)!
138*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for bpf4 (/dev/bpf4)!
139*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for log (/dev/log)!
140*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001 (/dev/serno/00000000000000000001)!
141*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0 (/dev/serno/00000000000000000001.s0)!
142*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0a (/dev/serno/00000000000000000001.s0a)!
143*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0b (/dev/serno/00000000000000000001.s0b)!
144*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/01000000000000000001 (/dev/serno/01000000000000000001)!
145*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sga (/dev/sga)!
146*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sgb (/dev/sgb)!
147*8bd3d23cSAlex Hornung */
148