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