xref: /dragonfly/contrib/lvm2/dist/lib/netbsd/dev.c (revision 86d7f5d3)
1*86d7f5d3SJohn Marino /*      $NetBSD: dev.c,v 1.2 2009/10/16 21:00:41 joerg Exp $        */
2*86d7f5d3SJohn Marino 
3*86d7f5d3SJohn Marino /*
4*86d7f5d3SJohn Marino  * NetBSD specific device routines are added to this file.
5*86d7f5d3SJohn Marino  */
6*86d7f5d3SJohn Marino 
7*86d7f5d3SJohn Marino #include <sys/param.h>
8*86d7f5d3SJohn Marino #include <sys/types.h>
9*86d7f5d3SJohn Marino 
10*86d7f5d3SJohn Marino #include <sys/sysctl.h>
11*86d7f5d3SJohn Marino 
12*86d7f5d3SJohn Marino #include <dirent.h>
13*86d7f5d3SJohn Marino #include <stdio.h>
14*86d7f5d3SJohn Marino #include <stdlib.h>
15*86d7f5d3SJohn Marino #include <unistd.h>
16*86d7f5d3SJohn Marino #include <ctype.h>
17*86d7f5d3SJohn Marino #include <fcntl.h>
18*86d7f5d3SJohn Marino #include <limits.h>
19*86d7f5d3SJohn Marino 
20*86d7f5d3SJohn Marino #include "netbsd.h"
21*86d7f5d3SJohn Marino 
22*86d7f5d3SJohn Marino #define LVM_FAILURE -1
23*86d7f5d3SJohn Marino 
24*86d7f5d3SJohn Marino /*
25*86d7f5d3SJohn Marino  * Find major numbers for char/block parts of all block devices.
26*86d7f5d3SJohn Marino  * In NetBSD every block device has it's char counter part.
27*86d7f5d3SJohn Marino  * Return success only for device drivers with defined char/block
28*86d7f5d3SJohn Marino  * major numbers.
29*86d7f5d3SJohn Marino  */
30*86d7f5d3SJohn Marino int
nbsd_check_dev(int major,const char * path)31*86d7f5d3SJohn Marino nbsd_check_dev(int major, const char *path)
32*86d7f5d3SJohn Marino {
33*86d7f5d3SJohn Marino 
34*86d7f5d3SJohn Marino 	size_t val_len,i;
35*86d7f5d3SJohn Marino 
36*86d7f5d3SJohn Marino 	struct kinfo_drivers *kd;
37*86d7f5d3SJohn Marino 
38*86d7f5d3SJohn Marino 	/* XXX HACK */
39*86d7f5d3SJohn Marino 	if (strcmp(path,"/dev/console") == 0)
40*86d7f5d3SJohn Marino 		return LVM_FAILURE;
41*86d7f5d3SJohn Marino 
42*86d7f5d3SJohn Marino 	/* get size kernel drivers array from kernel*/
43*86d7f5d3SJohn Marino 	if (sysctlbyname("kern.drivers",NULL,&val_len,NULL,0) < 0) {
44*86d7f5d3SJohn Marino 		printf("sysctlbyname failed");
45*86d7f5d3SJohn Marino 		return LVM_FAILURE;
46*86d7f5d3SJohn Marino 	}
47*86d7f5d3SJohn Marino 
48*86d7f5d3SJohn Marino 	if ((kd = malloc (val_len)) == NULL){
49*86d7f5d3SJohn Marino 		printf("malloc kd info error\n");
50*86d7f5d3SJohn Marino 		return LVM_FAILURE;
51*86d7f5d3SJohn Marino 	}
52*86d7f5d3SJohn Marino 
53*86d7f5d3SJohn Marino 	/* get array from kernel */
54*86d7f5d3SJohn Marino 	if (sysctlbyname("kern.drivers", kd, &val_len, NULL, 0) < 0) {
55*86d7f5d3SJohn Marino 		printf("sysctlbyname failed kd");
56*86d7f5d3SJohn Marino 		return LVM_FAILURE;
57*86d7f5d3SJohn Marino 	}
58*86d7f5d3SJohn Marino 
59*86d7f5d3SJohn Marino 	for (i = 0, val_len /= sizeof(*kd); i < val_len; i++)
60*86d7f5d3SJohn Marino 		/* We select only devices with correct char/block major number. */
61*86d7f5d3SJohn Marino 		if (kd[i].d_cmajor != -1 && kd[i].d_bmajor != -1) {
62*86d7f5d3SJohn Marino 
63*86d7f5d3SJohn Marino 			if (kd[i].d_cmajor == major)
64*86d7f5d3SJohn Marino 				return 0;
65*86d7f5d3SJohn Marino 		}
66*86d7f5d3SJohn Marino 
67*86d7f5d3SJohn Marino 	return LVM_FAILURE;
68*86d7f5d3SJohn Marino }
69