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 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