domainpolicy_mod.c

Go to the documentation of this file.
00001 /*
00002  * $Id: domainpolicy_mod.c 5695 2009-03-12 23:22:18Z henningw $
00003  *
00004  * Copyright (C) 2002-2003 Juha Heinanen
00005  *
00006  * This file is part of Kamailio, a free SIP server.
00007  *
00008  * Kamailio is free software; you can redistribute it and/or modify
00009  * it under the terms of the GNU General Public License as published by
00010  * the Free Software Foundation; either version 2 of the License, or
00011  * (at your option) any later version
00012  *
00013  * Kamailio is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016  * GNU General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU General Public License 
00019  * along with this program; if not, write to the Free Software 
00020  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00021  *
00022  * History:
00023  * -------
00024  * 2003-03-11: New module interface (janakj)
00025  * 2003-03-16: flags export parameter added (janakj)
00026  * 2003-04-05: default_uri #define used (jiri)
00027  * 2003-04-06: db connection closed in mod_init (janakj)
00028  * 2004-06-06  updated to the new DB api, cleanup: static dbf & handler,
00029  *              calls to domainpolicy_db_{bind,init,close,ver} (andrei)
00030  */
00031 
00032 
00033 /*!
00034  * \file
00035  * \brief Domain module
00036  */
00037 
00038 #include "domainpolicy_mod.h"
00039 #include <stdio.h>
00040 #include "../../mem/shm_mem.h"
00041 #include "../../sr_module.h"
00042 #include "../../ut.h"
00043 #include "domainpolicy.h"
00044 
00045 /*
00046  * Module management function prototypes
00047  */
00048 static int mod_init(void);
00049 static int child_init(int rank);
00050 
00051 MODULE_VERSION
00052 
00053 /*!
00054  * Version of gw and lcr tables required by the module, increment this value
00055  * if you change the table in an backwards incompatible way
00056  */
00057 #define DOMAINPOLICY_TABLE_VERSION 2
00058 
00059 
00060 #define DOMAINPOLICY_TABLE "domainpolicy"
00061 #define DOMAINPOLICY_COL_RULE "rule"
00062 #define DOMAINPOLICY_COL_TYPE "type"
00063 #define DOMAINPOLICY_COL_ATT "att"
00064 #define DOMAINPOLICY_COL_VAL "val"
00065 
00066 /* Default avp names */
00067 #define DEF_PORT_OVERRIDE_AVP         "portoverride"
00068 #define DEF_TRANSPORT_OVERRIDE_AVP    "transportoverride"
00069 #define DEF_DOMAIN_PREFIX_AVP         "domainprefix"
00070 #define DEF_DOMAIN_SUFFIX_AVP         "domainsuffix"
00071 #define DEF_DOMAIN_REPLACEMENT_AVP    "domainreplacement"
00072 #define DEF_SEND_SOCKET_AVP           "sendsocket"
00073 
00074 /*
00075  * Module parameter variables
00076  */
00077 static str db_url         = str_init(DEFAULT_RODB_URL);
00078 str domainpolicy_table    = str_init(DOMAINPOLICY_TABLE);     /*!< Name of domainpolicy table */
00079 str domainpolicy_col_rule = str_init(DOMAINPOLICY_COL_RULE);
00080 str domainpolicy_col_type = str_init(DOMAINPOLICY_COL_TYPE);
00081 str domainpolicy_col_att  = str_init(DOMAINPOLICY_COL_ATT);
00082 str domainpolicy_col_val  = str_init(DOMAINPOLICY_COL_VAL);
00083 
00084 str port_override_avp         = str_init(DEF_PORT_OVERRIDE_AVP);
00085 str transport_override_avp    = str_init(DEF_TRANSPORT_OVERRIDE_AVP);
00086 str domain_prefix_avp         = str_init(DEF_DOMAIN_PREFIX_AVP);
00087 str domain_suffix_avp         = str_init(DEF_DOMAIN_SUFFIX_AVP);
00088 str domain_replacement_avp    = str_init(DEF_DOMAIN_REPLACEMENT_AVP);
00089 str send_socket_avp           = str_init(DEF_SEND_SOCKET_AVP);
00090 
00091 /*
00092  * Other module variables
00093  */
00094 
00095 int_str port_override_name, transport_override_name, domain_prefix_name, 
00096    domain_suffix_name, domain_replacement_name, send_socket_name;
00097 unsigned short port_override_avp_name_str;
00098 unsigned short transport_override_avp_name_str;
00099 unsigned short domain_prefix_avp_name_str;
00100 unsigned short domain_suffix_avp_name_str;
00101 unsigned short domain_replacement_avp_name_str;
00102 unsigned short send_socket_avp_name_str;
00103 
00104 /*
00105  * Exported functions
00106  */
00107 static cmd_export_t cmds[] = {
00108    {"dp_can_connect",  (cmd_function)dp_can_connect,  0, 0, 0, REQUEST_ROUTE},
00109    {"dp_apply_policy", (cmd_function)dp_apply_policy, 0, 0, 0, REQUEST_ROUTE},
00110    {0, 0, 0, 0, 0, 0}
00111 };
00112 
00113 
00114 /*
00115  * Exported parameters
00116  */
00117 static param_export_t params[] = {
00118    {"db_url",                    STR_PARAM, &db_url.s                   },
00119    {"dp_table",                  STR_PARAM, &domainpolicy_table.s       },
00120    {"dp_col_rule",               STR_PARAM, &domainpolicy_col_rule.s    },
00121    {"dp_col_type",               STR_PARAM, &domainpolicy_col_type.s    },
00122    {"dp_col_att",                STR_PARAM, &domainpolicy_col_att.s     },
00123    {"dp_col_val",                STR_PARAM, &domainpolicy_col_val.s     },
00124    {"port_override_avp",         STR_PARAM, &port_override_avp.s        },
00125    {"transport_override_avp",    STR_PARAM, &transport_override_avp.s   },
00126    {"domain_prefix_avp",         STR_PARAM, &domain_prefix_avp.s        },
00127    {"domain_suffix_avp",         STR_PARAM, &domain_suffix_avp.s        },
00128    {"domain_replacement_avp",    STR_PARAM, &domain_replacement_avp.s   },
00129    {"send_socket_avp",           STR_PARAM, &send_socket_avp.s          },
00130    {0, 0, 0}
00131 };
00132 
00133 
00134 /*
00135  * Module interface
00136  */
00137 struct module_exports exports = {
00138    "domainpolicy", 
00139    DEFAULT_DLFLAGS, /*!< dlopen flags */
00140    cmds,      /*!< exported functions */
00141    params,    /*!< exported parameters */
00142    0,         /*!< exported statistics */
00143    0,         /*!< exported MI functions */
00144    0,         /*!< exported pseudo-variables */
00145    0,         /*!< extra processes */
00146    mod_init,  /*!< module initialization function */
00147    0,         /*!< response function*/
00148    0,         /*!< destroy function */
00149    child_init /*!< per-child init function */
00150 };
00151 
00152 
00153 static int mod_init(void)
00154 {
00155    unsigned int par;
00156    int ver;
00157 
00158    db_url.len = strlen(db_url.s);
00159    domainpolicy_table.len = strlen(domainpolicy_table.s);
00160    domainpolicy_col_rule.len = strlen(domainpolicy_col_rule.s);
00161    domainpolicy_col_type.len = strlen(domainpolicy_col_type.s);
00162    domainpolicy_col_att.len = strlen(domainpolicy_col_att.s);
00163    domainpolicy_col_val.len = strlen(domainpolicy_col_val.s);
00164 
00165    LM_DBG("check for DB module\n");
00166 
00167    /* Check if database module has been loaded */
00168    if (domainpolicy_db_bind(&db_url)<0)  {
00169       LM_ERR("no database module loaded!"
00170          " Please make sure that a DB module is loaded first\n");
00171       return -1;
00172    }
00173 
00174    LM_DBG("update length of module variables\n");
00175    /* Update length of module variables */
00176    port_override_avp.len         = strlen(port_override_avp.s);
00177    transport_override_avp.len    = strlen(transport_override_avp.s);
00178    domain_prefix_avp.len         = strlen(domain_prefix_avp.s);
00179    domain_suffix_avp.len         = strlen(domain_suffix_avp.s);
00180    domain_replacement_avp.len    = strlen(domain_replacement_avp.s);
00181    send_socket_avp.len           = strlen(send_socket_avp.s);
00182 
00183    /* Check table version */
00184    ver = domainpolicy_db_ver(&db_url, &domainpolicy_table);
00185    if (ver < 0) {
00186       LM_ERR("failed to query table version\n");
00187       return -1;
00188    } else if (ver < DOMAINPOLICY_TABLE_VERSION) {
00189       LM_ERR("invalid table version of domainpolicy table\n");
00190       return -1;
00191    }
00192 
00193    /* Assign AVP parameter names */
00194    LM_DBG("AVP\n");
00195    if (str2int(&port_override_avp, &par) == 0) {
00196       if (!par) {
00197          LM_ERR("port_override_avp not defined!\n");
00198          return -1;
00199       }
00200       port_override_name.n = par;
00201       port_override_avp_name_str = 0;
00202    } else {
00203       port_override_name.s = port_override_avp;
00204       port_override_avp_name_str = AVP_NAME_STR;
00205    }
00206    if (str2int(&transport_override_avp, &par) == 0) {
00207       if (!par) {
00208          LM_ERR(" transport_override_avp not defined!\n");
00209          return -1;
00210       }
00211       transport_override_name.n = par;
00212       transport_override_avp_name_str = 0;
00213    } else {
00214       transport_override_name.s = transport_override_avp;
00215       transport_override_avp_name_str = AVP_NAME_STR;
00216    }
00217    if (str2int(&domain_prefix_avp, &par) == 0) {
00218       if (!par) {
00219          LM_ERR("domain_prefix_avp not defined!\n");
00220          return -1;
00221       }
00222       domain_prefix_name.n = par;
00223       domain_prefix_avp_name_str = 0;
00224    } else {
00225       domain_prefix_name.s = domain_prefix_avp;
00226       domain_prefix_avp_name_str = AVP_NAME_STR;
00227    }
00228    if (str2int(&domain_suffix_avp, &par) == 0) {
00229       if (!par) {
00230          LM_ERR(" domain_suffix_avp not defined!\n");
00231          return -1;
00232       }
00233       domain_suffix_name.n = par;
00234       domain_suffix_avp_name_str = 0;
00235    } else {
00236       domain_suffix_name.s = domain_suffix_avp;
00237       domain_suffix_avp_name_str = AVP_NAME_STR;
00238    }
00239    if (str2int(&domain_replacement_avp, &par) == 0) {
00240       if (!par) {
00241          LM_ERR(" domain_replacement_avp not defined!\n");
00242          return -1;
00243       }
00244       domain_replacement_name.n = par;
00245       domain_replacement_avp_name_str = 0;
00246    } else {
00247       domain_replacement_name.s = domain_replacement_avp;
00248       domain_replacement_avp_name_str = AVP_NAME_STR;
00249    }
00250    if (str2int(&send_socket_avp, &par) == 0) {
00251       if (!par) {
00252          LM_ERR(" send_socket_avp not defined!\n");
00253          return -1;
00254       }
00255       send_socket_name.n = par;
00256       send_socket_avp_name_str = 0;
00257    } else {
00258       send_socket_name.s = send_socket_avp;
00259       send_socket_avp_name_str = AVP_NAME_STR;
00260    }
00261 
00262    return 0;
00263 }
00264 
00265 
00266 static int child_init(int rank)
00267 {
00268    /* Check if database is needed by child */
00269    if (rank > 0)  {
00270       if (domainpolicy_db_init(&db_url)<0) {
00271          LM_ERR("unable to connect to the database\n");
00272          return -1;
00273       }
00274    }
00275    return 0;
00276 }

Generated on Tue May 22 16:00:27 2012 for Kamailio - The Open Source SIP Server by  doxygen 1.5.6