⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ul_mod.c

📁 SIP Express Router, Linux下的SIP代理服务器,小巧实用,开发测试VoIP设备和应用的必备.
💻 C
字号:
/* * $Id: ul_mod.c,v 1.42.2.1 2005/03/29 11:54:35 janakj Exp $ * * Usrloc module interface * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of ser, a free SIP server. * * ser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * For a license to use the ser software under conditions * other than those described here, or to purchase support for this * software, please contact iptel.org by e-mail at the following addresses: *    info@iptel.org * * ser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * * History: * --------- * 2003-01-27 timer activity printing #ifdef-ed to EXTRA_DEBUG (jiri) * 2003-03-11 New module interface (janakj) * 2003-03-12 added replication and state columns (nils) * 2003-03-16 flags export parameter added (janakj) * 2003-04-05: default_uri #define used (jiri) * 2003-04-21 failed fifo init stops init process (jiri) * 2004-03-17 generic callbacks added (bogdan) * 2004-06-07 updated to the new DB api (andrei) */#include <stdio.h>#include "ul_mod.h"#include "../../sr_module.h"#include "../../dprint.h"#include "../../timer.h"     /* register_timer */#include "../../globals.h"   /* is_main */#include "dlist.h"           /* register_udomain */#include "udomain.h"         /* {insert,delete,get,release}_urecord */#include "urecord.h"         /* {insert,delete,get}_ucontact */#include "ucontact.h"        /* update_ucontact */#include "ul_fifo.h"#include "ul_unixsock.h"#include "ul_callback.h"#include "notify.h"#include "usrloc.h"MODULE_VERSION#define USER_COL       "username"#define DOMAIN_COL     "domain"#define CONTACT_COL    "contact"#define EXPIRES_COL    "expires"#define Q_COL          "q"#define CALLID_COL     "callid"#define CSEQ_COL       "cseq"#define METHOD_COL     "method"#define STATE_COL      "state"#define FLAGS_COL      "flags"#define USER_AGENT_COL "user_agent"#define RECEIVED_COL   "received"static int mod_init(void);                          /* Module initialization function */static void destroy(void);                          /* Module destroy function */static void timer(unsigned int ticks, void* param); /* Timer handler */static int child_init(int rank);                    /* Per-child init function */extern int bind_usrloc(usrloc_api_t* api);/* * Module parameters and their default values */str user_col        = {USER_COL, sizeof(USER_COL) - 1};             /* Name of column containing usernames */str domain_col      = {DOMAIN_COL, sizeof(DOMAIN_COL) - 1};         /* Name of column containing domains */str contact_col     = {CONTACT_COL, sizeof(CONTACT_COL) - 1};       /* Name of column containing contact addresses */str expires_col     = {EXPIRES_COL, sizeof(EXPIRES_COL) - 1};       /* Name of column containing expires values */str q_col           = {Q_COL, sizeof(Q_COL) - 1};                   /* Name of column containing q values */str callid_col      = {CALLID_COL, sizeof(CALLID_COL) - 1};         /* Name of column containing callid string */str cseq_col        = {CSEQ_COL, sizeof(CSEQ_COL) - 1};             /* Name of column containing cseq values */str method_col      = {METHOD_COL, sizeof(METHOD_COL) - 1};         /* Name of column containing supported method */str state_col       = {STATE_COL, sizeof(STATE_COL) - 1};           /* Name of column containing contact state */str flags_col       = {FLAGS_COL, sizeof(FLAGS_COL) - 1};           /* Name of column containing flags */str user_agent_col  = {USER_AGENT_COL, sizeof(USER_AGENT_COL) - 1}; /* Name of column containing user agent string */str received_col    = {RECEIVED_COL, sizeof(RECEIVED_COL) - 1};     /* Name of column containing transport info of REGISTER */str db_url          = {DEFAULT_DB_URL, sizeof(DEFAULT_DB_URL) - 1}; /* Database URL */int timer_interval  = 60;             /* Timer interval in seconds */int db_mode         = 0;              /* Database sync scheme: 0-no db, 1-write through, 2-write back */int use_domain      = 0;              /* Whether usrloc should use domain part of aor */int desc_time_order = 0;              /* By default do not enable timestamp ordering */                  db_con_t* ul_dbh; /* Database connection handle */db_func_t ul_dbf;/* * Exported functions */static cmd_export_t cmds[] = {	{"ul_register_udomain",   (cmd_function)register_udomain,   1, 0, 0},	{"ul_insert_urecord",     (cmd_function)insert_urecord,     1, 0, 0},	{"ul_delete_urecord",     (cmd_function)delete_urecord,     1, 0, 0},	{"ul_get_urecord",        (cmd_function)get_urecord,        1, 0, 0},	{"ul_lock_udomain",       (cmd_function)lock_udomain,       1, 0, 0},	{"ul_unlock_udomain",     (cmd_function)unlock_udomain,     1, 0, 0},	{"ul_release_urecord",    (cmd_function)release_urecord,    1, 0, 0},	{"ul_insert_ucontact",    (cmd_function)insert_ucontact,    1, 0, 0},	{"ul_delete_ucontact",    (cmd_function)delete_ucontact,    1, 0, 0},	{"ul_get_ucontact",       (cmd_function)get_ucontact,       1, 0, 0},	{"ul_get_all_ucontacts",  (cmd_function)get_all_ucontacts,  1, 0, 0},	{"ul_update_ucontact",    (cmd_function)update_ucontact,    1, 0, 0},	{"ul_register_watcher",   (cmd_function)register_watcher,   1, 0, 0},	{"ul_unregister_watcher", (cmd_function)unregister_watcher, 1, 0, 0},	{"ul_bind_usrloc",        (cmd_function)bind_usrloc,        1, 0, 0},	{"ul_register_ulcb",      (cmd_function)register_ulcb,      1, 0, 0},	{0, 0, 0, 0, 0}};/*  * Exported parameters  */static param_export_t params[] = {	{"user_column",       STR_PARAM, &user_col.s     },	{"domain_column",     STR_PARAM, &domain_col.s   },	{"contact_column",    STR_PARAM, &contact_col.s  },	{"expires_column",    STR_PARAM, &expires_col.s  },	{"q_column",          STR_PARAM, &q_col.s        },	{"callid_column",     STR_PARAM, &callid_col.s   },	{"cseq_column",       STR_PARAM, &cseq_col.s     },	{"method_column",     STR_PARAM, &method_col.s   },	{"flags_column",      STR_PARAM, &flags_col.s    },	{"db_url",            STR_PARAM, &db_url.s       },	{"timer_interval",    INT_PARAM, &timer_interval },	{"db_mode",           INT_PARAM, &db_mode        },	{"use_domain",        INT_PARAM, &use_domain     },	{"desc_time_order",   INT_PARAM, &desc_time_order},	{"user_agent_column", STR_PARAM, &user_agent_col },	{"received_column",   STR_PARAM, &received_col   },	{0, 0, 0}};struct module_exports exports = {	"usrloc",	cmds,       /* Exported functions */	params,     /* Export parameters */	mod_init,   /* Module initialization function */	0,          /* Response function */	destroy,    /* Destroy function */	0,          /* OnCancel function */	child_init  /* Child initialization function */};/* * Module initialization function */static int mod_init(void){	DBG("usrloc - initializing\n");	     /* Compute the lengths of string parameters */	user_col.len = strlen(user_col.s);	domain_col.len = strlen(domain_col.s);	contact_col.len = strlen(contact_col.s);	expires_col.len = strlen(expires_col.s);	q_col.len = strlen(q_col.s);	callid_col.len = strlen(callid_col.s);	cseq_col.len = strlen(cseq_col.s);	method_col.len = strlen(method_col.s);	flags_col.len = strlen(flags_col.s);	user_agent_col.len = strlen(user_agent_col.s);	received_col.len = strlen(received_col.s);	db_url.len = strlen(db_url.s);	     /* Register cache timer */	register_timer(timer, 0, timer_interval);	     /* Initialize fifo interface */	if (init_ul_fifo() < 0) {		LOG(L_ERR, "ERROR: usrloc/fifo initialization failed\n");		return -1;	}	if (init_ul_unixsock() < 0) {		LOG(L_ERR, "ERROR: usrloc/unixsock initialization failed\n");		return -1;	}	/* init the callbacks list */	if ( init_ulcb_list() < 0) {		LOG(L_ERR, "ERROR: usrloc/callbacks initialization failed\n");		return -1;	}	/* Shall we use database ? */	if (db_mode != NO_DB) { /* Yes */		if (bind_dbmod(db_url.s, &ul_dbf) < 0) { /* Find database module */			LOG(L_ERR, "ERROR: mod_init(): Can't bind database module\n");			return -1;		}		if (!DB_CAPABILITY(ul_dbf, DB_CAP_ALL)) {			LOG(L_ERR, "usrloc:mod_init: Database module does not implement"						" all functions needed by the module\n");			return -1;		}	}	return 0;}static int child_init(int _rank){ 	     /* Shall we use database ? */	if (db_mode != NO_DB) { /* Yes */		ul_dbh = ul_dbf.init(db_url.s); /* Get a new database connection */		if (!ul_dbh) {			LOG(L_ERR, "ERROR: child_init(%d): "					"Error while connecting database\n", _rank);			return -1;		}	}	return 0;}/* * Module destroy function */static void destroy(void){	/* Parent only, synchronize the world	* and then nuke it */	if (is_main) {		if (synchronize_all_udomains() != 0) {			LOG(L_ERR, "timer(): Error while flushing cache\n");		}		free_all_udomains();	}		/* All processes close database connection */	if (ul_dbh) ul_dbf.close(ul_dbh);	/* free callbacks list */	destroy_ulcb_list();}/* * Timer handler */static void timer(unsigned int ticks, void* param){	if (synchronize_all_udomains() != 0) {		LOG(L_ERR, "timer(): Error while synchronizing cache\n");	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -