| /* $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); |