divert_init.c revision 03f18285cd2c2c065c6f5a4046e1eee0b45e4e0e
1/* $Id divert_init.c,v 1.5.6.2 2001/01/24 22:18:17 kai Exp $ 2 * 3 * Module init for DSS1 diversion services for i4l. 4 * 5 * Copyright 1999 by Werner Cornelius (werner@isdn4linux.de) 6 * 7 * This software may be used and distributed according to the terms 8 * of the GNU General Public License, incorporated herein by reference. 9 * 10 */ 11 12#include <linux/module.h> 13#include <linux/init.h> 14#include <linux/kernel.h> 15 16#include "isdn_divert.h" 17 18MODULE_DESCRIPTION("ISDN4Linux: Call diversion support"); 19MODULE_AUTHOR("Werner Cornelius"); 20MODULE_LICENSE("GPL"); 21 22/****************************************/ 23/* structure containing interface to hl */ 24/****************************************/ 25isdn_divert_if divert_if = { 26 DIVERT_IF_MAGIC, /* magic value */ 27 DIVERT_CMD_REG, /* register cmd */ 28 ll_callback, /* callback routine from ll */ 29 NULL, /* command still not specified */ 30 NULL, /* drv_to_name */ 31 NULL, /* name_to_drv */ 32}; 33 34/*************************/ 35/* Module interface code */ 36/* no cmd line parms */ 37/*************************/ 38static int __init divert_init(void) 39{ 40 int i; 41 42 if (divert_dev_init()) { 43 printk(KERN_WARNING "dss1_divert: cannot install device, not loaded\n"); 44 return (-EIO); 45 } 46 if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { 47 divert_dev_deinit(); 48 printk(KERN_WARNING "dss1_divert: error %d registering module, not loaded\n", i); 49 return (-EIO); 50 } 51 printk(KERN_INFO "dss1_divert module successfully installed\n"); 52 return (0); 53} 54 55/**********************/ 56/* Module deinit code */ 57/**********************/ 58static void __exit divert_exit(void) 59{ 60 unsigned long flags; 61 int i; 62 63 spin_lock_irqsave(&divert_lock, flags); 64 divert_if.cmd = DIVERT_CMD_REL; /* release */ 65 if ((i = DIVERT_REG_NAME(&divert_if)) != DIVERT_NO_ERR) { 66 printk(KERN_WARNING "dss1_divert: error %d releasing module\n", i); 67 spin_unlock_irqrestore(&divert_lock, flags); 68 return; 69 } 70 if (divert_dev_deinit()) { 71 printk(KERN_WARNING "dss1_divert: device busy, remove cancelled\n"); 72 spin_unlock_irqrestore(&divert_lock, flags); 73 return; 74 } 75 spin_unlock_irqrestore(&divert_lock, flags); 76 deleterule(-1); /* delete all rules and free mem */ 77 deleteprocs(); 78 printk(KERN_INFO "dss1_divert module successfully removed \n"); 79} 80 81module_init(divert_init); 82module_exit(divert_exit); 83