lvm - adjust visibility for devname
[dragonfly.git] / contrib / lvm2 / dist / lib / dragonfly / dev.c
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 */