| /* $Id divert_init.c,v 1.5.6.2 2001/01/24 22:18:17 kai Exp $ | |
| * | |
| * Module init for DSS1 diversion services for i4l. | |
| * | |
| * Copyright 1999 by Werner Cornelius (werner@isdn4linux.de) | |
| * | |
| * This software may be used and distributed according to the terms | |
| * of the GNU General Public License, incorporated herein by reference. | |
| * | |
| */ | |
| #include <linux/module.h> | |
| #include <linux/init.h> | |
| #include <linux/kernel.h> | |
| #include "isdn_divert.h" | |
| MODULE_DESCRIPTION("ISDN4Linux: Call diversion support"); | |
| MODULE_AUTHOR("Werner Cornelius"); | |
| MODULE_LICENSE("GPL"); | |
| /****************************************/ | |
| /* structure containing interface to hl */ | |
| /****************************************/ | |
| isdn_divert_if divert_if = { | |
| DIVERT_IF_MAGIC, /* magic value */ | |
| DIVERT_CMD_REG, /* register cmd */ | |
| ll_callback, /* callback routine from ll */ | |
| NULL, /* command still not specified */ | |
| NULL, /* drv_to_name */ | |
| NULL, /* name_to_drv */ | |
| }; | |
| /*************************/ | |
| /* Module interface code */ | |
| /* no cmd line parms */ | |
| /*************************/ | |
| static int __init divert_init(void) | |
| { | |
| int i; | |
| if (divert_dev_init()) { | |
| printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n"); | |
| return (-EIO); | |
| } | |
| if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { | |
| divert_dev_deinit(); | |
| printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n", i); | |
| return (-EIO); | |
| } | |
| printk(KERN_INFO "dss1_divert module successfully installed\n"); | |
| return (0); | |
| } | |
| /**********************/ | |
| /* Module deinit code */ | |
| /**********************/ | |
| static void __exit divert_exit(void) | |
| { | |
| unsigned long flags; | |
| int i; | |
| spin_lock_irqsave(&divert_lock, flags); | |
| divert_if.cmd = DIVERT_CMD_REL; /* release */ | |
| if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { | |
| printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i); | |
| spin_unlock_irqrestore(&divert_lock, flags); | |
| return; | |
| } | |
| if (divert_dev_deinit()) { | |
| printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n"); | |
| spin_unlock_irqrestore(&divert_lock, flags); | |
| return; | |
| } | |
| spin_unlock_irqrestore(&divert_lock, flags); | |
| deleterule(-1); /* delete all rules and free mem */ | |
| deleteprocs(); | |
| printk(KERN_INFO "dss1_divert module successfully removed \n"); | |
| } | |
| module_init(divert_init); | |
| module_exit(divert_exit); |