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