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