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