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