1*8bd3d23cSAlex Hornung /* 2*8bd3d23cSAlex Hornung * DragonFly specific device routines are added to this file. 3*8bd3d23cSAlex Hornung */ 4*8bd3d23cSAlex Hornung 5*8bd3d23cSAlex Hornung #include <sys/param.h> 6*8bd3d23cSAlex Hornung #include <sys/types.h> 7*8bd3d23cSAlex Hornung 8*8bd3d23cSAlex Hornung #include <sys/sysctl.h> 9*8bd3d23cSAlex Hornung 10*8bd3d23cSAlex Hornung #include <dirent.h> 11*8bd3d23cSAlex Hornung #include <stdio.h> 12*8bd3d23cSAlex Hornung #include <stdlib.h> 13*8bd3d23cSAlex Hornung #include <string.h> 14*8bd3d23cSAlex Hornung #include <unistd.h> 15*8bd3d23cSAlex Hornung #include <ctype.h> 16*8bd3d23cSAlex Hornung #include <fcntl.h> 17*8bd3d23cSAlex Hornung #include <limits.h> 18*8bd3d23cSAlex Hornung #include <devattr.h> 19*8bd3d23cSAlex Hornung 20*8bd3d23cSAlex Hornung 21*8bd3d23cSAlex Hornung #define LVM_FAILURE -1 22*8bd3d23cSAlex Hornung 23*8bd3d23cSAlex Hornung 24*8bd3d23cSAlex Hornung int 25*8bd3d23cSAlex Hornung dragonfly_check_dev(int major, const char *path) 26*8bd3d23cSAlex Hornung { 27*8bd3d23cSAlex Hornung struct udev *udev; 28*8bd3d23cSAlex Hornung struct udev_enumerate *udev_enum; 29*8bd3d23cSAlex Hornung struct udev_list_entry *udev_le, *udev_le_first; 30*8bd3d23cSAlex Hornung struct udev_monitor *udev_monitor; 31*8bd3d23cSAlex Hornung struct udev_device *udev_dev; 32*8bd3d23cSAlex Hornung const char *subsystem; 33*8bd3d23cSAlex Hornung const char *driver; 34*8bd3d23cSAlex Hornung const char *type; 35*8bd3d23cSAlex Hornung int ret, result; 36*8bd3d23cSAlex Hornung 37*8bd3d23cSAlex Hornung result = LVM_FAILURE; 38*8bd3d23cSAlex Hornung 39*8bd3d23cSAlex Hornung if (!strncmp(path, "/dev/", strlen("/dev/"))) { 40*8bd3d23cSAlex Hornung path += strlen("/dev/"); 41*8bd3d23cSAlex Hornung } 42*8bd3d23cSAlex Hornung 43*8bd3d23cSAlex Hornung udev = udev_new(); 44*8bd3d23cSAlex Hornung if (udev == NULL) { 45*8bd3d23cSAlex Hornung fprintf(stderr, "udev_new failed! Need udevd running.\n"); 46*8bd3d23cSAlex Hornung return LVM_FAILURE; 47*8bd3d23cSAlex Hornung } 48*8bd3d23cSAlex Hornung 49*8bd3d23cSAlex Hornung udev_enum = udev_enumerate_new(udev); 50*8bd3d23cSAlex Hornung if (udev_enum == NULL) { 51*8bd3d23cSAlex Hornung fprintf(stderr, "udev_enumerate_new failed!\n"); 52*8bd3d23cSAlex Hornung goto out2; 53*8bd3d23cSAlex Hornung } 54*8bd3d23cSAlex Hornung 55*8bd3d23cSAlex Hornung ret = udev_enumerate_add_match_expr(udev_enum, "name", __DECONST(char *, path)); 56*8bd3d23cSAlex Hornung if (ret != 0) { 57*8bd3d23cSAlex Hornung fprintf(stderr, "udev_enumerate_add_match_expr failed!\n"); 58*8bd3d23cSAlex Hornung goto out; 59*8bd3d23cSAlex Hornung } 60*8bd3d23cSAlex Hornung 61*8bd3d23cSAlex Hornung ret = udev_enumerate_scan_devices(udev_enum); 62*8bd3d23cSAlex Hornung if (ret != 0) { 63*8bd3d23cSAlex Hornung fprintf(stderr, "udev_enumerate_scan_devices failed!\n"); 64*8bd3d23cSAlex Hornung goto out; 65*8bd3d23cSAlex Hornung } 66*8bd3d23cSAlex Hornung 67*8bd3d23cSAlex Hornung udev_le = udev_enumerate_get_list_entry(udev_enum); 68*8bd3d23cSAlex Hornung if (udev_le == NULL) { 69*8bd3d23cSAlex Hornung #if 0 70*8bd3d23cSAlex Hornung fprintf(stderr, "udev_enumerate_get_list_entry failed for %s!\n", path); 71*8bd3d23cSAlex Hornung #endif 72*8bd3d23cSAlex Hornung goto out; 73*8bd3d23cSAlex Hornung } 74*8bd3d23cSAlex Hornung 75*8bd3d23cSAlex Hornung udev_dev = udev_list_entry_get_device(udev_le); 76*8bd3d23cSAlex Hornung if (udev_dev == NULL) { 77*8bd3d23cSAlex Hornung fprintf(stderr, "udev_list_entry_get_device failed!\n"); 78*8bd3d23cSAlex Hornung goto out; 79*8bd3d23cSAlex Hornung } 80*8bd3d23cSAlex Hornung 81*8bd3d23cSAlex Hornung subsystem = udev_device_get_subsystem(udev_dev); 82*8bd3d23cSAlex Hornung driver = udev_device_get_driver(udev_dev); 83*8bd3d23cSAlex Hornung type = udev_device_get_property_value(udev_dev, "disk-type"); 84*8bd3d23cSAlex Hornung 85*8bd3d23cSAlex Hornung /* If it's neither a disk driver nor a raid driver, stop here */ 86*8bd3d23cSAlex Hornung if ((subsystem == NULL) || 87*8bd3d23cSAlex Hornung ((strcmp(subsystem, "disk") != 0) && 88*8bd3d23cSAlex Hornung (strcmp(subsystem, "raid") != 0))) { 89*8bd3d23cSAlex Hornung goto outdev; 90*8bd3d23cSAlex Hornung } 91*8bd3d23cSAlex Hornung 92*8bd3d23cSAlex Hornung /* We don't like malloc disks */ 93*8bd3d23cSAlex Hornung if (driver && (strcmp(driver, "md") == 0)) { 94*8bd3d23cSAlex Hornung goto outdev; 95*8bd3d23cSAlex Hornung } 96*8bd3d23cSAlex Hornung 97*8bd3d23cSAlex Hornung /* Some disk-type checks... */ 98*8bd3d23cSAlex Hornung if (type && (strcmp(type, "optical") == 0)) { 99*8bd3d23cSAlex Hornung goto outdev; 100*8bd3d23cSAlex Hornung } 101*8bd3d23cSAlex Hornung 102*8bd3d23cSAlex Hornung /* Some disk-type checks... */ 103*8bd3d23cSAlex Hornung if (type && (strcmp(type, "floppy") == 0)) { 104*8bd3d23cSAlex Hornung goto outdev; 105*8bd3d23cSAlex Hornung } 106*8bd3d23cSAlex Hornung 107*8bd3d23cSAlex Hornung /* Some disk-type checks... */ 108*8bd3d23cSAlex Hornung if (type && (strcmp(type, "tape") == 0)) { 109*8bd3d23cSAlex Hornung goto outdev; 110*8bd3d23cSAlex Hornung } 111*8bd3d23cSAlex Hornung 112*8bd3d23cSAlex Hornung /* Some disk-type checks... */ 113*8bd3d23cSAlex Hornung if (type && (strcmp(type, "memory") == 0)) { 114*8bd3d23cSAlex Hornung goto outdev; 115*8bd3d23cSAlex Hornung } 116*8bd3d23cSAlex Hornung 117*8bd3d23cSAlex Hornung result = 0; 118*8bd3d23cSAlex Hornung 119*8bd3d23cSAlex Hornung outdev: 120*8bd3d23cSAlex Hornung udev_device_unref(udev_dev); 121*8bd3d23cSAlex Hornung out: 122*8bd3d23cSAlex Hornung udev_enumerate_unref(udev_enum); 123*8bd3d23cSAlex Hornung out2: 124*8bd3d23cSAlex Hornung udev_unref(udev); 125*8bd3d23cSAlex Hornung return result; 126*8bd3d23cSAlex Hornung } 127*8bd3d23cSAlex Hornung 128*8bd3d23cSAlex Hornung /* 129*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for bpf4 (/dev/bpf4)! 130*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for log (/dev/log)! 131*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001 (/dev/serno/00000000000000000001)! 132*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0 (/dev/serno/00000000000000000001.s0)! 133*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0a (/dev/serno/00000000000000000001.s0a)! 134*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0b (/dev/serno/00000000000000000001.s0b)! 135*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/01000000000000000001 (/dev/serno/01000000000000000001)! 136*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sga (/dev/sga)! 137*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sgb (/dev/sgb)! 138*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for bpf4 (/dev/bpf4)! 139*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for log (/dev/log)! 140*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001 (/dev/serno/00000000000000000001)! 141*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0 (/dev/serno/00000000000000000001.s0)! 142*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0a (/dev/serno/00000000000000000001.s0a)! 143*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0b (/dev/serno/00000000000000000001.s0b)! 144*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/01000000000000000001 (/dev/serno/01000000000000000001)! 145*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sga (/dev/sga)! 146*8bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sgb (/dev/sgb)! 147*8bd3d23cSAlex Hornung */ 148