83 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
	
		
			2.3 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/* $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);
							 | 
						||
| 
								 | 
							
								
							 |