blob: cb5190ebe5f766d824fc3b35d6e8b3f7a83b30a9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/*
* Purpose: Wrapper functions for virtual drivers under FreeBSD
*/
/*
* Copyright (C) 4Front Technologies 2005-2007. Released under BSD license.
*/
static int ndevs = 0;
oss_device_t *device_list[16];
static int
module_attach (void)
{
oss_device_t *osdev;
if ((osdev =
osdev_create (NULL, DRIVER_TYPE, ndevs, DRIVER_NICK, NULL)) == NULL)
{
return ENOMEM;
}
if (!DRIVER_ATTACH (osdev))
return EIO;
device_list[ndevs++] = osdev;
return 0;
}
static int
module_detach (void)
{
oss_device_t *osdev;
int i;
for (i = 0; i < ndevs; i++)
{
osdev = device_list[i];
if (osdev->dip != NULL && device_get_state(osdev->dip) == DS_BUSY)
device_unbusy(osdev->dip);
if (!DRIVER_DETACH (osdev))
{
printf (DRIVER_NICK ": Unloading busy device\n");
return EBUSY;
}
osdev_delete (osdev);
}
return 0;
}
/*
* Load handler that deals with the loading and unloading of a KLD.
*/
static int
ossmodule_loader (struct module *m, int what, void *arg)
{
int err = 0;
switch (what)
{
case MOD_LOAD: /* kldload */
return module_attach ();
break;
case MOD_UNLOAD:
return module_detach ();
break;
default:
err = EINVAL;
break;
}
return (err);
}
/* Declare this module to the rest of the kernel */
static moduledata_t ossmodule_mod = {
"ossmodule",
ossmodule_loader,
NULL
};
DECLARE_MODULE (ossmodule, ossmodule_mod, SI_SUB_KLD, SI_ORDER_ANY);
MODULE_VERSION (ossmodule, 4);
|