lvm - use libdevattr for device cache checks
[dragonfly.git] / contrib / lvm2 / dist / lib / dragonfly / dev.c
1 /*
2  * DragonFly specific device routines are added to this file.
3  */
4
5 #include <sys/param.h>
6 #include <sys/types.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
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         const char *subsystem;
33         const char *driver;
34         const char *type;
35         int ret, result;
36
37         result = LVM_FAILURE;
38
39         if (!strncmp(path, "/dev/", strlen("/dev/"))) {
40                 path += strlen("/dev/");
41         }
42
43         udev = udev_new();
44         if (udev == NULL) {
45                 fprintf(stderr, "udev_new failed! Need udevd running.\n");
46                 return LVM_FAILURE;
47         }
48
49         udev_enum = udev_enumerate_new(udev);
50         if (udev_enum == NULL) {
51                 fprintf(stderr, "udev_enumerate_new failed!\n");
52                 goto out2;
53         }
54
55         ret = udev_enumerate_add_match_expr(udev_enum, "name", __DECONST(char *, path));
56         if (ret != 0) {
57                 fprintf(stderr, "udev_enumerate_add_match_expr failed!\n");
58                 goto out;
59         }
60
61         ret = udev_enumerate_scan_devices(udev_enum);
62         if (ret != 0) {
63                 fprintf(stderr, "udev_enumerate_scan_devices failed!\n");
64                 goto out;
65         }
66
67         udev_le = udev_enumerate_get_list_entry(udev_enum);
68         if (udev_le == NULL) {
69 #if 0
70                 fprintf(stderr, "udev_enumerate_get_list_entry failed for %s!\n", path);
71 #endif
72                 goto out;
73         }
74
75         udev_dev = udev_list_entry_get_device(udev_le);
76         if (udev_dev == NULL) {
77                 fprintf(stderr, "udev_list_entry_get_device failed!\n");
78                 goto out;
79         }
80
81         subsystem = udev_device_get_subsystem(udev_dev);
82         driver = udev_device_get_driver(udev_dev);
83         type = udev_device_get_property_value(udev_dev, "disk-type");
84
85         /* If it's neither a disk driver nor a raid driver, stop here */
86         if ((subsystem == NULL) ||
87             ((strcmp(subsystem, "disk") != 0) &&
88             (strcmp(subsystem, "raid") != 0))) {
89                 goto outdev;
90         }
91
92         /* We don't like malloc disks */
93         if (driver && (strcmp(driver, "md") == 0)) {
94                 goto outdev;
95         }
96
97         /* Some disk-type checks... */
98         if (type && (strcmp(type, "optical") == 0)) {
99                 goto outdev;
100         }
101
102         /* Some disk-type checks... */
103         if (type && (strcmp(type, "floppy") == 0)) {
104                 goto outdev;
105         }
106
107         /* Some disk-type checks... */
108         if (type && (strcmp(type, "tape") == 0)) {
109                 goto outdev;
110         }
111
112         /* Some disk-type checks... */
113         if (type && (strcmp(type, "memory") == 0)) {
114                 goto outdev;
115         }
116
117         result = 0;
118
119 outdev:
120         udev_device_unref(udev_dev);
121 out:
122         udev_enumerate_unref(udev_enum);
123 out2:
124         udev_unref(udev);
125         return result;
126 }
127
128 /*
129 udev_enumerate_get_list_entry failed for bpf4 (/dev/bpf4)!
130 udev_enumerate_get_list_entry failed for log (/dev/log)!
131 udev_enumerate_get_list_entry failed for serno/00000000000000000001 (/dev/serno/00000000000000000001)!
132 udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0 (/dev/serno/00000000000000000001.s0)!
133 udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0a (/dev/serno/00000000000000000001.s0a)!
134 udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0b (/dev/serno/00000000000000000001.s0b)!
135 udev_enumerate_get_list_entry failed for serno/01000000000000000001 (/dev/serno/01000000000000000001)!
136 udev_enumerate_get_list_entry failed for sga (/dev/sga)!
137 udev_enumerate_get_list_entry failed for sgb (/dev/sgb)!
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 */