xref: /dflybsd-src/contrib/lvm2/dist/lib/dragonfly/dev.c (revision 03a6e5dbbde92f66033ecc870b16d286b432c52a)
18bd3d23cSAlex Hornung /*
28bd3d23cSAlex Hornung  * DragonFly specific device routines are added to this file.
38bd3d23cSAlex Hornung  */
48bd3d23cSAlex Hornung #include <sys/param.h>
58bd3d23cSAlex Hornung #include <sys/types.h>
6*b060a5b0SAlex Hornung #include <sys/stat.h>
78bd3d23cSAlex Hornung 
88bd3d23cSAlex Hornung #include <sys/sysctl.h>
98bd3d23cSAlex Hornung 
108bd3d23cSAlex Hornung #include <dirent.h>
118bd3d23cSAlex Hornung #include <stdio.h>
128bd3d23cSAlex Hornung #include <stdlib.h>
138bd3d23cSAlex Hornung #include <string.h>
148bd3d23cSAlex Hornung #include <unistd.h>
158bd3d23cSAlex Hornung #include <ctype.h>
168bd3d23cSAlex Hornung #include <fcntl.h>
178bd3d23cSAlex Hornung #include <limits.h>
188bd3d23cSAlex Hornung #include <devattr.h>
198bd3d23cSAlex Hornung 
208bd3d23cSAlex Hornung 
218bd3d23cSAlex Hornung #define LVM_FAILURE -1
228bd3d23cSAlex Hornung 
238bd3d23cSAlex Hornung 
248bd3d23cSAlex Hornung int
dragonfly_check_dev(int major,const char * path)258bd3d23cSAlex Hornung dragonfly_check_dev(int major, const char *path)
268bd3d23cSAlex Hornung {
278bd3d23cSAlex Hornung 	struct udev *udev;
288bd3d23cSAlex Hornung 	struct udev_enumerate *udev_enum;
298bd3d23cSAlex Hornung 	struct udev_list_entry *udev_le, *udev_le_first;
308bd3d23cSAlex Hornung 	struct udev_monitor *udev_monitor;
318bd3d23cSAlex Hornung 	struct udev_device *udev_dev;
32*b060a5b0SAlex Hornung 	struct stat sb;
338bd3d23cSAlex Hornung 	const char *subsystem;
348bd3d23cSAlex Hornung 	const char *driver;
358bd3d23cSAlex Hornung 	const char *type;
368bd3d23cSAlex Hornung 	int ret, result;
378bd3d23cSAlex Hornung 
388bd3d23cSAlex Hornung 	result = LVM_FAILURE;
398bd3d23cSAlex Hornung 
40*b060a5b0SAlex Hornung 	/*
41*b060a5b0SAlex Hornung 	 * We do the stat & devname dance to get around paths that are
42*b060a5b0SAlex Hornung 	 * symlinks. udev will only find devices by their real name or
43*b060a5b0SAlex Hornung 	 * devfs alias.
44*b060a5b0SAlex Hornung 	 */
45*b060a5b0SAlex Hornung 	stat(path, &sb);
46*b060a5b0SAlex Hornung 	path = devname(sb.st_rdev, S_IFCHR);
47*b060a5b0SAlex Hornung 
488bd3d23cSAlex Hornung 	if (!strncmp(path, "/dev/", strlen("/dev/"))) {
498bd3d23cSAlex Hornung 		path += strlen("/dev/");
508bd3d23cSAlex Hornung 	}
518bd3d23cSAlex Hornung 
528bd3d23cSAlex Hornung 	udev = udev_new();
538bd3d23cSAlex Hornung 	if (udev == NULL) {
548bd3d23cSAlex Hornung 		fprintf(stderr, "udev_new failed! Need udevd running.\n");
558bd3d23cSAlex Hornung 		return LVM_FAILURE;
568bd3d23cSAlex Hornung 	}
578bd3d23cSAlex Hornung 
588bd3d23cSAlex Hornung 	udev_enum = udev_enumerate_new(udev);
598bd3d23cSAlex Hornung 	if (udev_enum == NULL) {
608bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_new failed!\n");
618bd3d23cSAlex Hornung 		goto out2;
628bd3d23cSAlex Hornung 	}
638bd3d23cSAlex Hornung 
648bd3d23cSAlex Hornung 	ret = udev_enumerate_add_match_expr(udev_enum, "name", __DECONST(char *, path));
658bd3d23cSAlex Hornung 	if (ret != 0) {
668bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_add_match_expr failed!\n");
678bd3d23cSAlex Hornung 		goto out;
688bd3d23cSAlex Hornung 	}
698bd3d23cSAlex Hornung 
708bd3d23cSAlex Hornung 	ret = udev_enumerate_scan_devices(udev_enum);
718bd3d23cSAlex Hornung 	if (ret != 0) {
728bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_scan_devices failed!\n");
738bd3d23cSAlex Hornung 		goto out;
748bd3d23cSAlex Hornung 	}
758bd3d23cSAlex Hornung 
768bd3d23cSAlex Hornung 	udev_le = udev_enumerate_get_list_entry(udev_enum);
778bd3d23cSAlex Hornung 	if (udev_le == NULL) {
788bd3d23cSAlex Hornung #if 0
798bd3d23cSAlex Hornung 		fprintf(stderr, "udev_enumerate_get_list_entry failed for %s!\n", path);
808bd3d23cSAlex Hornung #endif
818bd3d23cSAlex Hornung 		goto out;
828bd3d23cSAlex Hornung 	}
838bd3d23cSAlex Hornung 
848bd3d23cSAlex Hornung 	udev_dev = udev_list_entry_get_device(udev_le);
858bd3d23cSAlex Hornung 	if (udev_dev == NULL) {
868bd3d23cSAlex Hornung 		fprintf(stderr, "udev_list_entry_get_device failed!\n");
878bd3d23cSAlex Hornung 		goto out;
888bd3d23cSAlex Hornung 	}
898bd3d23cSAlex Hornung 
908bd3d23cSAlex Hornung 	subsystem = udev_device_get_subsystem(udev_dev);
918bd3d23cSAlex Hornung 	driver = udev_device_get_driver(udev_dev);
928bd3d23cSAlex Hornung 	type = udev_device_get_property_value(udev_dev, "disk-type");
938bd3d23cSAlex Hornung 
948bd3d23cSAlex Hornung 	/* If it's neither a disk driver nor a raid driver, stop here */
958bd3d23cSAlex Hornung 	if ((subsystem == NULL) ||
968bd3d23cSAlex Hornung 	    ((strcmp(subsystem, "disk") != 0) &&
978bd3d23cSAlex Hornung 	    (strcmp(subsystem, "raid") != 0))) {
988bd3d23cSAlex Hornung 		goto outdev;
998bd3d23cSAlex Hornung 	}
1008bd3d23cSAlex Hornung 
1018bd3d23cSAlex Hornung 	/* We don't like malloc disks */
1028bd3d23cSAlex Hornung 	if (driver && (strcmp(driver, "md") == 0)) {
1038bd3d23cSAlex Hornung 		goto outdev;
1048bd3d23cSAlex Hornung 	}
1058bd3d23cSAlex Hornung 
1068bd3d23cSAlex Hornung 	/* Some disk-type checks... */
1078bd3d23cSAlex Hornung 	if (type && (strcmp(type, "optical") == 0)) {
1088bd3d23cSAlex Hornung 		goto outdev;
1098bd3d23cSAlex Hornung 	}
1108bd3d23cSAlex Hornung 
1118bd3d23cSAlex Hornung 	/* Some disk-type checks... */
1128bd3d23cSAlex Hornung 	if (type && (strcmp(type, "floppy") == 0)) {
1138bd3d23cSAlex Hornung 		goto outdev;
1148bd3d23cSAlex Hornung 	}
1158bd3d23cSAlex Hornung 
1168bd3d23cSAlex Hornung 	/* Some disk-type checks... */
1178bd3d23cSAlex Hornung 	if (type && (strcmp(type, "tape") == 0)) {
1188bd3d23cSAlex Hornung 		goto outdev;
1198bd3d23cSAlex Hornung 	}
1208bd3d23cSAlex Hornung 
1218bd3d23cSAlex Hornung 	/* Some disk-type checks... */
1228bd3d23cSAlex Hornung 	if (type && (strcmp(type, "memory") == 0)) {
1238bd3d23cSAlex Hornung 		goto outdev;
1248bd3d23cSAlex Hornung 	}
1258bd3d23cSAlex Hornung 
1268bd3d23cSAlex Hornung 	result = 0;
1278bd3d23cSAlex Hornung 
1288bd3d23cSAlex Hornung outdev:
1298bd3d23cSAlex Hornung 	udev_device_unref(udev_dev);
1308bd3d23cSAlex Hornung out:
1318bd3d23cSAlex Hornung 	udev_enumerate_unref(udev_enum);
1328bd3d23cSAlex Hornung out2:
1338bd3d23cSAlex Hornung 	udev_unref(udev);
1348bd3d23cSAlex Hornung 	return result;
1358bd3d23cSAlex Hornung }
1368bd3d23cSAlex Hornung 
1378bd3d23cSAlex Hornung /*
1388bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for bpf4 (/dev/bpf4)!
1398bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for log (/dev/log)!
1408bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001 (/dev/serno/00000000000000000001)!
1418bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0 (/dev/serno/00000000000000000001.s0)!
1428bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0a (/dev/serno/00000000000000000001.s0a)!
1438bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0b (/dev/serno/00000000000000000001.s0b)!
1448bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/01000000000000000001 (/dev/serno/01000000000000000001)!
1458bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sga (/dev/sga)!
1468bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sgb (/dev/sgb)!
1478bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for bpf4 (/dev/bpf4)!
1488bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for log (/dev/log)!
1498bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001 (/dev/serno/00000000000000000001)!
1508bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0 (/dev/serno/00000000000000000001.s0)!
1518bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0a (/dev/serno/00000000000000000001.s0a)!
1528bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/00000000000000000001.s0b (/dev/serno/00000000000000000001.s0b)!
1538bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for serno/01000000000000000001 (/dev/serno/01000000000000000001)!
1548bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sga (/dev/sga)!
1558bd3d23cSAlex Hornung udev_enumerate_get_list_entry failed for sgb (/dev/sgb)!
1568bd3d23cSAlex Hornung */
157