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