xref: /dflybsd-src/contrib/lvm2/dist/lib/netbsd/dev.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino /*      $NetBSD: dev.c,v 1.2 2009/10/16 21:00:41 joerg Exp $        */
286d7f5d3SJohn Marino 
386d7f5d3SJohn Marino /*
486d7f5d3SJohn Marino  * NetBSD specific device routines are added to this file.
586d7f5d3SJohn Marino  */
686d7f5d3SJohn Marino 
786d7f5d3SJohn Marino #include <sys/param.h>
886d7f5d3SJohn Marino #include <sys/types.h>
986d7f5d3SJohn Marino 
1086d7f5d3SJohn Marino #include <sys/sysctl.h>
1186d7f5d3SJohn Marino 
1286d7f5d3SJohn Marino #include <dirent.h>
1386d7f5d3SJohn Marino #include <stdio.h>
1486d7f5d3SJohn Marino #include <stdlib.h>
1586d7f5d3SJohn Marino #include <unistd.h>
1686d7f5d3SJohn Marino #include <ctype.h>
1786d7f5d3SJohn Marino #include <fcntl.h>
1886d7f5d3SJohn Marino #include <limits.h>
1986d7f5d3SJohn Marino 
2086d7f5d3SJohn Marino #include "netbsd.h"
2186d7f5d3SJohn Marino 
2286d7f5d3SJohn Marino #define LVM_FAILURE -1
2386d7f5d3SJohn Marino 
2486d7f5d3SJohn Marino /*
2586d7f5d3SJohn Marino  * Find major numbers for char/block parts of all block devices.
2686d7f5d3SJohn Marino  * In NetBSD every block device has it's char counter part.
2786d7f5d3SJohn Marino  * Return success only for device drivers with defined char/block
2886d7f5d3SJohn Marino  * major numbers.
2986d7f5d3SJohn Marino  */
3086d7f5d3SJohn Marino int
nbsd_check_dev(int major,const char * path)3186d7f5d3SJohn Marino nbsd_check_dev(int major, const char *path)
3286d7f5d3SJohn Marino {
3386d7f5d3SJohn Marino 
3486d7f5d3SJohn Marino 	size_t val_len,i;
3586d7f5d3SJohn Marino 
3686d7f5d3SJohn Marino 	struct kinfo_drivers *kd;
3786d7f5d3SJohn Marino 
3886d7f5d3SJohn Marino 	/* XXX HACK */
3986d7f5d3SJohn Marino 	if (strcmp(path,"/dev/console") == 0)
4086d7f5d3SJohn Marino 		return LVM_FAILURE;
4186d7f5d3SJohn Marino 
4286d7f5d3SJohn Marino 	/* get size kernel drivers array from kernel*/
4386d7f5d3SJohn Marino 	if (sysctlbyname("kern.drivers",NULL,&val_len,NULL,0) < 0) {
4486d7f5d3SJohn Marino 		printf("sysctlbyname failed");
4586d7f5d3SJohn Marino 		return LVM_FAILURE;
4686d7f5d3SJohn Marino 	}
4786d7f5d3SJohn Marino 
4886d7f5d3SJohn Marino 	if ((kd = malloc (val_len)) == NULL){
4986d7f5d3SJohn Marino 		printf("malloc kd info error\n");
5086d7f5d3SJohn Marino 		return LVM_FAILURE;
5186d7f5d3SJohn Marino 	}
5286d7f5d3SJohn Marino 
5386d7f5d3SJohn Marino 	/* get array from kernel */
5486d7f5d3SJohn Marino 	if (sysctlbyname("kern.drivers", kd, &val_len, NULL, 0) < 0) {
5586d7f5d3SJohn Marino 		printf("sysctlbyname failed kd");
5686d7f5d3SJohn Marino 		return LVM_FAILURE;
5786d7f5d3SJohn Marino 	}
5886d7f5d3SJohn Marino 
5986d7f5d3SJohn Marino 	for (i = 0, val_len /= sizeof(*kd); i < val_len; i++)
6086d7f5d3SJohn Marino 		/* We select only devices with correct char/block major number. */
6186d7f5d3SJohn Marino 		if (kd[i].d_cmajor != -1 && kd[i].d_bmajor != -1) {
6286d7f5d3SJohn Marino 
6386d7f5d3SJohn Marino 			if (kd[i].d_cmajor == major)
6486d7f5d3SJohn Marino 				return 0;
6586d7f5d3SJohn Marino 		}
6686d7f5d3SJohn Marino 
6786d7f5d3SJohn Marino 	return LVM_FAILURE;
6886d7f5d3SJohn Marino }
69