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 */ 148