summaryrefslogtreecommitdiff
path: root/setup/FreeBSD/oss/build/bsdvirtual.inc
diff options
context:
space:
mode:
Diffstat (limited to 'setup/FreeBSD/oss/build/bsdvirtual.inc')
-rw-r--r--setup/FreeBSD/oss/build/bsdvirtual.inc83
1 files changed, 83 insertions, 0 deletions
diff --git a/setup/FreeBSD/oss/build/bsdvirtual.inc b/setup/FreeBSD/oss/build/bsdvirtual.inc
new file mode 100644
index 0000000..cb5190e
--- /dev/null
+++ b/setup/FreeBSD/oss/build/bsdvirtual.inc
@@ -0,0 +1,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);