Merge branch 'master' into treimann/master_tm-extend-callbacks
authorTimo Reimann <sr@foo-lounge.de>
Wed, 21 Dec 2011 19:01:06 +0000 (20:01 +0100)
committerTimo Reimann <sr@foo-lounge.de>
Wed, 21 Dec 2011 19:01:06 +0000 (20:01 +0100)
* master: (201 commits)
  modules: bunch of READMEs regenerated to be sync'ed with docbook
  modules: coherent naming of Statistics section in docbook
  sl: regenerated the readme
  sl: documented exported statistics
  core/tcp: define option TCP_CLONE_RCVBUF to turn off/on tcp rcv buffer cloning
  pdt(k): added rpc command pdt.reload
  pdt(k): MI commands can be disabled via define PDT_NO_MI
  pdt(k): updates to documentation
  pdt: refactored prefix-domain translation
  tcp: fix for ENOTCONN on newer FreeBSDs
  dialplan: added fnmatch (2) matching operator
  core/tcp: init max_tls_connections in tcp options check
  core/tcp: proper init of parameter tls_max_connections
  textopsx: added fnmatch(value, expr, flags) function
  core: added function to help fixup of PVE, string and expressions
  registrar(k): maintaining one contact per AoR has priority over max_contacts
  lib/srdb1: Enable non-pooled database connections to be defined.
  modules_k/presence: Added additional return value to pres_auth_status() for polite-block
  tls: new parameter 'renegotiation' to enable/disable client renegotiation
  tls: use pkg-config to get cflags and libs for compilation
  ...

335 files changed:
INSTALL
Makefile
Makefile.defs
Makefile.modules
cfg.lex
cfg.y
core_cmd.c
data_lump.c
doc/rpc/ser_rpc.txt
doc/rpc/ser_rpc.xml
doc/rpc_list/Makefile
doc/rpc_list/docbook/rpc_cfg_rpc.xml
doc/rpc_list/docbook/rpc_core.xml
doc/rpc_list/docbook/rpc_db_flatstore.xml
doc/rpc_list/docbook/rpc_debugger.xml
doc/rpc_list/docbook/rpc_dialplan.xml [new file with mode: 0644]
doc/rpc_list/docbook/rpc_dispatcher.xml
doc/rpc_list/docbook/rpc_dispatcher_s.xml [new file with mode: 0644]
doc/rpc_list/docbook/rpc_domain_s.xml [new file with mode: 0644]
doc/rpc_list/docbook/rpc_kex.xml [new file with mode: 0644]
doc/rpc_list/docbook/rpc_list.xml
doc/rpc_list/docbook/rpc_prefix_route.xml
doc/rpc_list/docbook/rpc_sl.xml
doc/rpc_list/docbook/rpc_tls.xml
doc/rpc_list/docbook/rpc_tm.xml
doc/rpc_list/docbook/rpc_usrloc.xml [new file with mode: 0644]
doc/rpc_list/docbook/rpc_usrloc_s.xml
doc/rpc_list/rpc_cfg_rpc.txt
doc/rpc_list/rpc_core.txt
doc/rpc_list/rpc_db_flatstore.txt
doc/rpc_list/rpc_debugger.txt
doc/rpc_list/rpc_dialplan.txt [new file with mode: 0644]
doc/rpc_list/rpc_dispatcher.txt
doc/rpc_list/rpc_dispatcher_s.txt [new file with mode: 0644]
doc/rpc_list/rpc_domain_s.txt [new file with mode: 0644]
doc/rpc_list/rpc_kex.txt [new file with mode: 0644]
doc/rpc_list/rpc_prefix_route.txt
doc/rpc_list/rpc_sl.txt
doc/rpc_list/rpc_tls.txt
doc/rpc_list/rpc_tm.txt
doc/rpc_list/rpc_usrloc.txt [new file with mode: 0644]
doc/rpc_list/rpc_usrloc_s.txt
docbook/Makefile
dset.c
dset.h
dst_blacklist.c
forward.c
forward.h
globals.h
ip_addr.c
ip_addr.h
lib/binrpc/binrpc_api.c
lib/binrpc/binrpc_api.h
lib/kcore/faked_msg.c
lib/srdb1/db.c
lib/srdb1/db.h
lib/srdb1/db_id.c
lib/srdb1/db_id.h
lib/srdb1/db_op.h
lib/srdb1/db_query.c
lib/srdb1/db_ut.c
lib/srdb1/schema/mtrees.xml
lib/srdb1/schema/silo.xml
lib/srdb2/db_uri.c
main.c
modules/app_lua/app_lua_exp.c
modules/app_python/python_mod.c
modules/async/README
modules/async/async_mod.c
modules/async/doc/async_admin.xml
modules/auth/README
modules/auth/api.h
modules/auth/auth_mod.c
modules/auth/doc/functions.xml
modules/ctl/ctl_defaults.h
modules/db_berkeley/bdb_mod.c
modules/db_berkeley/km_db_berkeley.c
modules/db_flatstore/flatstore_mod.c
modules/db_mysql/km_db_mysql.c
modules/db_mysql/km_db_mysql.h
modules/db_mysql/km_dbase.c
modules/db_mysql/km_dbase.h
modules/db_mysql/mysql_mod.c
modules/db_postgres/km_db_postgres.c
modules/db_postgres/pg_mod.c
modules/dialplan/README
modules/dialplan/dialplan.c
modules/dialplan/dialplan.h
modules/dialplan/doc/dialplan_admin.xml
modules/dialplan/dp_db.c
modules/dialplan/dp_repl.c
modules/lcr/lcr_mod.c
modules/mi_rpc/Makefile
modules/mi_rpc/README
modules/mi_rpc/doc/mi_rpc_admin.xml
modules/mi_rpc/mi_rpc_mod.c
modules/mtree/README
modules/mtree/doc/mtree_admin.xml
modules/mtree/mtree.c
modules/mtree/mtree.h
modules/mtree/mtree_mod.c
modules/ndb_redis/README
modules/ndb_redis/doc/ndb_redis_admin.xml
modules/sanity/mod_sanity.c
modules/sanity/sanity.c
modules/sdpops/sdpops_data.c
modules/sdpops/sdpops_data.h
modules/sdpops/sdpops_mod.c
modules/sl/README
modules/sl/doc/sl.xml
modules/sl/doc/stats.xml [new file with mode: 0644]
modules/textopsx/README
modules/textopsx/api.h [new file with mode: 0644]
modules/textopsx/doc/functions.xml
modules/textopsx/textopsx.c
modules/tls/Makefile
modules/tls/tls_domain.c
modules/tls/tls_init.c
modules/tls/tls_init.h
modules/tls/tls_mod.c
modules/tls/tls_mod.h
modules/tls/tls_rpc.c
modules/tls/tls_server.c
modules/tls/tls_server.h
modules/tm/lw_parser.c
modules/tm/t_fwd.c
modules/tm/t_reply.c
modules/tm/tm.c
modules/xhttp_rpc/Makefile [new file with mode: 0644]
modules/xhttp_rpc/README [new file with mode: 0644]
modules/xhttp_rpc/doc/Makefile [new file with mode: 0644]
modules/xhttp_rpc/doc/xhttp_rpc.xml [new file with mode: 0644]
modules/xhttp_rpc/doc/xhttp_rpc_admin.xml [new file with mode: 0644]
modules/xhttp_rpc/xhttp_rpc.c [new file with mode: 0644]
modules/xhttp_rpc/xhttp_rpc.h [new file with mode: 0644]
modules/xhttp_rpc/xhttp_rpc_fnc.c [new file with mode: 0644]
modules/xhttp_rpc/xhttp_rpc_fnc.h [new file with mode: 0644]
modules/xmlrpc/xmlrpc.c
modules_k/acc/acc_cdr.c
modules_k/alias_db/alias_db.c
modules_k/alias_db/alookup.c
modules_k/alias_db/alookup.h
modules_k/alias_db/api.h [new file with mode: 0644]
modules_k/auth_db/Makefile
modules_k/auth_db/README
modules_k/auth_db/authdb_mod.c
modules_k/auth_db/authorize.c
modules_k/auth_db/authorize.h
modules_k/auth_db/doc/auth_db_admin.xml
modules_k/cfgutils/README
modules_k/db_oracle/db_oracle.c
modules_k/db_sqlite/db_sqlite.c
modules_k/db_text/dbtext.c
modules_k/db_unixodbc/db_unixodbc.c
modules_k/dialog/README
modules_k/dialog/dialog.c
modules_k/dialog/dlg_db_handler.c
modules_k/dialog/dlg_handlers.c
modules_k/dialog/dlg_handlers.h
modules_k/dialog/dlg_hash.c
modules_k/dialog/dlg_hash.h
modules_k/dialog/dlg_profile.c
modules_k/dialog/dlg_profile.h
modules_k/dialog/dlg_req_within.c
modules_k/dialog/dlg_timer.h
modules_k/dialog/dlg_var.c
modules_k/dialog/dlg_var.h
modules_k/dialog/doc/dialog_admin.xml
modules_k/dispatcher/README
modules_k/dispatcher/dispatch.c
modules_k/dispatcher/dispatch.h
modules_k/dispatcher/dispatcher.c
modules_k/dispatcher/doc/dispatcher.cfg
modules_k/dispatcher/doc/dispatcher_admin.xml
modules_k/dispatcher/doc/dispatcher_faq.xml
modules_k/diversion/diversion.c
modules_k/dmq/bind_dmq.c
modules_k/dmq/bind_dmq.h
modules_k/dmq/dmq.c
modules_k/dmq/dmq.h
modules_k/dmq/dmq_funcs.c
modules_k/dmq/dmq_funcs.h
modules_k/dmq/dmqnode.c
modules_k/dmq/dmqnode.h
modules_k/dmq/message.c
modules_k/dmq/message.h
modules_k/dmq/notification_peer.c
modules_k/dmq/notification_peer.h
modules_k/dmq/peer.c
modules_k/dmq/peer.h
modules_k/dmq/worker.c
modules_k/dmq/worker.h
modules_k/imc/README
modules_k/imc/doc/imc_admin.xml
modules_k/msilo/README
modules_k/msilo/api.h [new file with mode: 0644]
modules_k/msilo/doc/msilo_admin.xml
modules_k/msilo/msilo.c
modules_k/nat_traversal/README
modules_k/nat_traversal/doc/nat_traversal_admin.xml
modules_k/nat_traversal/nat_traversal.c
modules_k/p_usrloc/ul_db_handle.c
modules_k/pdt/Makefile
modules_k/pdt/README
modules_k/pdt/doc/pdt_admin.xml
modules_k/pdt/pdt.c
modules_k/pdt/pdt_mi.c
modules_k/pdt/pdtree.h
modules_k/presence/README
modules_k/presence/bind_presence.c
modules_k/presence/bind_presence.h
modules_k/presence/doc/presence_admin.xml
modules_k/presence/event_list.c
modules_k/presence/presence.c
modules_k/presence/presentity.c
modules_k/presence/publish.c
modules_k/presence/subscribe.c
modules_k/presence/subscribe.h
modules_k/presence_conference/pidf.c
modules_k/presence_profile/Makefile [new file with mode: 0644]
modules_k/presence_profile/README [new file with mode: 0644]
modules_k/presence_profile/add_events.c [new file with mode: 0644]
modules_k/presence_profile/add_events.h [new file with mode: 0644]
modules_k/presence_profile/doc/Makefile [new file with mode: 0644]
modules_k/presence_profile/doc/presence_profile.xml [new file with mode: 0644]
modules_k/presence_profile/doc/presence_profile_admin.xml [new file with mode: 0644]
modules_k/presence_profile/presence_profile.c [new file with mode: 0644]
modules_k/presence_profile/presence_profile.h [new file with mode: 0644]
modules_k/presence_xml/pidf.c
modules_k/presence_xml/pres_check.c
modules_k/pua/README
modules_k/pua/doc/pua_admin.xml
modules_k/pua/hash.c
modules_k/pua/hash.h
modules_k/pua/pua.c
modules_k/pua/pua.h
modules_k/pua/pua_db.c [new file with mode: 0644]
modules_k/pua/pua_db.h [new file with mode: 0644]
modules_k/pua/send_publish.c
modules_k/pua/send_subscribe.c
modules_k/pua/send_subscribe.h
modules_k/pua_usrloc/api.h [new file with mode: 0644]
modules_k/pua_usrloc/pua_usrloc.c
modules_k/pv/pv.c
modules_k/pv/pv_time.c
modules_k/pv/pv_trans.c
modules_k/pv/pv_trans.h
modules_k/pv/pv_xavp.c
modules_k/qos/README
modules_k/qos/doc/qos_admin.xml
modules_k/registrar/README
modules_k/registrar/api.c
modules_k/registrar/api.h
modules_k/registrar/doc/registrar_admin.xml
modules_k/registrar/save.c
modules_k/rls/README
modules_k/rls/api.h [new file with mode: 0644]
modules_k/rls/doc/rls_admin.xml
modules_k/rls/notify.c
modules_k/rls/resource_notify.c
modules_k/rls/rls.c
modules_k/rls/rls.h
modules_k/rls/rls_db.c [new file with mode: 0644]
modules_k/rls/subscribe.c
modules_k/rr/README
modules_k/rr/api.c
modules_k/rr/api.h
modules_k/rr/doc/rr_admin.xml
modules_k/rr/doc/rr_devel.xml
modules_k/rr/record.c
modules_k/rr/record.h
modules_k/rr/rr_mod.c
modules_k/rtimer/README
modules_k/rtimer/doc/rtimer_admin.xml
modules_k/rtimer/rtimer_mod.c
modules_k/siputils/checks.c
modules_k/siputils/checks.h
modules_k/siputils/siputils.c
modules_k/siputils/siputils.h
modules_k/snmpstats/snmpstats.c
modules_k/sqlops/README
modules_k/sst/README
modules_k/sst/doc/sst_admin.xml
modules_k/textops/README
modules_k/textops/api.c
modules_k/textops/api.h
modules_k/textops/doc/textops_admin.xml
modules_k/textops/textops.c
modules_k/textops/textops.h
modules_k/tmx/README
modules_k/tmx/doc/tmx_admin.xml
modules_k/uac/README
modules_k/uac/api.h [new file with mode: 0644]
modules_k/uac/doc/uac_admin.xml
modules_k/uac/uac.c
modules_k/usrloc/README
modules_k/usrloc/doc/usrloc_admin.xml
modules_k/xcap_server/xcap_server.c
parser/msg_parser.h
parser/parse_event.c
parser/parse_event.h
parser/parse_to.c
parser/parse_uri.c
parser/sdp/sdp.c
parser/sdp/sdp_helpr_funcs.c
pkg/kamailio/deb/debian/control
pkg/kamailio/deb/lenny/control
pkg/kamailio/deb/lucid/control
pkg/kamailio/deb/squeeze/control
pkg/kamailio/deb/wheezy/control
receive.c
sip-router.8
socket_info.c
sr_module.c
sr_module.h
tcp_info.h
tcp_init.h
tcp_main.c
tcp_options.c
tcp_options.h
tcp_read.c
timer.h
timer_proc.c
timer_proc.h
utils/kamctl/db_berkeley/kamailio/silo
utils/kamctl/db_berkeley/kamailio/version
utils/kamctl/db_sqlite/msilo-create.sql
utils/kamctl/dbtext/kamailio/silo
utils/kamctl/dbtext/kamailio/version
utils/kamctl/kamctl
utils/kamctl/mysql/msilo-create.sql
utils/kamctl/oracle/msilo-create.sql
utils/kamctl/postgres/msilo-create.sql
utils/sercmd/Makefile
xavp.c

diff --git a/INSTALL b/INSTALL
index e631567..aed811a 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -64,6 +64,9 @@ very few, Kamailio enabling next compile time flags:
 
 Switching between flavours is a matter of 'make' command parameters.
 
+Several installation tutorials for Kamailio are available on the web wiki:
+  - http://www.kamailio.org/wiki/
+
 
 2. Supported Architectures and Requirements
 -------------------------------------------
index fc9767c..1ea0050 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -174,7 +174,7 @@ module_group_radius=acc_radius auth_radius misc_radius avp_radius uri_radius \
 
 # For presence
 # kamailio modules
-module_group_presence=presence presence_dialoginfo presence_mwi presence_xml \
+module_group_presence=presence presence_dialoginfo presence_mwi presence_xml presence_profile\
                                                pua pua_bla pua_dialoginfo pua_mi pua_usrloc pua_xmpp \
                                                rls xcap_client xcap_server presence_conference \
                                                presence_reginfo pua_reginfo
@@ -210,8 +210,8 @@ module_group_kstandard=acc alias_db auth auth_db benchmark call_control \
                                avpops cfg_db cfg_rpc ctl db_flatstore dialplan enum \
                                iptrtpproxy lcr mediaproxy mi_rpc pdb sanity tm topoh \
                                blst prefix_route counters debugger matrix mqueue mtree \
-                               pipelimit rtpproxy textopsx xhttp ipops p_usrloc sdpops \
-                               async sipcapture, dmq
+                               pipelimit rtpproxy textopsx xhttp xhttp_rpc ipops p_usrloc \
+                               sdpops async sipcapture dmq
 
 # K mysql module
 module_group_kmysql=db_mysql
@@ -262,7 +262,7 @@ module_group_kmemcached=memcached
 module_group_ktls=tls
 
 # K presence modules
-module_group_kpresence=presence presence_dialoginfo presence_mwi presence_xml \
+module_group_kpresence=presence presence_dialoginfo presence_mwi presence_xml presence_profile\
                                                pua pua_bla pua_dialoginfo pua_mi pua_usrloc pua_xmpp \
                                                rls xcap_client xcap_server presence_conference \
                                                presence_reginfo pua_reginfo
@@ -1189,3 +1189,7 @@ dbschema:
        -@echo "Build database schemas"
        $(MAKE) -C lib/srdb1/schema
        -@echo "Done"
+
+.PHONY: printcdefs
+printcdefs:
+       @echo -n $(C_DEFS)
index b344a7e..7a40abe 100644 (file)
@@ -160,9 +160,9 @@ INSTALL_FLAVOUR=$(FLAVOUR)
 
 #version number
 VERSION = 3
-PATCHLEVEL = 2
+PATCHLEVEL = 3
 SUBLEVEL =  0
-EXTRAVERSION = -pre4
+EXTRAVERSION = -dev3
 
 # memory debugger switcher
 # 0 - off (release mode)
index 1e198d6..cd391e6 100644 (file)
@@ -75,6 +75,14 @@ override static_modules_path=
 # temporary def (visible only in the module, not exported)
 DEFS += -DMOD_NAME='"$(MOD_NAME)"'
 
+
+ifeq (,$(findstring -DSER_MOD_INTERFACE, $(DEFS)))
+       MODIFACE=-DOPENSER_MOD_INTERFACE
+else
+       MODIFACE=-DSER_MOD_INTERFACE
+endif
+
+
 ifneq ($(makefile_defs_included),1)
 $(error "the local makefile does not include Makefile.defs!")
 endif
@@ -297,6 +305,10 @@ man:
 
 endif
 
+
+printmiface:
+       @echo -n $(MODIFACE)
+
 endif # ifeq($(makefile_defs),1)
 
 include $(COREPATH)/Makefile.cfg
diff --git a/cfg.lex b/cfg.lex
index 4a19fe1..26e31d0 100644 (file)
--- a/cfg.lex
+++ b/cfg.lex
@@ -414,6 +414,7 @@ TCP_CONNECT_TIMEOUT "tcp_connect_timeout"
 TCP_CON_LIFETIME       "tcp_connection_lifetime"
 TCP_POLL_METHOD                "tcp_poll_method"
 TCP_MAX_CONNECTIONS    "tcp_max_connections"
+TLS_MAX_CONNECTIONS    "tls_max_connections"
 TCP_NO_CONNECT         "tcp_no_connect"
 TCP_SOURCE_IPV4                "tcp_source_ipv4"
 TCP_SOURCE_IPV6                "tcp_source_ipv6"
@@ -805,6 +806,8 @@ IMPORTFILE      "import_file"
                                                                        return TCP_POLL_METHOD; }
 <INITIAL>{TCP_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
                                                                        return TCP_MAX_CONNECTIONS; }
+<INITIAL>{TLS_MAX_CONNECTIONS} { count(); yylval.strval=yytext;
+                                                                       return TLS_MAX_CONNECTIONS; }
 <INITIAL>{TCP_NO_CONNECT}              { count(); yylval.strval=yytext;
                                                                        return TCP_NO_CONNECT; }
 <INITIAL>{TCP_SOURCE_IPV4}             { count(); yylval.strval=yytext;
diff --git a/cfg.y b/cfg.y
index 9317541..dcca98e 100644 (file)
--- a/cfg.y
+++ b/cfg.y
@@ -472,6 +472,7 @@ extern char *finame;
 %token TCP_CON_LIFETIME
 %token TCP_POLL_METHOD
 %token TCP_MAX_CONNECTIONS
+%token TLS_MAX_CONNECTIONS
 %token TCP_NO_CONNECT
 %token TCP_SOURCE_IPV4
 %token TCP_SOURCE_IPV6
@@ -1063,6 +1064,14 @@ assign_stm:
                #endif
        }
        | TCP_MAX_CONNECTIONS EQUAL error { yyerror("number expected"); }
+       | TLS_MAX_CONNECTIONS EQUAL NUMBER {
+               #ifdef USE_TLS
+                       tls_max_connections=$3;
+               #else
+                       warn("tls support not compiled in");
+               #endif
+       }
+       | TLS_MAX_CONNECTIONS EQUAL error { yyerror("number expected"); }
        | TCP_NO_CONNECT EQUAL NUMBER {
                #ifdef USE_TCP
                        tcp_default_cfg.no_connect=$3;
index c023b59..9914737 100644 (file)
 #include "dprint.h"
 #include "core_cmd.h"
 #include "globals.h"
+#include "forward.h"
+#include "socket_info.h"
+#include "name_alias.h"
 #include "pt.h"
 #include "ut.h"
 #include "tcp_info.h"
+#include "tcp_conn.h"
 #include "tcp_options.h"
 #include "core_cmd.h"
 #include "cfg_core.h"
@@ -676,10 +680,12 @@ static void core_tcpinfo(rpc_t* rpc, void* c)
        if (!tcp_disable){
                tcp_get_info(&ti);
                rpc->add(c, "{", &handle);
-               rpc->struct_add(handle, "dddd",
+               rpc->struct_add(handle, "dddddd",
                        "readers", ti.tcp_readers,
                        "max_connections", ti.tcp_max_connections,
+                       "max_tls_connections", ti.tls_max_connections,
                        "opened_connections", ti.tcp_connections_no,
+                       "opened_tls_connections", ti.tls_connections_no,
                        "write_queued_bytes", ti.tcp_write_queued
                );
        }else{
@@ -706,11 +712,12 @@ static void core_tcp_options(rpc_t* rpc, void* c)
        if (!tcp_disable){
                tcp_options_get(&t);
                rpc->add(c, "{", &handle);
-               rpc->struct_add(handle, "dddddddddddddddddddddd",
+               rpc->struct_add(handle, "ddddddddddddddddddddddd",
                        "connect_timeout", t.connect_timeout_s,
                        "send_timeout",  TICKS_TO_S(t.send_timeout),
                        "connection_lifetime",  TICKS_TO_S(t.con_lifetime),
                        "max_connections(soft)", t.max_connections,
+                       "max_tls_connections(soft)", t.max_tls_connections,
                        "no_connect",   t.no_connect,
                        "fd_cache",             t.fd_cache,
                        "async",                t.async,
@@ -739,6 +746,89 @@ static void core_tcp_options(rpc_t* rpc, void* c)
 }
 
 
+static const char* core_tcp_list_doc[] = {
+       "Returns tcp connections details.",    /* Documentation string */
+       0                               /* Method signature(s) */
+};
+
+extern gen_lock_t* tcpconn_lock;
+extern struct tcp_connection** tcpconn_id_hash;
+
+static void core_tcp_list(rpc_t* rpc, void* c)
+{
+#ifdef USE_TCP
+       char src_ip[IP_ADDR_MAX_STR_SIZE];
+       char dst_ip[IP_ADDR_MAX_STR_SIZE];
+       void* handle;
+       char* state;
+       char* type;
+       struct tcp_connection* con;
+       int i, len, timeout;
+
+       TCPCONN_LOCK;
+       for(i = 0; i < TCP_ID_HASH_SIZE; i++) {
+               for (con = tcpconn_id_hash[i]; con; con = con->id_next) {
+                       rpc->add(c, "{", &handle);
+                       /* tcp data */
+                       if (con->rcv.proto == PROTO_TCP)
+                               type = "TCP";
+                       else if (con->rcv.proto == PROTO_TCP)
+                               type = "TLS";
+                       else
+                               type = "UNKNOWN";
+
+                       if ((len = ip_addr2sbuf(&con->rcv.src_ip, src_ip, sizeof(src_ip)))
+                                       == 0)
+                               BUG("failed to convert source ip");
+                       src_ip[len] = 0;
+                       if ((len = ip_addr2sbuf(&con->rcv.dst_ip, dst_ip, sizeof(dst_ip)))
+                                       == 0)
+                               BUG("failed to convert destination ip");
+                       dst_ip[len] = 0;
+                       timeout = TICKS_TO_S(con->timeout - get_ticks_raw());
+                       switch(con->state) {
+                               case S_CONN_ERROR:
+                                       state = "CONN_ERROR";
+                               break;
+                               case S_CONN_BAD:
+                                       state = "CONN_BAD";
+                               break;
+                               case S_CONN_OK:
+                                       state = "CONN_OK";
+                               break;
+                               case S_CONN_INIT:
+                                       state = "CONN_INIT";
+                               break;
+                               case S_CONN_EOF:
+                                       state = "CONN_EOF";
+                               break;
+                               case S_CONN_ACCEPT:
+                                       state = "CONN_ACCEPT";
+                               break;
+                               case S_CONN_CONNECT:
+                                       state = "CONN_CONNECT";
+                               break;
+                               default:
+                                       state = "UNKNOWN";
+                       }
+                       rpc->struct_add(handle, "dssdsdsd",
+                                       "id", con->id,
+                                       "type", type,
+                                       "state", state,
+                                       "timeout", timeout,
+                                       "src_ip", src_ip,
+                                       "src_port", con->rcv.src_port,
+                                       "dst_ip", dst_ip,
+                                       "dst_port", con->rcv.dst_port);
+               }
+       }
+       TCPCONN_UNLOCK;
+#else
+       rpc->fault(c, 500, "tcp support not compiled");
+#endif
+}
+
+
 
 static const char* core_sctp_options_doc[] = {
        "Returns active sctp options. With one parameter"
@@ -887,6 +977,96 @@ static void core_udp4rawinfo(rpc_t* rpc, void* c)
 #endif /* USE_RAW_SOCKS */
 }
 
+/**
+ *
+ */
+static const char* core_aliases_list_doc[] = {
+       "List local SIP server host aliases",    /* Documentation string */
+       0                                     /* Method signature(s) */
+};
+
+/**
+ * list the name aliases for SIP server
+ */
+static void core_aliases_list(rpc_t* rpc, void* c)
+{
+       void *hr;
+       void *ha;
+       struct host_alias* a;
+
+       rpc->add(c, "{", &hr);
+       rpc->struct_add(hr, "s",
+                       "myself_callbacks", is_check_self_func_list_set()?"yes":"no");
+       for(a=aliases; a; a=a->next) {
+               rpc->struct_add(hr, "{", "alias", &ha);
+               rpc->struct_add(ha, "sS",
+                               "proto",  proto2a(a->proto),
+                               "address", &a->alias
+                       );
+               if (a->port)
+                       rpc->struct_add(ha, "d",
+                                       "port", a->port);
+               else
+                       rpc->struct_add(ha, "s",
+                                       "port", "*");
+       }
+}
+
+/**
+ *
+ */
+static const char* core_sockets_list_doc[] = {
+       "List local SIP server listen sockets",    /* Documentation string */
+       0                                     /* Method signature(s) */
+};
+
+/**
+ * list listen sockets for SIP server
+ */
+static void core_sockets_list(rpc_t* rpc, void* c)
+{
+       void *hr;
+       void *ha;
+       struct socket_info *si;
+       struct socket_info** list;
+       struct addr_info* ai;
+       unsigned short proto;
+
+       proto=PROTO_UDP;
+       rpc->add(c, "{", &hr);
+       do{
+               list=get_sock_info_list(proto);
+               for(si=list?*list:0; si; si=si->next){
+                       rpc->struct_add(hr, "{", "socket", &ha);
+                       if (si->addr_info_lst){
+                               rpc->struct_add(ha, "ss",
+                                               "proto", get_proto_name(proto),
+                                               "address", si->address_str.s);
+                               for (ai=si->addr_info_lst; ai; ai=ai->next)
+                                       rpc->struct_add(ha, "ss",
+                                               "address", ai->address_str.s);
+                               rpc->struct_add(ha, "sss",
+                                               "proto", si->port_no_str.s,
+                                               "mcast", si->flags & SI_IS_MCAST ? "yes" : "no",
+                                               "mhomed", si->flags & SI_IS_MHOMED ? "yes" : "no");
+                       } else {
+                               printf("             %s: %s",
+                                               get_proto_name(proto),
+                                               si->name.s);
+                               rpc->struct_add(ha, "ss",
+                                               "proto", get_proto_name(proto),
+                                               "address", si->name.s);
+                               if (!si->flags & SI_IS_IP)
+                                       rpc->struct_add(ha, "ss",
+                                               "ipaddress", si->address_str.s);
+                               rpc->struct_add(ha, "sss",
+                                               "proto", si->port_no_str.s,
+                                               "mcast", si->flags & SI_IS_MCAST ? "yes" : "no",
+                                               "mhomed", si->flags & SI_IS_MHOMED ? "yes" : "no");
+                       }
+               }
+       } while((proto=next_proto(proto)));
+}
 
 
 /*
@@ -920,11 +1100,14 @@ static rpc_export_t core_rpc_methods[] = {
 #endif
        {"core.tcp_info",          core_tcpinfo,           core_tcpinfo_doc,    0},
        {"core.tcp_options",       core_tcp_options,       core_tcp_options_doc,0},
+       {"core.tcp_list",          core_tcp_list,          core_tcp_list_doc,0},
        {"core.sctp_options",      core_sctp_options,      core_sctp_options_doc,
                0},
        {"core.sctp_info",         core_sctpinfo,          core_sctpinfo_doc,   0},
        {"core.udp4_raw_info",     core_udp4rawinfo,       core_udp4rawinfo_doc,
                0},
+       {"core.aliases_list",      core_aliases_list,      core_aliases_list_doc,   0},
+       {"core.sockets_list",      core_sockets_list,      core_sockets_list_doc,   0},
 #ifdef USE_DNS_CACHE
        {"dns.mem_info",          dns_cache_mem_info,     dns_cache_mem_info_doc,
                0       },
index 433ce2f..5016383 100644 (file)
@@ -650,7 +650,7 @@ void del_nonshm_lump( struct lump** lump_list )
        crt = *lump_list;
 
        while (crt) {
-               if (crt->flags!=LUMPFLAG_SHMEM) {
+               if (!(crt->flags&LUMPFLAG_SHMEM)) {
                        /* unlink it */
                        foo = crt;
                        crt = crt->next;
@@ -665,7 +665,7 @@ void del_nonshm_lump( struct lump** lump_list )
                        prev_r = crt;
                        while(r){
                                foo=r; r=r->after;
-                               if (foo->flags!=LUMPFLAG_SHMEM) {
+                               if (!(foo->flags&LUMPFLAG_SHMEM)) {
                                        prev_r->after = r;
                                        free_lump(foo);
                                        pkg_free(foo);
@@ -678,7 +678,7 @@ void del_nonshm_lump( struct lump** lump_list )
                        prev_r = crt;
                        while(r){
                                foo=r; r=r->before;
-                               if (foo->flags!=LUMPFLAG_SHMEM) {
+                               if (!(foo->flags&LUMPFLAG_SHMEM)) {
                                        prev_r->before = r;
                                        free_lump(foo);
                                        pkg_free(foo);
index b41d1f7..5d0cb13 100644 (file)
@@ -1,4 +1,4 @@
-1.  SER Management Interface
+1. RPC Control Interface
      __________________________________________________________________
 
    1.1. Overview of Operation
@@ -10,6 +10,7 @@
 
               1.2.3.1. scan
               1.2.3.2. struct_scan
+              1.2.3.3. Retrieving Parameters Example
 
         1.2.4. Building Reply
 
 
 1.1. Overview of Operation
 
-   The RPC (Remote Procedure Call) interface of SER is an interface for
+   The RPC (Remote Procedure Call) interface is an interface for
    communicating with external applications. Using it an external
    application can call a function or procedure that will be executed
-   inside SER. Function parameters are supported as well as returning
-   multiple values as results.
+   inside SIP Server (SER or Kamailio). Function parameters are supported
+   as well as returning multiple values as results.
 
-   By itself SER RPC consists of two APIs, one for defining RPC functions
-   in a transport independent way (called the rpc module api) and one for
+   By itself RPC consists of two APIs, one for defining RPC functions in a
+   transport independent way (called the rpc module api) and one for
    implementing RPC transports.
 
    The RPC transports are implemented by writting a RPC transport module.
@@ -45,8 +46,8 @@
    information about the existing transport modules, please refer to their
    documentation.
 
-   When writing a SER RPC procedure or function, one needs only use the
-   RPC API and it will work automatically with all the transports and
+   When writing a RPC procedure or function, one needs only use the RPC
+   API and it will work automatically with all the transports and
    encodings. One needs only to load the desired RPC transport module
    (e.g. xmlrpc).
 
 
 1.2. Module API
 
-   Each SER module can export RPC functions just like it can export
-   parameters and functions to be called from the script. Whenever SER
+   Each module can export RPC functions just like it can export parameters
+   and functions to be called from the script. Whenever SIP server
    receives an RPC request, it will search through the list of exported
    RPC functions and the function with matching name will be executed. A
-   couple of essential RPC functions are also embedded into the SER core.
+   couple of essential RPC functions are also embedded into the SIP server
+   core.
 
    This section gives a detailed overview of the whole RPC API.
    Section 1.2.1, "RPC Functions" describes the prototype and conventions
 1.2.1. RPC Functions
 
    RPC functions are standard C functions with the following prototype:
-typedef void (*rpc_function_t)(rpc_t* rpc);
-
-   RPC functions take one parameter, this parameter is a pointer to rpc_t
-   structure and is called RPC context. The context contains references to
-   all API functions available to the RPC function as well as all data
-   necessary to create the response. RPC functions do not return any
-   value, instead the return value is created using functions from the
-   context. The motivation for this decision is the fact that RPC
+typedef void (*rpc_function_t)(rpc_t* rpc, void* ctx);
+
+   RPC functions take two parameters, first parameter is a pointer to
+   rpc_t structure and the context. The rpc_t structure contains
+   references to all API functions available to the RPC function as well
+   as all data necessary to create the response. RPC functions do not
+   return any value, instead the return value is created using functions
+   from the context. The motivation for this decision is the fact that RPC
    functions should always return a response and even the API functions
    called from RPC functions should have the possibility to indicate an
    error (and should not rely on RPC functions doing so).
@@ -108,7 +110,7 @@ typedef void (*rpc_function_t)(rpc_t* rpc);
    function with "_doc" suffix.
 
    Each module containing RPC functions has to export all the RPC
-   functions to SER core in order to make them visible to the RPC
+   functions to SIP server core in order to make them visible to the RPC
    transport modules. The export process involves a rpc_export_t structure
    (either by itself or in an array):
 typedef struct rpc_export {
@@ -122,13 +124,14 @@ ription */
    The flags attribute of the rpc_export structure is reserved for future
    use and is currently unused.
 
-   There are several ways of exporting the RPC functions to the SER core:
+   There are several ways of exporting the RPC functions to the SIP server
+   core:
      * register a null terminated array of rpc_export_t structures using
        the rpc_register_array() function (defined in rpc_lookup.h), from
        the module init function (mod_init()). This is the recommended
        method for all the new modules.
-       Example 1.
-       The rpc_export_t array for the usrloc module looks like:
+       Example 1. usrloc RPC Exports Declaration
+       The rpc_export_t array for the modules_s/usrloc module looks like:
 rpc_export_t ul_rpc[] = {
     {"usrloc.statistics",      rpc_stats,           rpc_stats_doc,          0},
     {"usrloc.delete_aor",      rpc_delete_aor,      rpc_delete_aor_doc,     0},
@@ -149,9 +152,9 @@ rpc_export_t ul_rpc[] = {
      * register RPCs one by one using the rpc_register_function() (defined
        in rpc_lookup.h), from the module init function.
      * register a null terminated array of rpc_export_t structures using
-       the SER module interface. For this purpose, the module_exports
-       structure of SER module API contains a new attribute called
-       rpc_methods:
+       the SIP server module interface SER_MOD_INTERFACE (specific for SER
+       flavour). For this purpose, the module_exports structure of SIP
+       server module API contains a new attribute called rpc_methods:
 struct module_exports {
     char* name;                 /* null terminated module name */
     cmd_export_t* cmds;         /* null terminated array of the exported command
@@ -163,7 +166,7 @@ parameters */
 
     init_function init_f;         /* Initialization function */
     response_function response_f; /* function used for responses */
-    destroy_function destroy_f;   /* function called upon SER shutdown */
+    destroy_function destroy_f;   /* function called upon shutdown */
     onbreak_function onbreak_f;
     child_init_function init_child_f;  /* function called by all processes after
  the fork */
@@ -171,10 +174,10 @@ parameters */
        rpc_methods is a pointer to an array of rpc_export_t structures.
        The last element of the array is a bumper containing zeroes in all
        the attributes of the structure. The following program listing
-       shows the exported RPC functions of the usrloc module, using the
-       rpc_export_t array ul_rpc defined above, in the
+       shows the exported RPC functions of the modules_s/usrloc module,
+       using the rpc_export_t array ul_rpc defined above, in the
        rpc_register_array() example:
-       Example 2.
+       Example 2. usrloc Module Exports Declaration
 struct module_exports exports = {
     "usrloc",
     cmds,      /* Exported functions */
@@ -187,15 +190,15 @@ struct module_exports exports = {
     child_init /* Child initialization function */ };
 
 Note
-       This mode works only with modules using the SER module interface.
-       It does not work for kamailio modules and it will probably not work
-       for future sip-router modules. It is safer and recommended to use
-       instead the rpc_register_array() function.
+       This mode works only with modules using the SER flavour module
+       interface. It does not work for kamailio modules and it will
+       probably not work for future sip-router modules. It is safer and
+       recommended to use instead the rpc_register_array() function.
 
    By convention the name of every exported function consists of two parts
-   delimited by a dot. The first part is the name of the module or SER
-   subsystem this function belongs to. The second part is the name of the
-   function.
+   delimited by a dot. The first part is the name of the module or SIP
+   server subsystem this function belongs to. The second part is the name
+   of the function.
 
 1.2.2. Data Types
 
@@ -311,17 +314,17 @@ Warning
    used and the error is lack of more parameters).
 
    The prototype of the function is:
-int scan(char* fmt, ...)
+int scan((void* ctx, char* fmt, ...)
 
    It is possible to either call the function once to scan all the
    parameters:
-rpc->scan("sdf", &string_val, &int_val, &double_val);
+rpc->scan(ctx, "sdf", &string_val, &int_val, &double_val);
 
    Or you can call the same function several times and it will continue
    where it left off previously:
-rpc->scan("s", &string_val);
-rpc->scan("d", &int_val);
-rpc->scan("f", &double_val);
+rpc->scan(ctx, "s", &string_val);
+rpc->scan(ctx, "d", &int_val);
+rpc->scan(ctx, "f", &double_val);
 
 1.2.3.2. struct_scan
 
@@ -334,7 +337,7 @@ Note
    (e.g.: ctl / binrpc). Consider using the normal scan instead.
 
    When retrieving a structure parameter from the parameter set:
-rpc->scan("{", &handle);
+rpc->scan(ctx, "{", &handle);
 
    The corresponding variable (named handle in the example above) will
    contain the index of the structure parameter within the parameter set,
@@ -352,8 +355,10 @@ rpc->struct_scan(handle, "sd", "str_attr", &str_val, "int_attr", &int_val);
    the scan function). The function also indicates an error if a requested
    attribute is missing in the structure.
 
+1.2.3.3. Retrieving Parameters Example
+
    Example 3. Retrieving Parameters
-static void rpc_delete_contact(rpc_t* rpc)
+static void rpc_delete_contact(rpc_t* rpc, void* ctx)
 {
     str aor, contact;
     char* table;
@@ -361,7 +366,7 @@ static void rpc_delete_contact(rpc_t* rpc)
     int   expires;
     double q;
 
-    if (rpc->scan("sS{", &table, &aor, &handle) < 0) {
+    if (rpc->scan(ctx, "sS{", &table, &aor, &handle) < 0) {
         /* Reply is set automatically by scan upon failure,
          * no need to do anything here
          */
@@ -417,7 +422,7 @@ static void core_echo(rpc_t* rpc, void* c)
    the reply-related functions described in this section.
 
    Example 4. Sending default reply
-static void rpc_dummy(rpc_t* rpc)
+static void rpc_dummy(rpc_t* rpc, void *ctx)
 {
   /* 200 OK with no data will be returned */
 }
@@ -428,41 +433,41 @@ static void rpc_dummy(rpc_t* rpc)
    the server to the caller. The function accepts two parameters. The
    first parameter is the status code and the second parameter is the
    reason phrase.
-static void rpc_my_function(rpc_t* rpc)
+static void rpc_my_function(rpc_t* rpc, void *ctx)
 {
-    rpc->fault(600, "Not Yet Implemented");
+    rpc->fault(ctx, 600, "Not Yet Implemented");
 }
 
    If your function first creates some result using add, or printf
    functions then all the data will be lost once you call fault function.
    Failure replies must not contain any data:
-static void rpc_my_function(rpc_t* rpc)
+static void rpc_my_function(rpc_t* rpc, void *ctx)
 {
-    rpc->add("s", "result1");
-    rpc->add("d", variable);
+    rpc->add(ctx, "s", "result1");
+    rpc->add(ctx, "d", variable);
 
     /* Reply created by previous functions will be
      * deleted and a failure reply 600 Not Yet Implemented
      * will be created instead
      */
-    rpc->fault(600, "Not Yet Implemented");
+    rpc->fault(ctx, 600, "Not Yet Implemented");
 
     /* You can also add data here, but that will have no
      * effect
      */
-    rpc->add("s", "result2");
+    rpc->add(ctx, "s", "result2");
 }
 
    Similarly you can also call add or printf functions after calling
    fault, in this case they will have no effect:
-static void rpc_my_function(rpc_t* rpc)
+static void rpc_my_function(rpc_t* rpc, void *ctx)
 {
-    rpc->fault(600, "Not Yet Implemented");
+    rpc->fault(ctx, 600, "Not Yet Implemented");
 
     /* You can also add data here, but that will have no
      * effect and only 600 Not Yet Implemented will be returned
      */
-    rpc->add("s", "result2");
+    rpc->add(ctx, "s", "result2");
 }
 
 1.2.4.2. send
@@ -475,12 +480,12 @@ static void rpc_my_function(rpc_t* rpc)
    the reply has been sent.
 
    Example 5. Kill the server
-static void core_kill(rpc_t* rpc)
+static void core_kill(rpc_t* rpc, void *ctx)
 {
     int sig_no;
 
-    if (rpc->scan("d", &sig_no) < 0) return;
-    rpc->send();     /* First send a reply */
+    if (rpc->scan(ctx, "d", &sig_no) < 0) return;
+    rpc->send(ctx, );     /* First send a reply */
     kill(0, sig_no); /* Then kill the server */
 }
 
@@ -490,15 +495,15 @@ static void core_kill(rpc_t* rpc)
    parameters and use are analogical to scan function described in
    Section 1.2.3.1, "scan". The first parameter of the function is the
    formatting string that determines the types of additional parameters:
-static void rpc_func(rpc_t* rpc)
+static void rpc_func(rpc_t* rpc, void *ctx)
 {
     str str_result;
     int int_result;
     void *handle;
     double float_result;
 
-    if (rpc->add("Sdf{", &str_result, int_result, float_result, &handle) < 0) re
-turn;
+    if (rpc->add(ctx, "Sdf{", &str_result, int_result, float_result, &handle) <
+0) return;
 }
 
    Naturally you can call this function several times, adding only one
@@ -523,8 +528,8 @@ turn;
    printf is a convenience function. The function adds data of type string
    to the result set. The first parameter of the function is again a
    formatting string, but this time it is printf-like formatting string:
-if (rpc->printf("Unable to delete %d entries from table %s", num_entries, table_
-name) < 0) return;
+if (rpc->printf(ctx, "Unable to delete %d entries from table %s", num_entries, t
+able_name) < 0) return;
 
    The return value of the function is the same as of add function.
 
@@ -539,12 +544,12 @@ name) < 0) return;
    second parameter is the value of the attribute. If a parameter with
    such a name already exist in the structure then it will be overwritten
    with the new value.
-static void rpc_func(rpc_t* rpc)
+static void rpc_func(rpc_t* rpc, void *ctx)
 {
     void *handle;
 
         /* Create empty structure and obtain its handle */
-    if (rpc->add("{", &handle) < 0) return;
+    if (rpc->add(ctx, "{", &handle) < 0) return;
         /* Fill-in the structure */
     if (rpc->struct_add(handle, "sd", "attr1", str_val,
                                       "attr2", int_val ) < 0)
@@ -560,7 +565,7 @@ static void rpc_func(rpc_t* rpc)
    the API together:
 
    Example 6. Real World Example RPC Function
-static void rpc_register(rpc_t* rpc)
+static void rpc_register(rpc_t* rpc, void *ctx)
 {
     char* domain;
     str aor;
@@ -568,7 +573,7 @@ static void rpc_register(rpc_t* rpc)
     void *handle;
 
         /* Extract the domain, address of record from the request */
-    if (rpc->scan("sS{", &domain, &aor, &handle) < 0) return;
+    if (rpc->scan(ctx, "sS{", &domain, &aor, &handle) < 0) return;
         /* Extract the structure describing the contact to be processed */
     if (rpc->struct_scan(handle, "Sdf", "Contact", &contact.c,
                                         "Expires", &contact.expires,
@@ -579,12 +584,12 @@ static void rpc_register(rpc_t* rpc)
 cessing */
     if (process_contact(domain, &aor, &new_contact, &contact) < 0) {
            /* Processing failed, indicate the failure to the caller */
-        rpc->fault(500, "Error While Processing Contact");
+        rpc->fault(ctx, 500, "Error While Processing Contact");
         return;
     }
 
         /* Return the domain and the address of record */
-    rpc->add("sS{", &domain, &aor, &handle) < 0) return;
+    rpc->add(ctx, "sS{", &domain, &aor, &handle) < 0) return;
         /* And also add the new values for contact, q, and expires parameters */
     rpc->struct_add(handle, "Sdf", "Contact", &new_contact.c,
                                    "Expires", &new_contact.expires,
index 295413b..2aca3fd 100644 (file)
@@ -5,7 +5,7 @@
         "xmlns:xi CDATA #FIXED 'http://www.w3.org/2001/XInclude'">]
 >
 
-<section id="ser_rpc" xmlns:xi="http://www.w3.org/2001/XInclude">
+<section id="rpc.main" xmlns:xi="http://www.w3.org/2001/XInclude">
     <!--
     <sectioninfo>
         <releaseinfo role="cvs">$Revision$</releaseinfo>
     -->
  
     <title>
-       SER Management Interface
+       RPC Control Interface
     </title>
 
        <section id="rpc.overview">
        <title>Overview of Operation</title>
        <para>
-               The RPC (Remote Procedure Call) interface of SER is an interface for
+               The RPC (Remote Procedure Call) interface is an interface for
                communicating with external applications. Using it an external
                application can call a function or procedure that will be executed
-               inside SER. Function parameters are supported as well as returning
-               multiple values as results.
+               inside SIP Server (SER or Kamailio). Function parameters are
+               supported as well as returning multiple values as results.
        </para>
        <para>
-               By itself SER RPC consists of two APIs, one for defining RPC functions
+               By itself RPC consists of two APIs, one for defining RPC functions
                in a transport independent way (called the rpc module api) and one
                for implementing RPC transports.
        </para>
@@ -49,7 +49,7 @@
                 refer to their documentation.
        </para>
        <para>
-               When writing a SER RPC procedure or function, one needs only use the
+               When writing a RPC procedure or function, one needs only use the
                RPC API and it will work automatically with all the transports and
                encodings. One needs only to load the desired RPC transport module
                (e.g. xmlrpc).
     <section id="rpc.module_api">
        <title>Module API</title>
        <para>
-           Each SER module can export RPC functions just like it can export
-           parameters and functions to be called from the script. Whenever SER
+           Each module can export RPC functions just like it can export
+           parameters and functions to be called from the script. Whenever SIP server
            receives an RPC request, it will search through the list of
            exported RPC functions and the function with matching name will be
            executed. A couple of essential RPC functions are also embedded into
-           the SER core.
+           the SIP server core.
        </para>
        <para>
            This section gives a detailed overview of the whole RPC API. <xref
                RPC functions are standard C functions with the following
                prototype:
                <programlisting>
-typedef void (*rpc_function_t)(rpc_t* rpc);
+typedef void (*rpc_function_t)(rpc_t* rpc, void* ctx);
                </programlisting>
-               RPC functions take one parameter, this parameter is a pointer
-               to rpc_t structure and is called RPC context. The context
+               RPC functions take two parameters, first parameter is a pointer
+               to rpc_t structure and the context. The rpc_t structure
                contains references to all API functions available to the RPC
                function as well as all data necessary to create the
                response. RPC functions do not return any value, instead the
@@ -129,7 +129,7 @@ typedef void (*rpc_function_t)(rpc_t* rpc);
            </para>
            <para>
                Each module containing RPC functions has to export all the
-               RPC functions to SER core in order to make them visible to the RPC
+               RPC functions to SIP server core in order to make them visible to the RPC
                transport modules.
                The export process involves a <emphasis>rpc_export_t</emphasis> 
                structure (either by itself or in an array):
@@ -150,7 +150,7 @@ typedef struct rpc_export {
                use and is currently unused.
            </para>
                <para>
-               There are several ways of exporting the RPC functions to the SER core:
+               There are several ways of exporting the RPC functions to the SIP server core:
                <itemizedlist>
                        <listitem><para>
                                register a null terminated array of rpc_export_t structures
@@ -160,7 +160,7 @@ typedef struct rpc_export {
                                method for all the new modules.
                                <example><title>usrloc RPC Exports Declaration</title>
                                        <para>
-                                       The <varname>rpc_export_t</varname> array for the usrloc
+                                       The <varname>rpc_export_t</varname> array for the modules_s/usrloc
                                        module looks like:
                                        </para>
                                        <programlisting>
@@ -196,9 +196,10 @@ rpc_export_t ul_rpc[] = {
                        </para></listitem>
                        <listitem><para>
                                register a null terminated array of rpc_export_t structures
-                               using the SER module interface.
+                               using the SIP server module interface SER_MOD_INTERFACE (specific
+                               for SER flavour).
                                For this purpose, the
-                               <varname>module_exports</varname> structure of SER module API
+                               <varname>module_exports</varname> structure of SIP server module API
                                contains a new attribute called <varname>rpc_methods</varname>:
                                <programlisting>
 struct module_exports {
@@ -209,7 +210,7 @@ struct module_exports {
     
     init_function init_f;         /* Initialization function */
     response_function response_f; /* function used for responses */
-    destroy_function destroy_f;   /* function called upon SER shutdown */
+    destroy_function destroy_f;   /* function called upon shutdown */
     onbreak_function onbreak_f;
     child_init_function init_child_f;  /* function called by all processes after the fork */
 };
@@ -218,7 +219,7 @@ struct module_exports {
                                rpc_export_t structures. The last element of the array is a
                                bumper containing zeroes in all the attributes of the
                                structure. The following program listing shows the exported RPC
-                               functions of the usrloc module, using the rpc_export_t array
+                               functions of the modules_s/usrloc module, using the rpc_export_t array
                                <emphasis>ul_rpc</emphasis> defined above, in the 
                                rpc_register_array() example:
                                <example><title>usrloc Module Exports Declaration</title>
@@ -237,7 +238,7 @@ struct module_exports exports = {
                                        </programlisting>
                                </example>
                                <note><para>
-                                       This mode works only with modules using the SER module
+                                       This mode works only with modules using the SER flavour module
                                        interface. It does not work for kamailio modules and it
                                        will probably not work for future sip-router modules. It is
                                        safer and recommended to use instead the
@@ -249,7 +250,7 @@ struct module_exports exports = {
                <para>
                        By convention the name of every exported function consists of
                        two parts delimited by a dot. The first part is the name of the
-                       module or SER subsystem this function belongs to. The second
+                       module or SIP server subsystem this function belongs to. The second
                        part is the name of the function.
                </para>
        </section>
@@ -453,19 +454,19 @@ add("sd", string_param, int_param);
                <para>
                        The prototype of the function is:
                    <programlisting>
-int scan(char* fmt, ...)
+int scan((void* ctx, char* fmt, ...)
                    </programlisting>
                    It is possible to either call the function once to scan all
                    the parameters:
                    <programlisting>
-rpc->scan("sdf", &amp;string_val, &amp;int_val, &amp;double_val);
+rpc->scan(ctx, "sdf", &amp;string_val, &amp;int_val, &amp;double_val);
                    </programlisting>
                    Or you can call the same function several times and it will
                    continue where it left off previously:
                    <programlisting>
-rpc->scan("s", &amp;string_val);
-rpc->scan("d", &amp;int_val);
-rpc->scan("f", &amp;double_val);
+rpc->scan(ctx, "s", &amp;string_val);
+rpc->scan(ctx, "d", &amp;int_val);
+rpc->scan(ctx, "f", &amp;double_val);
                    </programlisting>
                </para>
                <para>
@@ -485,7 +486,7 @@ rpc->scan("f", &amp;double_val);
                        When retrieving a structure parameter from the
                        parameter set:
                    <programlisting>
-rpc->scan("{", &amp;handle);
+rpc->scan(ctx, "{", &amp;handle);
                    </programlisting>
                    The corresponding variable (named 
                    <varname>handle</varname> in the example above) will contain
@@ -515,7 +516,7 @@ rpc->struct_scan(handle, "sd", "str_attr", &amp;str_val, "int_attr", &amp;int_va
                <title>Retrieving Parameters</title>
                <programlisting>
 <![CDATA[
-static void rpc_delete_contact(rpc_t* rpc)
+static void rpc_delete_contact(rpc_t* rpc, void* ctx)
 {
     str aor, contact;
     char* table;
@@ -523,7 +524,7 @@ static void rpc_delete_contact(rpc_t* rpc)
     int   expires;
     double q;
 
-    if (rpc->scan("sS{", &table, &aor, &handle) < 0) {
+    if (rpc->scan(ctx, "sS{", &table, &aor, &handle) < 0) {
         /* Reply is set automatically by scan upon failure,
          * no need to do anything here
          */
@@ -592,7 +593,7 @@ static void core_echo(rpc_t* rpc, void* c)
                    <title>Sending default reply</title>
                    <programlisting>
 <![CDATA[
-static void rpc_dummy(rpc_t* rpc)
+static void rpc_dummy(rpc_t* rpc, void *ctx)
 {
   /* 200 OK with no data will be returned */
 }
@@ -609,9 +610,9 @@ static void rpc_dummy(rpc_t* rpc)
                    status code and the second parameter is the reason phrase.
                    <programlisting>
 <![CDATA[
-static void rpc_my_function(rpc_t* rpc)
+static void rpc_my_function(rpc_t* rpc, void *ctx)
 {
-    rpc->fault(600, "Not Yet Implemented");
+    rpc->fault(ctx, 600, "Not Yet Implemented");
 }
 ]]>
                    </programlisting>
@@ -622,21 +623,21 @@ static void rpc_my_function(rpc_t* rpc)
                    not contain any data:
                    <programlisting>
 <![CDATA[
-static void rpc_my_function(rpc_t* rpc)
+static void rpc_my_function(rpc_t* rpc, void *ctx)
 {
-    rpc->add("s", "result1");
-    rpc->add("d", variable);
+    rpc->add(ctx, "s", "result1");
+    rpc->add(ctx, "d", variable);
 
     /* Reply created by previous functions will be
      * deleted and a failure reply 600 Not Yet Implemented
      * will be created instead
      */
-    rpc->fault(600, "Not Yet Implemented");
+    rpc->fault(ctx, 600, "Not Yet Implemented");
 
     /* You can also add data here, but that will have no
      * effect
      */
-    rpc->add("s", "result2");
+    rpc->add(ctx, "s", "result2");
 }
 ]]>
                    </programlisting>
@@ -646,14 +647,14 @@ static void rpc_my_function(rpc_t* rpc)
                    effect:
                    <programlisting>
 <![CDATA[
-static void rpc_my_function(rpc_t* rpc)
+static void rpc_my_function(rpc_t* rpc, void *ctx)
 {
-    rpc->fault(600, "Not Yet Implemented");
+    rpc->fault(ctx, 600, "Not Yet Implemented");
 
     /* You can also add data here, but that will have no
      * effect and only 600 Not Yet Implemented will be returned
      */
-    rpc->add("s", "result2");
+    rpc->add(ctx, "s", "result2");
 }
 ]]>
                    </programlisting>
@@ -675,12 +676,12 @@ static void rpc_my_function(rpc_t* rpc)
                    <title>Kill the server</title>
                    <programlisting>
 <![CDATA[
-static void core_kill(rpc_t* rpc)
+static void core_kill(rpc_t* rpc, void *ctx)
 {
     int sig_no;
 
-    if (rpc->scan("d", &sig_no) < 0) return;
-    rpc->send();     /* First send a reply */
+    if (rpc->scan(ctx, "d", &sig_no) < 0) return;
+    rpc->send(ctx, );     /* First send a reply */
     kill(0, sig_no); /* Then kill the server */
 }
 ]]>
@@ -699,14 +700,14 @@ static void core_kill(rpc_t* rpc)
                    determines the types of additional parameters:
                    <programlisting>
 <![CDATA[
-static void rpc_func(rpc_t* rpc)
+static void rpc_func(rpc_t* rpc, void *ctx)
 {
     str str_result;
     int int_result;
     void *handle;
     double float_result;
 
-    if (rpc->add("Sdf{", &str_result, int_result, float_result, &handle) < 0) return;
+    if (rpc->add(ctx, "Sdf{", &str_result, int_result, float_result, &handle) < 0) return;
 }
 ]]>
                    </programlisting>
@@ -745,7 +746,7 @@ static void rpc_func(rpc_t* rpc)
                    string, but this time it is <function>printf</function>-like formatting string:
                    <programlisting>
 <![CDATA[
-if (rpc->printf("Unable to delete %d entries from table %s", num_entries, table_name) < 0) return;
+if (rpc->printf(ctx, "Unable to delete %d entries from table %s", num_entries, table_name) < 0) return;
 ]]>
                    </programlisting>
                    The return value of the function is the same as of
@@ -769,12 +770,12 @@ if (rpc->printf("Unable to delete %d entries from table %s", num_entries, table_
                    new value.
                    <programlisting>
 <![CDATA[
-static void rpc_func(rpc_t* rpc)
+static void rpc_func(rpc_t* rpc, void *ctx)
 {
     void *handle;
 
         /* Create empty structure and obtain its handle */
-    if (rpc->add("{", &handle) < 0) return;
+    if (rpc->add(ctx, "{", &handle) < 0) return;
         /* Fill-in the structure */
     if (rpc->struct_add(handle, "sd", "attr1", str_val,
                                       "attr2", int_val ) < 0)
@@ -798,7 +799,7 @@ static void rpc_func(rpc_t* rpc)
                <title>Real World Example RPC Function</title>
                <programlisting>
 <![CDATA[
-static void rpc_register(rpc_t* rpc)
+static void rpc_register(rpc_t* rpc, void *ctx)
 {
     char* domain;
     str aor;
@@ -806,7 +807,7 @@ static void rpc_register(rpc_t* rpc)
     void *handle;
 
         /* Extract the domain, address of record from the request */
-    if (rpc->scan("sS{", &domain, &aor, &handle) < 0) return;
+    if (rpc->scan(ctx, "sS{", &domain, &aor, &handle) < 0) return;
         /* Extract the structure describing the contact to be processed */
     if (rpc->struct_scan(handle, "Sdf", "Contact", &contact.c,
                                         "Expires", &contact.expires,
@@ -816,12 +817,12 @@ static void rpc_register(rpc_t* rpc)
         /* Process the contact, new_contact will contain updated value after processing */
     if (process_contact(domain, &aor, &new_contact, &contact) < 0) {
            /* Processing failed, indicate the failure to the caller */
-        rpc->fault(500, "Error While Processing Contact");
+        rpc->fault(ctx, 500, "Error While Processing Contact");
         return;
     }
 
         /* Return the domain and the address of record */
-    rpc->add("sS{", &domain, &aor, &handle) < 0) return;
+    rpc->add(ctx, "sS{", &domain, &aor, &handle) < 0) return;
         /* And also add the new values for contact, q, and expires parameters */
     rpc->struct_add(handle, "Sdf", "Contact", &new_contact.c,
                                    "Expires", &new_contact.expires,
index 927903e..4c2f9e0 100644 (file)
@@ -17,35 +17,40 @@ docbook_output_dir=docbook
 #   make diff-list   (which obeys grp_exclude and file_exclude)
 # or completely regenerated by replacing files_list with the output of:
 #   make gen-files-list
+# NOTE: suffix duplicated modules located in modules_s with '_s' to
+# avoid file naming conflicts
+#
 files_list= \
-       $(COREPATH)/core_cmd.c:core \
-       $(COREPATH)/modules/cfg_rpc/cfg_rpc.c:cfg_rpc \
-       $(COREPATH)/modules/counters/counters.c:counters \
-       $(COREPATH)/modules/ctl/ctl.c:ctl \
-       $(COREPATH)/modules/db_flatstore/flat_rpc.c:db_flatstore \
-       $(COREPATH)/modules/debugger/debugger_api.c:debugger \
-       $(COREPATH)/modules/lcr/lcr_rpc.c:lcr \
-       $(COREPATH)/modules/malloc_test/malloc_test.c:malloc_test \
-       $(COREPATH)/modules/mi_rpc/mi_rpc_mod.c:mi_rpc \
-       $(COREPATH)/modules/sl/sl_stats.c:sl \
-       $(COREPATH)/modules/tls/tls_rpc.c:tls \
-       $(COREPATH)/modules/tm/tm.c:tm \
-       $(COREPATH)/modules_k/dialog/dialog.c:dialog \
-       $(COREPATH)/modules_k/htable/htable.c:htable \
-       $(COREPATH)/modules/ratelimit/ratelimit.c:ratelimit \
-       $(COREPATH)/modules_k/uac/uac_reg.c:uac \
-       $(COREPATH)/modules_k/usrloc/ul_rpc.c:usrloc_k \
-       $(COREPATH)/modules_s/cpl-c/cpl_rpc.c:cpl-c \
-       $(COREPATH)/modules_s/dispatcher/ds_rpc.c:dispatcher \
-       $(COREPATH)/modules_s/domain/domain_rpc.c:domain \
-       $(COREPATH)/modules_s/gflags/gflags.c:gflags \
-       $(COREPATH)/modules_s/pdt/pdt.c:pdt \
-       $(COREPATH)/modules_s/pike/rpc.c:pike \
-       $(COREPATH)/modules/prefix_route/pr_rpc.c:prefix_route \
-       $(COREPATH)/modules_s/presence_b2b/rpc.c:presence_b2b \
-       $(COREPATH)/modules_s/usrloc/ul_rpc.c:usrloc_s
-
-
+                       $(COREPATH)/core_cmd.c:core \
+                       $(COREPATH)/modules/cfg_rpc/cfg_rpc.c:cfg_rpc \
+                       $(COREPATH)/modules/counters/counters.c:counters \
+                       $(COREPATH)/modules/ctl/ctl.c:ctl \
+                       $(COREPATH)/modules/db_flatstore/flat_rpc.c:db_flatstore \
+                       $(COREPATH)/modules/debugger/debugger_api.c:debugger \
+                       $(COREPATH)/modules/dialplan/dialplan.c:dialplan \
+                       $(COREPATH)/modules/lcr/lcr_rpc.c:lcr \
+                       $(COREPATH)/modules/malloc_test/malloc_test.c:malloc_test \
+                       $(COREPATH)/modules/mi_rpc/mi_rpc_mod.c:mi_rpc \
+                       $(COREPATH)/modules/prefix_route/pr_rpc.c:prefix_route \
+                       $(COREPATH)/modules/ratelimit/ratelimit.c:ratelimit \
+                       $(COREPATH)/modules/sl/sl_stats.c:sl \
+                       $(COREPATH)/modules/tls/tls_rpc.c:tls \
+                       $(COREPATH)/modules/tm/tm.c:tm \
+                       $(COREPATH)/modules_k/dialog/dialog.c:dialog \
+                       $(COREPATH)/modules_k/dispatcher/dispatcher.c:dispatcher \
+                       $(COREPATH)/modules_k/domain/domain_mod.c:domain \
+                       $(COREPATH)/modules_k/htable/htable.c:htable \
+                       $(COREPATH)/modules_k/kex/pkg_stats.c:kex \
+                       $(COREPATH)/modules_k/uac/uac_reg.c:uac \
+                       $(COREPATH)/modules_k/usrloc/ul_rpc.c:usrloc \
+                       $(COREPATH)/modules_s/cpl-c/cpl_rpc.c:cpl-c \
+                       $(COREPATH)/modules_s/dispatcher/ds_rpc.c:dispatcher_s \
+                       $(COREPATH)/modules_s/domain/domain_rpc.c:domain_s \
+                       $(COREPATH)/modules_s/gflags/gflags.c:gflags \
+                       $(COREPATH)/modules_s/pdt/pdt.c:pdt \
+                       $(COREPATH)/modules_s/pike/rpc.c:pike \
+                       $(COREPATH)/modules_s/presence_b2b/rpc.c:presence_b2b \
+                       $(COREPATH)/modules_s/usrloc/ul_rpc.c:usrloc_s
 
 # list of excluded groups
 grp_exclude=pa
@@ -76,15 +81,18 @@ gcc=gcc
 #-I$(COREPATH)/lib -I$(COREPATH) -I/usr/include/libxml2
 
 # defines used by gcc
-c_defs=-D__CPU_i386 -D__OS_linux -DSER_VER=2099099 -DPKG_MALLOC -DSHM_MEM  \
+# -D__CPU_i386 -DARCH="i386"
+c_defsX= -D__CPU_x86_64 -D__OS_linux -DSER_VER=3003000 -DPKG_MALLOC -DSHM_MEM  \
+               -DVERSION='\"3.3.0-dev2\"' -DARCH='\"x86_64\"' -DOS=linux_ -DOS_QUOTED='\"linux\"' \
                -DSHM_MMAP -DDNS_IP_HACK -DUSE_IPV6 -DUSE_MCAST -DUSE_TCP \
                -DUSE_DNS_CACHE -DUSE_DNS_FAILOVER -DUSE_DST_BLACKLIST -DUSE_NAPTR \
                -DUSE_TLS -DTLS_HOOKS -DFAST_LOCK   -DCC_GCC_LIKE_ASM \
                -DHAVE_GETHOSTBYNAME2 -DHAVE_UNION_SEMUN -DHAVE_SCHED_YIELD \
                -DHAVE_MSG_NOSIGNAL -DHAVE_MSGHDR_MSG_CONTROL -DHAVE_ALLOCA_H \
                -DHAVE_SCHED_SETSCHEDULER -DHAVE_EPOLL -DUSE_SCTP -DNAME='\"ser\"' \
-               -DVERSION='\"2.99.99-pre3\"' -DARCH='\"i386\"' -DOS_QUOTED='\"linux\"'
+               -DCFG_DIR='\"/tmp/\"'
 
+c_defs=$(subst ^^,='\",$(subst ",\"',$(subst =",^^,$(shell make -s -C ../.. printcdefs))))
 
 # common makefile vars used in defs
 LOCALBASE=/usr/local
@@ -98,7 +106,7 @@ flist=$(call filter_files,$(files_list))
 
 # throws an error if input is not in the format filename:grp
 check_fname_grp=$(if $(filter-out 2,$(words $(subst :, ,$(1)))),\
-                                       $(error bad format "$(1)", it should be filename:grp))
+       $(error bad format "$(1)", it should be filename:grp))
 
 # get prereq from file:grp (get_prereq(file:grp) => file)
 get_prereq=$(firstword $(subst :, ,$(1)))
@@ -106,6 +114,11 @@ get_prereq=$(firstword $(subst :, ,$(1)))
 # get grp from file:grp (get_grp(file:grp) => grp)
 get_listed_grp=$(word 2, $(subst :, ,$(1)))
 
+# get module interface define
+get_modiface=$(word 3, $(subst :, ,$(1)))
+
+find_modiface=$(if $(findstring modules,$(1)),$(shell make -s -C $(dir $(1)) printmiface),-DNONE)
+
 # get base file name from file:grp: get_bname(file:grp) 
 # => basename(file) without extension (e.g. get_bname(foo/bar.c:x) => bar)
 # 
@@ -188,7 +201,7 @@ $(txt_output_dir)/$$(call get_target,$(1)).txt: \
                                                                $$(call get_prereq,$(1)) Makefile $(CFG2TXT)
        $(CFG2TXT) --file $$< --$(force_grp)grp=$$(call get_grp,$(1)) \
                --gcc="$(gcc)" --txt \
-               --defs="$(c_defs) $$(e_idefs_$$(call get_grp,$(1)))" \
+               --defs="$(c_defs) $$(call get_modiface,$(1)) $$(e_idefs_$$(call get_grp,$(1)))" \
                > "$$@" || (rm -f "$$@"; exit 1)
 
 $(docbook_output_dir)/$$(call get_target,$(1)).xml: \
@@ -333,6 +346,10 @@ gen-file-list gen-files-list gen_files_list:
        @$(foreach f,$(call subst_corepath,$(call sort_files,$(f_found_lst))),\
                echo "$f \\";)
 
+print-modifaces:
+       @$(foreach f,$(call sort_files,$(f_found_lst)),\
+               echo "$(call subst_corepath,$(f)):$(call find_modiface, $(f)) \\";)
+
 .PHONY: check-list
 .PHONY: update-list
 .PHONY: diff-list
index 94e1403..bf65aab 100644 (file)
@@ -8,6 +8,15 @@ RPC Exports for cfg_rpc
        </title>
 
 
+<section id="cfg.set"><title>cfg.set</title>
+<para>
+        Set the value of a configuration variable and commit the change
+        immediately
+</para>
+<para>
+</para>
+</section>
+
 <section id="cfg.set_now_int"><title>cfg.set_now_int</title>
 <para>
         Set the value of a configuration variable and commit the change
@@ -17,6 +26,15 @@ RPC Exports for cfg_rpc
 </para>
 </section>
 
+<section id="cfg.seti"><title>cfg.seti</title>
+<para>
+        Set the value of a configuration variable and commit the change
+        immediately
+</para>
+<para>
+</para>
+</section>
+
 <section id="cfg.set_now_string"><title>cfg.set_now_string</title>
 <para>
         Set the value of a configuration variable and commit the change
@@ -26,6 +44,33 @@ RPC Exports for cfg_rpc
 </para>
 </section>
 
+<section id="cfg.sets"><title>cfg.sets</title>
+<para>
+        Set the value of a configuration variable and commit the change
+        immediately
+</para>
+<para>
+</para>
+</section>
+
+<section id="cfg.del"><title>cfg.del</title>
+<para>
+        Delete the value of a configuration variable from a group
+        instance and commit the change immediately
+</para>
+<para>
+</para>
+</section>
+
+<section id="cfg.set_delayed"><title>cfg.set_delayed</title>
+<para>
+        Prepare the change of a configuration variable, but does not
+        commit the new value yet
+</para>
+<para>
+</para>
+</section>
+
 <section id="cfg.set_delayed_int"><title>cfg.set_delayed_int</title>
 <para>
         Prepare the change of a configuration variable, but does not
@@ -44,6 +89,15 @@ RPC Exports for cfg_rpc
 </para>
 </section>
 
+<section id="cfg.del_delayed"><title>cfg.del_delayed</title>
+<para>
+        Prepare the deletion of the value of a configuration variable
+        from a group instance, but does not commit the change yet
+</para>
+<para>
+</para>
+</section>
+
 <section id="cfg.commit"><title>cfg.commit</title>
 <para>
         Commit the previously prepared configuration changes
@@ -93,4 +147,20 @@ RPC Exports for cfg_rpc
 </para>
 </section>
 
+<section id="cfg.add_group_inst"><title>cfg.add_group_inst</title>
+<para>
+        Add a new instance to an existing configuration group
+</para>
+<para>
+</para>
+</section>
+
+<section id="cfg.del_group_inst"><title>cfg.del_group_inst</title>
+<para>
+        Delte an instance of a configuration group
+</para>
+<para>
+</para>
+</section>
+
 </chapter>
index 7476bbb..dd7e5be 100644 (file)
@@ -102,6 +102,14 @@ RPC Exports for core
 </para>
 </section>
 
+<section id="core.psx"><title>core.psx</title>
+<para>
+        Returns the detailed description of running SER processes.
+</para>
+<para>
+</para>
+</section>
+
 <section id="core.pwd"><title>core.pwd</title>
 <para>
         Returns the working directory of SER server.
index 5f1244f..013ae62 100644 (file)
@@ -10,7 +10,7 @@ RPC Exports for db_flatstore
 
 <section id="flatstore.rotate"><title>flatstore.rotate</title>
 <para>
-        Close and reopen flatrotate files during log rotation.
+        Documentation missing (flat_rotate_doc).
 </para>
 <para>
 </para>
index 4735e0a..893691f 100644 (file)
@@ -10,7 +10,7 @@ RPC Exports for debugger
 
 <section id="dbg.bp"><title>dbg.bp</title>
 <para>
-        Breakpoint command
+        Documentation missing (dbg_rpc_bp_doc).
 </para>
 <para>
 </para>
diff --git a/doc/rpc_list/docbook/rpc_dialplan.xml b/doc/rpc_list/docbook/rpc_dialplan.xml
new file mode 100644 (file)
index 0000000..72eae46
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- this file is autogenerated, do not edit! -->
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+       "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<chapter id="rpc_exports.dialplan">
+       <title>
+RPC Exports for dialplan
+       </title>
+
+
+<section id="dialplan.reload"><title>dialplan.reload</title>
+<para>
+        Reload dialplan table from database
+</para>
+<para>
+</para>
+</section>
+
+<section id="dialplan.dump"><title>dialplan.dump</title>
+<para>
+        Perform dialplan translation
+</para>
+<para>
+</para>
+</section>
+
+</chapter>
index 963c74c..7f80d15 100644 (file)
@@ -8,17 +8,25 @@ RPC Exports for dispatcher
        </title>
 
 
-<section id="dispatcher.dump"><title>dispatcher.dump</title>
+<section id="dispatcher.reload"><title>dispatcher.reload</title>
 <para>
-        Dump dispatcher set configuration
+        Reload dispatcher destination sets
 </para>
 <para>
 </para>
 </section>
 
-<section id="dispatcher.reload"><title>dispatcher.reload</title>
+<section id="dispatcher.list"><title>dispatcher.list</title>
+<para>
+        Return the content of dispatcher sets
+</para>
+<para>
+</para>
+</section>
+
+<section id="dispatcher.set_state"><title>dispatcher.set_state</title>
 <para>
-        Reload dispatcher list from file
+        Set the state of a destination address
 </para>
 <para>
 </para>
diff --git a/doc/rpc_list/docbook/rpc_dispatcher_s.xml b/doc/rpc_list/docbook/rpc_dispatcher_s.xml
new file mode 100644 (file)
index 0000000..7a86537
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- this file is autogenerated, do not edit! -->
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+       "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<chapter id="rpc_exports.dispatcher_s">
+       <title>
+RPC Exports for dispatcher_s
+       </title>
+
+
+<section id="dispatcher.dump"><title>dispatcher.dump</title>
+<para>
+        Dump dispatcher set configuration
+</para>
+<para>
+</para>
+</section>
+
+<section id="dispatcher.reload"><title>dispatcher.reload</title>
+<para>
+        Reload dispatcher list from file
+</para>
+<para>
+</para>
+</section>
+
+</chapter>
diff --git a/doc/rpc_list/docbook/rpc_domain_s.xml b/doc/rpc_list/docbook/rpc_domain_s.xml
new file mode 100644 (file)
index 0000000..171c0c6
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- this file is autogenerated, do not edit! -->
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+       "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<chapter id="rpc_exports.domain_s">
+       <title>
+RPC Exports for domain_s
+       </title>
+
+
+<section id="domain.reload"><title>domain.reload</title>
+<para>
+        Reload domain table from database
+</para>
+<para>
+</para>
+</section>
+
+<section id="domain.dump"><title>domain.dump</title>
+<para>
+        Return the contents of domain table
+</para>
+<para>
+</para>
+</section>
+
+</chapter>
diff --git a/doc/rpc_list/docbook/rpc_kex.xml b/doc/rpc_list/docbook/rpc_kex.xml
new file mode 100644 (file)
index 0000000..070f037
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- this file is autogenerated, do not edit! -->
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+       "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<chapter id="rpc_exports.kex">
+       <title>
+RPC Exports for kex
+       </title>
+
+
+<section id="pkg.stats"><title>pkg.stats</title>
+<para>
+        Private memory (pkg) statistics per process
+</para>
+<para>
+</para>
+</section>
+
+</chapter>
index 5ffe84d..4d031e4 100644 (file)
@@ -8,8 +8,8 @@
 <book id="rpc_list" xmlns:xi="http://www.w3.org/2001/XInclude">
        <title>RPC Exports List</title>
        <bookinfo><revhistory><revision>
-               <revnumber>sip-router git-7e5450</revnumber>
-               <date>Mon, 04 Oct 2010 22:52:57 +0200</date>
+               <revnumber>sip-router git-0ea931</revnumber>
+               <date>Fri, 25 Nov 2011 23:59:50 +0100</date>
                <revremark>
                        Automatically generated by:
                        make -C doc/rpc_list all
                <xi:include href="rpc_ctl.xml"/>
                <xi:include href="rpc_db_flatstore.xml"/>
                <xi:include href="rpc_debugger.xml"/>
+               <xi:include href="rpc_dialplan.xml"/>
                <xi:include href="rpc_lcr.xml"/>
                <xi:include href="rpc_malloc_test.xml"/>
                <xi:include href="rpc_mi_rpc.xml"/>
+               <xi:include href="rpc_prefix_route.xml"/>
+               <xi:include href="rpc_ratelimit.xml"/>
                <xi:include href="rpc_sl.xml"/>
                <xi:include href="rpc_tls.xml"/>
                <xi:include href="rpc_tm.xml"/>
                <xi:include href="rpc_dialog.xml"/>
+               <xi:include href="rpc_dispatcher.xml"/>
+               <xi:include href="rpc_domain.xml"/>
                <xi:include href="rpc_htable.xml"/>
-               <xi:include href="rpc_ratelimit.xml"/>
+               <xi:include href="rpc_kex.xml"/>
                <xi:include href="rpc_uac.xml"/>
-               <xi:include href="rpc_usrloc_k.xml"/>
+               <xi:include href="rpc_usrloc.xml"/>
                <xi:include href="rpc_cpl-c.xml"/>
-               <xi:include href="rpc_dispatcher.xml"/>
-               <xi:include href="rpc_domain.xml"/>
+               <xi:include href="rpc_dispatcher_s.xml"/>
+               <xi:include href="rpc_domain_s.xml"/>
                <xi:include href="rpc_gflags.xml"/>
                <xi:include href="rpc_pdt.xml"/>
                <xi:include href="rpc_pike.xml"/>
-               <xi:include href="rpc_prefix_route.xml"/>
                <xi:include href="rpc_presence_b2b.xml"/>
                <xi:include href="rpc_usrloc_s.xml"/>
 </book>
index e3b45c6..83efa27 100644 (file)
@@ -10,7 +10,7 @@ RPC Exports for prefix_route
 
 <section id="prefix_route.reload"><title>prefix_route.reload</title>
 <para>
-        Reload prefix routes from DB
+        Documentation missing (rpc_reload_doc).
 </para>
 <para>
 </para>
@@ -18,7 +18,7 @@ RPC Exports for prefix_route
 
 <section id="prefix_route.dump"><title>prefix_route.dump</title>
 <para>
-        Dump the prefix route tree
+        Documentation missing (rpc_dump_doc).
 </para>
 <para>
 </para>
index cd1fdbc..a352b75 100644 (file)
@@ -10,7 +10,7 @@ RPC Exports for sl
 
 <section id="sl.stats"><title>sl.stats</title>
 <para>
-        Print reply statistics.
+        Documentation missing (rpc_stats_doc).
 </para>
 <para>
 </para>
index 57cede2..a730de8 100644 (file)
@@ -10,7 +10,7 @@ RPC Exports for tls
 
 <section id="tls.reload"><title>tls.reload</title>
 <para>
-        Reload TLS configuration file
+        Documentation missing (tls_reload_doc).
 </para>
 <para>
 </para>
@@ -18,7 +18,7 @@ RPC Exports for tls
 
 <section id="tls.list"><title>tls.list</title>
 <para>
-        List currently open TLS connections
+        Documentation missing (tls_list_doc).
 </para>
 <para>
         Returns an array.
@@ -27,7 +27,7 @@ RPC Exports for tls
 
 <section id="tls.info"><title>tls.info</title>
 <para>
-        Returns internal tls related info.
+        Documentation missing (tls_info_doc).
 </para>
 <para>
 </para>
@@ -35,7 +35,7 @@ RPC Exports for tls
 
 <section id="tls.options"><title>tls.options</title>
 <para>
-        Dumps all the tls config options.
+        Documentation missing (tls_options_doc).
 </para>
 <para>
 </para>
index 6b59300..9147b1f 100644 (file)
@@ -10,7 +10,7 @@ RPC Exports for tm
 
 <section id="tm.cancel"><title>tm.cancel</title>
 <para>
-        Cancel a pending transaction
+        Documentation missing (rpc_cancel_doc).
 </para>
 <para>
 </para>
@@ -18,7 +18,7 @@ RPC Exports for tm
 
 <section id="tm.reply"><title>tm.reply</title>
 <para>
-        Reply transaction
+        Documentation missing (rpc_reply_doc).
 </para>
 <para>
 </para>
@@ -26,7 +26,7 @@ RPC Exports for tm
 
 <section id="tm.stats"><title>tm.stats</title>
 <para>
-        Print transaction statistics.
+        Documentation missing (tm_rpc_stats_doc).
 </para>
 <para>
 </para>
@@ -34,8 +34,7 @@ RPC Exports for tm
 
 <section id="tm.hash_stats"><title>tm.hash_stats</title>
 <para>
-        Prints hash table statistics (can be used only if tm is
-        compiled with -DTM_HASH_STATS).
+        Documentation missing (tm_rpc_hash_stats_doc).
 </para>
 <para>
 </para>
@@ -43,9 +42,7 @@ RPC Exports for tm
 
 <section id="tm.t_uac_start"><title>tm.t_uac_start</title>
 <para>
-        starts a tm uac using  a list of string parameters: method,
-        ruri, dst_uri, send_sock, headers (CRLF separated) and body
-        (optional)
+        Documentation missing (rpc_t_uac_start_doc).
 </para>
 <para>
 </para>
@@ -53,9 +50,7 @@ RPC Exports for tm
 
 <section id="tm.t_uac_wait"><title>tm.t_uac_wait</title>
 <para>
-        starts a tm uac and waits for the final reply, using a list of
-        string parameters: method, ruri, dst_uri send_sock, headers
-        (CRLF separated) and body (optional)
+        Documentation missing (rpc_t_uac_wait_doc).
 </para>
 <para>
         Returns an array.
diff --git a/doc/rpc_list/docbook/rpc_usrloc.xml b/doc/rpc_list/docbook/rpc_usrloc.xml
new file mode 100644 (file)
index 0000000..1661978
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- this file is autogenerated, do not edit! -->
+<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
+       "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">
+<chapter id="rpc_exports.usrloc">
+       <title>
+RPC Exports for usrloc
+       </title>
+
+
+<section id="ul.dump"><title>ul.dump</title>
+<para>
+        Dump user location tables
+</para>
+<para>
+</para>
+</section>
+
+</chapter>
index 22323d2..adb2f15 100644 (file)
@@ -10,7 +10,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.stats"><title>usrloc.stats</title>
 <para>
-        Print usrloc statistics
+        Documentation missing (rpc_stats_doc).
 </para>
 <para>
         Returns an array.
@@ -19,7 +19,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.delete_uid"><title>usrloc.delete_uid</title>
 <para>
-        Delete all registered contacts for address of record.
+        Documentation missing (rpc_delete_uid_doc).
 </para>
 <para>
 </para>
@@ -27,7 +27,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.delete_contact"><title>usrloc.delete_contact</title>
 <para>
-        Delete a contact if it exists.
+        Documentation missing (rpc_delete_contact_doc).
 </para>
 <para>
 </para>
@@ -35,7 +35,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.dump"><title>usrloc.dump</title>
 <para>
-        Print all registered contacts.
+        Documentation missing (rpc_dump_doc).
 </para>
 <para>
 </para>
@@ -43,7 +43,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.dump_file"><title>usrloc.dump_file</title>
 <para>
-        Print all registered contacts into a file.
+        Documentation missing (rpc_dump_file_doc).
 </para>
 <para>
 </para>
@@ -51,7 +51,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.flush"><title>usrloc.flush</title>
 <para>
-        Flush cache into database.
+        Documentation missing (rpc_flush_doc).
 </para>
 <para>
 </para>
@@ -59,7 +59,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.add_contact"><title>usrloc.add_contact</title>
 <para>
-        Create a new contact.
+        Documentation missing (rpc_add_contact_doc).
 </para>
 <para>
 </para>
@@ -67,7 +67,7 @@ RPC Exports for usrloc_s
 
 <section id="usrloc.show_contacts"><title>usrloc.show_contacts</title>
 <para>
-        List all registered contacts for address of record
+        Documentation missing (rpc_show_contacts_doc).
 </para>
 <para>
         Returns an array.
index 89383a2..1296271 100644 (file)
@@ -4,38 +4,68 @@ RPC Exports for cfg_rpc
                   [ this file is autogenerated, do not edit ]
 
 
- 1. cfg.set_now_int
+ 1. cfg.set
         Set the value of a configuration variable and commit the change
         immediately
 
- 2. cfg.set_now_string
+ 2. cfg.set_now_int
         Set the value of a configuration variable and commit the change
         immediately
 
- 3. cfg.set_delayed_int
+ 3. cfg.seti
+        Set the value of a configuration variable and commit the change
+        immediately
+
+ 4. cfg.set_now_string
+        Set the value of a configuration variable and commit the change
+        immediately
+
+ 5. cfg.sets
+        Set the value of a configuration variable and commit the change
+        immediately
+
+ 6. cfg.del
+        Delete the value of a configuration variable from a group
+        instance and commit the change immediately
+
+ 7. cfg.set_delayed
+        Prepare the change of a configuration variable, but does not
+        commit the new value yet
+
+ 8. cfg.set_delayed_int
         Prepare the change of a configuration variable, but does not
         commit the new value yet
 
4. cfg.set_delayed_string
9. cfg.set_delayed_string
         Prepare the change of a configuration variable, but does not
         commit the new value yet
 
- 5. cfg.commit
+10. cfg.del_delayed
+        Prepare the deletion of the value of a configuration variable
+        from a group instance, but does not commit the change yet
+
+11. cfg.commit
         Commit the previously prepared configuration changes
 
- 6. cfg.rollback
+12. cfg.rollback
         Drop the prepared configuration changes
 
- 7. cfg.get
+13. cfg.get
         Get the value of a configuration variable
 
- 8. cfg.help
+14. cfg.help
         Print the description of a configuration variable
 
- 9. cfg.list
+15. cfg.list
         List the configuration variables
 
-10. cfg.diff
+16. cfg.diff
         List the pending configuration changes that have not been
         committed yet
 
+17. cfg.add_group_inst
+        Add a new instance to an existing configuration group
+
+18. cfg.del_group_inst
+        Delte an instance of a configuration group
+
index 479a0f4..9387896 100644 (file)
@@ -43,30 +43,33 @@ RPC Exports for core
         Returns the description of running SER processes.
         Returns an array.
 
-12. core.pwd
+12. core.psx
+        Returns the detailed description of running SER processes.
+
+13. core.pwd
         Returns the working directory of SER server.
         Returns an array.
 
-13. core.arg
+14. core.arg
         Returns the list of command line arguments used on SER startup.
         Returns an array.
 
-14. core.kill
+15. core.kill
         Sends the given signal to SER.
 
-15. core.shmmem
+16. core.shmmem
         Returns shared memory info. It has an optional parameter that
         specifies the measuring unit: b - bytes (default), k or kb, m
         or mb, g or gb. Note: when using something different from
         bytes, the value is truncated.
 
-16. core.tcp_info
+17. core.tcp_info
         Returns tcp related info.
 
-17. core.tcp_options
+18. core.tcp_options
         Returns active tcp options.
 
-18. core.sctp_options
+19. core.sctp_options
         Returns active sctp options. With one parameter it returns the
         sctp options set in the kernel for a specific
         socket(debugging), with 0 filled in for non-kernel related
@@ -74,80 +77,80 @@ RPC Exports for core
         address[:port] . With no parameters it returns ser's idea of
         the current sctp options (intended non-debugging use).
 
-19. core.sctp_info
+20. core.sctp_info
         Returns sctp related info.
 
-20. core.udp4_raw_info
+21. core.udp4_raw_info
         Returns udp4_raw related info.
 
-21. dns.mem_info
+22. dns.mem_info
         dns cache memory info.
 
-22. dns.debug
+23. dns.debug
         dns debug  info.
 
-23. dns.debug_all
+24. dns.debug_all
         complete dns debug  dump
 
-24. dns.view
+25. dns.view
         dns cache dump in a human-readable format
 
-25. dns.lookup
+26. dns.lookup
         perform a dns lookup
 
-26. dns.delete_all
+27. dns.delete_all
         deletes all the non-permanent entries from the DNS cache
 
-27. dns.delete_all_force
+28. dns.delete_all_force
         deletes all the entries from the DNS cache including the
         permanent ones
 
-28. dns.add_a
+29. dns.add_a
         adds an A record to the DNS cache
 
-29. dns.add_aaaa
+30. dns.add_aaaa
         adds an AAAA record to the DNS cache
 
-30. dns.add_srv
+31. dns.add_srv
         adds an SRV record to the DNS cache
 
-31. dns.delete_a
+32. dns.delete_a
         deletes an A record from the DNS cache
 
-32. dns.delete_aaaa
+33. dns.delete_aaaa
         deletes an AAAA record from the DNS cache
 
-33. dns.delete_srv
+34. dns.delete_srv
         deletes an SRV record from the DNS cache
 
-34. dns.delete_naptr
+35. dns.delete_naptr
         deletes a NAPTR record from the DNS cache
 
-35. dns.delete_cname
+36. dns.delete_cname
         deletes a CNAME record from the DNS cache
 
-36. dns.delete_txt
+37. dns.delete_txt
         deletes a TXT record from the DNS cache
 
-37. dns.delete_ebl
+38. dns.delete_ebl
         deletes an EBL record from the DNS cache
 
-38. dns.delete_ptr
+39. dns.delete_ptr
         deletes an PTR record from the DNS cache
 
-39. dst_blacklist.mem_info
+40. dst_blacklist.mem_info
         dst blacklist memory usage info.
 
-40. dst_blacklist.debug
+41. dst_blacklist.debug
         dst blacklist  debug  info.
 
-41. dst_blacklist.view
+42. dst_blacklist.view
         dst blacklist dump in human-readable format.
 
-42. dst_blacklist.delete_all
+43. dst_blacklist.delete_all
         Deletes all the entries from the dst blacklist except the
         permanent ones.
 
-43. dst_blacklist.add
+44. dst_blacklist.add
         Adds a new entry to the dst blacklist.
 
index 6737b37..f4b0b9c 100644 (file)
@@ -5,5 +5,5 @@ RPC Exports for db_flatstore
 
 
  1. flatstore.rotate
-        Close and reopen flatrotate files during log rotation.
+        Documentation missing (flat_rotate_doc).
 
index 56103e5..3db09a0 100644 (file)
@@ -5,7 +5,7 @@ RPC Exports for debugger
 
 
  1. dbg.bp
-        Breakpoint command
+        Documentation missing (dbg_rpc_bp_doc).
 
  2. dbg.ls
         List debugging process array
diff --git a/doc/rpc_list/rpc_dialplan.txt b/doc/rpc_list/rpc_dialplan.txt
new file mode 100644 (file)
index 0000000..47831b5
--- /dev/null
@@ -0,0 +1,12 @@
+RPC Exports for dialplan
+========================
+
+                  [ this file is autogenerated, do not edit ]
+
+
+ 1. dialplan.reload
+        Reload dialplan table from database
+
+ 2. dialplan.dump
+        Perform dialplan translation
+
index af8a4fa..87df8ab 100644 (file)
@@ -4,9 +4,12 @@ RPC Exports for dispatcher
                   [ this file is autogenerated, do not edit ]
 
 
- 1. dispatcher.dump
-        Dump dispatcher set configuration
+ 1. dispatcher.reload
+        Reload dispatcher destination sets
 
- 2. dispatcher.reload
-        Reload dispatcher list from file
+ 2. dispatcher.list
+        Return the content of dispatcher sets
+
+ 3. dispatcher.set_state
+        Set the state of a destination address
 
diff --git a/doc/rpc_list/rpc_dispatcher_s.txt b/doc/rpc_list/rpc_dispatcher_s.txt
new file mode 100644 (file)
index 0000000..45f9fcb
--- /dev/null
@@ -0,0 +1,12 @@
+RPC Exports for dispatcher_s
+============================
+
+                  [ this file is autogenerated, do not edit ]
+
+
+ 1. dispatcher.dump
+        Dump dispatcher set configuration
+
+ 2. dispatcher.reload
+        Reload dispatcher list from file
+
diff --git a/doc/rpc_list/rpc_domain_s.txt b/doc/rpc_list/rpc_domain_s.txt
new file mode 100644 (file)
index 0000000..bd547ca
--- /dev/null
@@ -0,0 +1,12 @@
+RPC Exports for domain_s
+========================
+
+                  [ this file is autogenerated, do not edit ]
+
+
+ 1. domain.reload
+        Reload domain table from database
+
+ 2. domain.dump
+        Return the contents of domain table
+
diff --git a/doc/rpc_list/rpc_kex.txt b/doc/rpc_list/rpc_kex.txt
new file mode 100644 (file)
index 0000000..1e9bbea
--- /dev/null
@@ -0,0 +1,9 @@
+RPC Exports for kex
+===================
+
+                  [ this file is autogenerated, do not edit ]
+
+
+ 1. pkg.stats
+        Private memory (pkg) statistics per process
+
index 8093294..8f51fa9 100644 (file)
@@ -5,8 +5,8 @@ RPC Exports for prefix_route
 
 
  1. prefix_route.reload
-        Reload prefix routes from DB
+        Documentation missing (rpc_reload_doc).
 
  2. prefix_route.dump
-        Dump the prefix route tree
+        Documentation missing (rpc_dump_doc).
 
index 8b46005..5e1e52c 100644 (file)
@@ -5,5 +5,5 @@ RPC Exports for sl
 
 
  1. sl.stats
-        Print reply statistics.
+        Documentation missing (rpc_stats_doc).
 
index 520ac59..ff372cd 100644 (file)
@@ -5,15 +5,15 @@ RPC Exports for tls
 
 
  1. tls.reload
-        Reload TLS configuration file
+        Documentation missing (tls_reload_doc).
 
  2. tls.list
-        List currently open TLS connections
+        Documentation missing (tls_list_doc).
         Returns an array.
 
  3. tls.info
-        Returns internal tls related info.
+        Documentation missing (tls_info_doc).
 
  4. tls.options
-        Dumps all the tls config options.
+        Documentation missing (tls_options_doc).
 
index 60b0802..177ff05 100644 (file)
@@ -5,26 +5,21 @@ RPC Exports for tm
 
 
  1. tm.cancel
-        Cancel a pending transaction
+        Documentation missing (rpc_cancel_doc).
 
  2. tm.reply
-        Reply transaction
+        Documentation missing (rpc_reply_doc).
 
  3. tm.stats
-        Print transaction statistics.
+        Documentation missing (tm_rpc_stats_doc).
 
  4. tm.hash_stats
-        Prints hash table statistics (can be used only if tm is
-        compiled with -DTM_HASH_STATS).
+        Documentation missing (tm_rpc_hash_stats_doc).
 
  5. tm.t_uac_start
-        starts a tm uac using  a list of string parameters: method,
-        ruri, dst_uri, send_sock, headers (CRLF separated) and body
-        (optional)
+        Documentation missing (rpc_t_uac_start_doc).
 
  6. tm.t_uac_wait
-        starts a tm uac and waits for the final reply, using a list of
-        string parameters: method, ruri, dst_uri send_sock, headers
-        (CRLF separated) and body (optional)
+        Documentation missing (rpc_t_uac_wait_doc).
         Returns an array.
 
diff --git a/doc/rpc_list/rpc_usrloc.txt b/doc/rpc_list/rpc_usrloc.txt
new file mode 100644 (file)
index 0000000..3514a2b
--- /dev/null
@@ -0,0 +1,9 @@
+RPC Exports for usrloc
+======================
+
+                  [ this file is autogenerated, do not edit ]
+
+
+ 1. ul.dump
+        Dump user location tables
+
index a3d4d37..830100d 100644 (file)
@@ -5,28 +5,28 @@ RPC Exports for usrloc_s
 
 
  1. usrloc.stats
-        Print usrloc statistics
+        Documentation missing (rpc_stats_doc).
         Returns an array.
 
  2. usrloc.delete_uid
-        Delete all registered contacts for address of record.
+        Documentation missing (rpc_delete_uid_doc).
 
  3. usrloc.delete_contact
-        Delete a contact if it exists.
+        Documentation missing (rpc_delete_contact_doc).
 
  4. usrloc.dump
-        Print all registered contacts.
+        Documentation missing (rpc_dump_doc).
 
  5. usrloc.dump_file
-        Print all registered contacts into a file.
+        Documentation missing (rpc_dump_file_doc).
 
  6. usrloc.flush
-        Flush cache into database.
+        Documentation missing (rpc_flush_doc).
 
  7. usrloc.add_contact
-        Create a new contact.
+        Documentation missing (rpc_add_contact_doc).
 
  8. usrloc.show_contacts
-        List all registered contacts for address of record
+        Documentation missing (rpc_show_contacts_doc).
         Returns an array.
 
index 6d5408d..0fd61e2 100644 (file)
@@ -113,6 +113,12 @@ ifeq ($(validate), 0)
        override xsltproc_flags := $(xsltproc_flags) --novalid
 endif
 
+ifeq ($(nocatalog),yes)
+XMLCATALOGX=
+else
+XMLCATALOGX=XML_CATALOG_FILES=$(catalog)
+endif
+
 all_deps = Makefile $(docbook_dir)/Makefile $(docbook_dir)/entities.xml \
                   $(dep_xsl) $(catalog) $(extra_deps)
 
@@ -133,12 +139,12 @@ txt text plaintext: $(txt_files)
 readme README: ../README
 
 ../README: $(readme_docs) $(readme_deps) $(readme_xsl) $(all_deps)
-       XML_CATALOG_FILES=$(catalog) $(xsltproc) $(xsltproc_flags) \
+       $(XMLCATALOGX) $(xsltproc) $(xsltproc_flags) \
                --xinclude \
         $(readme_xsl) $< | $(lynx) $(lynx_flags) -stdin -dump > $@
 
 $(output_dir)/%.html: %.xml %.d $(single_html_xsl) $(all_deps)
-       XML_CATALOG_FILES=$(catalog) $(xsltproc) $(xsltproc_flags) \
+       $(XMLCATALOGX) $(xsltproc) $(xsltproc_flags) \
         --xinclude \
         --stringparam base.dir "$(output_dir)/" \
         --stringparam root.filename "$(basename $<)" \
@@ -148,7 +154,7 @@ $(output_dir)/%.html: %.xml %.d $(single_html_xsl) $(all_deps)
 
 
 $(output_dir)/%.txt: %.xml %.d $(txt_xsl) $(all_deps)
-       XML_CATALOG_FILES=$(catalog) $(xsltproc) $(xsltproc_flags) \
+       $(XMLCATALOGX) $(xsltproc) $(xsltproc_flags) \
                --xinclude \
         $(txt_xsl) $< | $(lynx) $(lynx_flags) -stdin -dump > $@
 
@@ -164,7 +170,7 @@ $(output_dir)/%.txt: %.xml %.d $(txt_xsl) $(all_deps)
 
 .PHONY: check
 check: $(docs) $(html_docs) $(txt_docs) $(readme_docs)
-       XML_CATALOG_FILES=$(catalog) $(xmllint) $(xmllint_flags) $<
+       $(XMLCATALOGX) $(xmllint) $(xmllint_flags) $<
 
 .PHONY: clean
 clean:
diff --git a/dset.c b/dset.c
index f8bb337..4ba5ccf 100644 (file)
--- a/dset.c
+++ b/dset.c
@@ -191,11 +191,21 @@ void init_branch_iterator(void)
        branch_iterator = 0;
 }
 
+/**
+ * return the value of current branch iterator
+ */
 int get_branch_iterator(void)
 {
        return branch_iterator;
 }
 
+/**
+ * set the value of current branch interator
+ */
+void set_branch_iterator(int n)
+{
+       branch_iterator = n;
+}
 
 
 /** \brief Get a branch from the destination set
@@ -366,6 +376,7 @@ char* print_dset(struct sip_msg* msg, int* len)
        qvalue_t q;
        str uri;
        char* p, *qbuf;
+       int crt_branch;
        static char dset[MAX_REDIRECTION_LEN];
 
        if (msg->new_uri.s) {
@@ -379,6 +390,9 @@ char* print_dset(struct sip_msg* msg, int* len)
                *len = 0;
        }
 
+       /* backup current branch index to restore it later */
+       crt_branch = get_branch_iterator();
+
        init_branch_iterator();
        while ((uri.s = next_branch(&uri.len, &q, 0, 0, 0, 0))) {
                cnt++;
@@ -394,7 +408,7 @@ char* print_dset(struct sip_msg* msg, int* len)
 
        if (*len + 1 > MAX_REDIRECTION_LEN) {
                LOG(L_ERR, "ERROR: redirection buffer length exceed\n");
-               return 0;
+               goto error;
        }
 
        memcpy(dset, CONTACT, CONTACT_LEN);
@@ -445,7 +459,12 @@ char* print_dset(struct sip_msg* msg, int* len)
        }
 
        memcpy(p, CRLF " ", CRLF_LEN + 1);
+       set_branch_iterator(crt_branch);
        return dset;
+
+error:
+       set_branch_iterator(crt_branch);
+       return 0;
 }
 
 
diff --git a/dset.h b/dset.h
index 6f9f067..dfc3083 100644 (file)
--- a/dset.h
+++ b/dset.h
@@ -107,15 +107,19 @@ static inline int ser_append_branch(struct sip_msg* msg,
 
 
 /*! \brief
- * Iterate through the list of transaction branches 
+ * Init the index to iterate through the list of transaction branches
  */
 void init_branch_iterator(void);
 
 /*! \brief
- * Return branch iterator position 
+ * Return branch iterator position
  */
 int get_branch_iterator(void);
 
+/*! \brief
+ * Set branch iterator position
+ */
+void set_branch_iterator(int n);
 
 /*! \brief Get the next branch in the current transaction.
  * @return pointer to the uri of the next branch (which the length written in
index 0f7351d..024114d 100644 (file)
@@ -937,24 +937,6 @@ void dst_blst_mem_info(rpc_t* rpc, void* ctx)
 
 
 
-static char* get_proto_name(unsigned char proto)
-{
-       switch(proto){
-               case PROTO_NONE:
-                       return "*";
-               case PROTO_UDP:
-                       return "udp";
-               case PROTO_TCP:
-                       return "tcp";
-               case PROTO_TLS:
-                       return "tls";
-               case PROTO_SCTP:
-                       return "sctp";
-               default:
-                       return "unknown";
-       }
-}
-
 
 #ifdef USE_DST_BLACKLIST_STATS
 
index 690ff47..d3ecb00 100644 (file)
--- a/forward.c
+++ b/forward.c
@@ -399,6 +399,14 @@ static struct _check_self_func {
        struct _check_self_func *next;
 } *_check_self_func_list = NULL;
 
+/* check if _check_self_func_list is set
+ * - return 1 if yes, 0 if no
+ */
+int is_check_self_func_list_set(void)
+{
+       return (_check_self_func_list)?1:0;
+}
+
 /* register a function to be called when matching for myself
  * - return 0 on success, -1 on error
  * - f must have same prototype as check_self() and return same kind of values
index 7600535..674a6f0 100644 (file)
--- a/forward.h
+++ b/forward.h
@@ -105,6 +105,7 @@ int update_sock_struct_from_via( union sockaddr_union* to,
 
 int forward_reply( struct sip_msg* msg);
 
+int is_check_self_func_list_set(void);
 
 
 /* params:
index 0b7184a..89abbda 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -93,7 +93,8 @@ extern int tcp_main_pid;
 extern int tcp_children_no;
 extern int tcp_disable;
 extern enum poll_types tcp_poll_method;
-extern int tcp_max_connections; /* maximum connections, hard limit */
+extern int tcp_max_connections; /* maximum tcp connections, hard limit */
+extern int tls_max_connections; /* maximum tls connections, hard limit */
 #endif
 #ifdef USE_TLS
 extern int tls_disable;
index 502b4ea..06c57c3 100644 (file)
--- a/ip_addr.c
+++ b/ip_addr.c
@@ -337,7 +337,7 @@ int is_mcast(struct ip_addr* ip)
  * @param proto - protocol number
  * @return  string with the protocol name or "unknown".
  */
-char* proto2a(enum sip_protos proto)
+char* get_proto_name(unsigned int proto)
 {
        switch(proto){
                case PROTO_NONE:
@@ -350,8 +350,7 @@ char* proto2a(enum sip_protos proto)
                        return "tls";
                case PROTO_SCTP:
                        return "sctp";
-               case PROTO_OTHER:
-                       return "other";
+               default:
+                       return "unknown";
        }
-       return "unknown";
 }
index 86c2502..0c1a129 100644 (file)
--- a/ip_addr.h
+++ b/ip_addr.h
@@ -250,7 +250,8 @@ void print_ip(char* prefix, struct ip_addr* ip, char* suffix);
 void stdout_print_ip(struct ip_addr* ip);
 void print_net(struct net* net);
 
-char* proto2a(enum sip_protos proto);
+char* get_proto_name(unsigned int proto);
+#define proto2a get_proto_name
 
 
 
index 89277dd..9398fea 100644 (file)
@@ -44,9 +44,9 @@
 #include <time.h> /* time */
 /* #include <stropts.h>  - is this really needed? --andrei */
 
-#include "../../modules_s/ctl/ctl_defaults.h" /* default socket & port */
-#include "../../modules_s/ctl/init_socks.h"
-#include "../../modules_s/ctl/binrpc.c" /* ugly hack */
+#include "../../modules/ctl/ctl_defaults.h" /* default socket & port */
+#include "../../modules/ctl/init_socks.h"
+#include "../../modules/ctl/binrpc.c" /* ugly hack */
 
 #include "binrpc_api.h"
 
@@ -67,7 +67,9 @@
 #define UNIX_PATH_MAX 108
 #endif
 
+#ifndef INT2STR_MAX_LEN
 #define INT2STR_MAX_LEN  (19+1+1) /* 2^64~= 16*10^18 => 19+1 digits + \0 */
+#endif
 
 static void* (*internal_malloc)(size_t size) = malloc;
 static void* (*internal_realloc)(void* ptr, size_t size) = realloc;
@@ -501,7 +503,7 @@ static int get_reply(struct binrpc_handle *handle,
                if (crt - hdr_end < tl) {
                        snprintf(binrpc_last_errs, sizeof(binrpc_last_errs)-1,
                                "get_reply: datagram truncated. Received: %ld, Expected: %d.",
-                               crt-hdr_end, tl);
+                               (long int)(crt-hdr_end), tl);
                        return FATAL_ERROR;             
                }
        }
index ef8dfe8..b7a41ed 100644 (file)
@@ -34,7 +34,7 @@
 #ifndef BINRPC_API_H_
 #define BINRPC_API_H_
 
-#include "../../modules_s/ctl/binrpc.h"
+#include "../../modules/ctl/binrpc.h"
 
 struct binrpc_handle {
        int socket;
index 9a51723..efaba59 100644 (file)
@@ -58,7 +58,8 @@ int faked_msg_init(void)
 
 struct sip_msg* faked_msg_next(void)
 {
-       _faked_msg.id=_faked_msg_no++;
+       _faked_msg.id = 1 + _faked_msg_no++;
+       _faked_msg.pid = my_pid();
        clear_branches();
        return &_faked_msg;
 }
index b8abefa..5905bb0 100644 (file)
@@ -64,6 +64,7 @@
 #include "db_cap.h"
 #include "db_id.h"
 #include "db_pool.h"
+#include "db_query.h"
 #include "db.h"
 
 static unsigned int MAX_URL_LENGTH = 255;      /*!< maximum length of a SQL URL */
@@ -181,8 +182,17 @@ int db_bind_mod(const str* mod, db_func_t* mydbf)
                return -1;
        }
        memcpy(name, "db_", 3);
-       memcpy(name+3, mod->s, mod->len);
-       name[mod->len+3] = 0;
+
+       if (mod->s[0]=='*' )
+       {
+               memcpy(name+3, (mod->s)+1, (mod->len)-1);
+               name[mod->len-1+3] = 0;
+       }
+       else
+       {
+               memcpy(name+3, mod->s, mod->len);
+               name[mod->len+3] = 0;
+       }
 
        /* for safety we initialize mydbf with 0 (this will cause
         *  a segfault immediately if someone tries to call a function
@@ -490,3 +500,17 @@ int db_load_bulk_data(db_func_t* binding, db1_con_t* handle, str* name, db_key_t
 
        return 0;
 }
+
+/**
+ * \brief DB API init function.
+ *
+ * This function must be executed by DB connector modules at load time to
+ * initialize the internals of DB API library.
+ * \return returns 0 on successful initialization, -1 on error.
+ */
+int db_api_init(void)
+{
+       if(db_query_init()<0)
+               return -1;
+       return 0;
+}
index 294488c..e27969f 100644 (file)
@@ -443,4 +443,30 @@ typedef int (*db_bind_api_f)(db_func_t *dbb);
 int db_load_bulk_data(db_func_t* binding, db1_con_t* handle, str* name, db_key_t* cols,
                      unsigned int count, unsigned int strict, db1_res_t* res);
 
+/**
+ * \brief DB API init function.
+ *
+ * This function must be executed by DB connector modules at load time to
+ * initialize the internals of DB API library.
+ * \return returns 0 on successful initialization, -1 on error.
+ */
+int db_api_init(void);
+
+/**
+ * \brief wrapper around db query to handle fetch capability
+ * \return -1 error; 0 ok with no fetch capability; 1 ok with fetch capability
+ */
+int db_fetch_query(db_func_t *dbf, int frows,
+               db1_con_t* _h, const db_key_t* _k, const db_op_t* _op,
+               const db_val_t* _v, const db_key_t* _c, const int _n, const int _nc,
+               const db_key_t _o, db1_res_t** _r);
+
+/**
+ * \brief wrapper around db fetch to handle fetch capability
+ * \return -1 error; 0 ok with no fetch capability; 1 ok with fetch capability
+ */
+int db_fetch_next(db_func_t *dbf, int frows, db1_con_t* _h,
+               db1_res_t** _r);
+
+
 #endif /* DB1_H */
index 8c8b2a3..4aa564b 100644 (file)
@@ -65,12 +65,13 @@ static int dupl_string(char** dst, const char* begin, const char* end)
  * \param url parsed URL
  * \return 0 if parsing was successful and -1 otherwise
  */
-static int parse_db_url(struct db_id* id, const str* url)
+static int parse_db_url(struct db_id* id, const str* url, int *poolid )
 {
 #define SHORTEST_DB_URL "s://a/b"
 #define SHORTEST_DB_URL_LEN (sizeof(SHORTEST_DB_URL) - 1)
 
        enum state {
+               ST_NONPOOL,    /* Non pooling flag */
                ST_SCHEME,     /* Scheme part */
                ST_SLASH1,     /* First slash */
                ST_SLASH2,     /* Second slash */
@@ -99,11 +100,25 @@ static int parse_db_url(struct db_id* id, const str* url)
        
        /* Initialize all attributes to 0 */
        memset(id, 0, sizeof(struct db_id));
-       st = ST_SCHEME;
+       st = ST_NONPOOL;
        begin = url->s;
 
        for(i = 0; i < len; i++) {
                switch(st) {
+               case ST_NONPOOL:
+                       st = ST_SCHEME;
+                       switch(url->s[i]) {
+                       case '*':
+                               id->poolid = ++(*poolid);
+                               begin++;
+                               break;
+
+                       default:
+                               id->poolid = 0;
+                               break;
+                       }
+                       break;
+
                case ST_SCHEME:
                        switch(url->s[i]) {
                        case ':':
@@ -229,6 +244,7 @@ static int parse_db_url(struct db_id* id, const str* url)
  */
 struct db_id* new_db_id(const str* url)
 {
+       static int poolid=0;
        struct db_id* ptr;
 
        if (!url || !url->s) {
@@ -243,7 +259,7 @@ struct db_id* new_db_id(const str* url)
        }
        memset(ptr, 0, sizeof(struct db_id));
 
-       if (parse_db_url(ptr, url) < 0) {
+       if (parse_db_url(ptr, url, &poolid) < 0) {
                LM_ERR("error while parsing database URL: '%.*s' \n", url->len, url->s);
                goto err;
        }
@@ -286,6 +302,11 @@ unsigned char cmp_db_id(const struct db_id* id1, const struct db_id* id2)
                                id1->pid, id2->pid);
                return 0;
        }
+       if(id1->poolid!=id2->poolid) {
+               LM_DBG("identical DB URLs, but different poolids [%d/%d]\n",
+                               id1->poolid, id2->poolid);
+               return 0;
+       }
        return 1;
 }
 
index 20ab846..b7427a7 100644 (file)
@@ -41,6 +41,7 @@ struct db_id {
        unsigned short port; /**< Port number */
        char* database;      /**< Database, case sensitive */
        int   pid;           /**< Process ID (detect cross connections) */
+       int   poolid;        /**< poolid within a pid */
 };
 
 
index 10ee44a..4b4c3a4 100644 (file)
@@ -42,6 +42,8 @@
 #define OP_GEQ ">="
 /** operator negation */
 #define OP_NEQ "!="
+/** bitwise AND */
+#define OP_BITWISE_AND "&"
 
 
 /**
index dbde735..3f75421 100644 (file)
@@ -357,3 +357,78 @@ int db_query_init(void)
     }
     return 0;
 }
+
+/**
+ * wrapper around db query to handle fetch capability
+ * return: -1 error; 0 ok with no fetch capability; 1 ok with fetch capability
+ */
+int db_fetch_query(db_func_t *dbf, int frows,
+               db1_con_t* _h, const db_key_t* _k, const db_op_t* _op,
+               const db_val_t* _v, const db_key_t* _c, const int _n, const int _nc,
+               const db_key_t _o, db1_res_t** _r)
+{
+
+       int ret;
+
+       ret = 0;
+       *_r = NULL;
+
+       if (DB_CAPABILITY(*dbf, DB_CAP_FETCH)) {
+               if(dbf->query(_h, _k, _op, _v, _c, _n, _nc, _o, 0) < 0)
+               {
+                       LM_ERR("unable to query db for fetch\n");
+                       goto error;
+               }
+               if(dbf->fetch_result(_h, _r, frows)<0)
+               {
+                       LM_ERR("unable to fetch the db result\n");
+                       goto error;
+               }
+               ret = 1;
+       } else {
+               if(dbf->query(_h, _k, _op, _v, _c, _n, _nc, _o, _r) < 0)
+               {
+                       LM_ERR("unable to do full db querry\n");
+                       goto error;
+               }
+       }
+
+       return ret;
+
+error:
+       if(*_r)
+       {
+               dbf->free_result(_h, *_r);
+               *_r = NULL;
+       }
+       return -1;
+}
+
+/**
+ * wrapper around db fetch to handle fetch capability
+ * return: -1 error; 0 ok with no fetch capability; 1 ok with fetch capability
+ */
+int db_fetch_next(db_func_t *dbf, int frows, db1_con_t* _h,
+               db1_res_t** _r)
+{
+       int ret;
+
+       ret = 0;
+
+       if (DB_CAPABILITY(*dbf, DB_CAP_FETCH)) {
+               if(dbf->fetch_result(_h, _r, frows)<0) {
+                       LM_ERR("unable to fetch next rows\n");
+                       goto error;
+               }
+               ret = 1;
+       }
+       return ret;
+
+error:
+       if(*_r)
+       {
+               dbf->free_result(_h, *_r);
+               *_r = NULL;
+       }
+       return -1;
+}
index c34930f..26637f4 100644 (file)
@@ -334,21 +334,35 @@ int db_print_where(const db1_con_t* _c, char* _b, const int _l, const db_key_t*
        }
 
        for(i = 0; i < _n; i++) {
-               if (_o) {
-                       ret = snprintf(_b + len, _l - len, "%.*s%s", _k[i]->len, _k[i]->s, _o[i]);
+               if (_o && strncmp(_o[i], OP_BITWISE_AND, 1) == 0) {
+                       char tmp_buf[16];
+                       int tmp_len = 15;
+                       memset(tmp_buf, '0', 16);
+                       if ((*val2str)(_c, &(_v[i]), tmp_buf, &tmp_len) < 0) {
+                               LM_ERR("Error while converting value to string\n");
+                               return -1;
+                       }
+                       ret = snprintf(_b + len, _l - len, "%.*s&%.*s=%.*s", _k[i]->len, _k[i]->s, tmp_len, tmp_buf, tmp_len, tmp_buf);
                        if (ret < 0 || ret >= (_l - len)) goto error;
                        len += ret;
                } else {
-                       ret = snprintf(_b + len, _l - len, "%.*s=", _k[i]->len, _k[i]->s);
-                       if (ret < 0 || ret >= (_l - len)) goto error;
-                       len += ret;
-               }
-               l = _l - len;
-               if ( (*val2str)(_c, &(_v[i]), _b + len, &l) < 0) {
-                       LM_ERR("Error while converting value to string\n");
-                       return -1;
+                       if (_o) {
+                               ret = snprintf(_b + len, _l - len, "%.*s%s", _k[i]->len, _k[i]->s, _o[i]);
+                               if (ret < 0 || ret >= (_l - len)) goto error;
+                               len += ret;
+                       } else {
+                               ret = snprintf(_b + len, _l - len, "%.*s=", _k[i]->len, _k[i]->s);
+                               if (ret < 0 || ret >= (_l - len)) goto error;
+                               len += ret;
+                       }
+                       l = _l - len;
+                       if ( (*val2str)(_c, &(_v[i]), _b + len, &l) < 0) {
+                               LM_ERR("Error while converting value to string\n");
+                               return -1;
+                       }
+                       len += l;
                }
-               len += l;
+
                if (i != (_n - 1)) {
                        ret = snprintf(_b + len, _l - len, " AND ");
                        if (ret < 0 || ret >= (_l - len)) goto error;
index fb3e3f9..eb3f1ab 100644 (file)
@@ -9,7 +9,7 @@
 
 <table id="mtrees" xmlns:db="http://docbook.org/ns/docbook">
     <name>mtrees</name>
-    <version>1</version>
+    <version>2</version>
     <type db="mysql">&MYSQL_TABLE_TYPE;</type>
     <description>
         <db:para>This table is used by the mtree module to load values in shared memory trees at start up. More information about the mtree module can be found at: &KAMAILIO_MOD_DOC;mtree.html
     </column>
 
     <index>
-        <name>tname_tprefix_idx</name>
+        <name>tname_tprefix_tvalue_idx</name>
         <colref linkend="tname"/>
         <colref linkend="tprefix"/>
+        <colref linkend="tvalue"/>
         <unique/>
     </index>
 
index 7a65ea8..501e05f 100644 (file)
@@ -9,7 +9,7 @@
 
 <table id="silo" xmlns:db="http://docbook.org/ns/docbook">
     <name>silo</name>
-    <version>5</version>
+    <version>6</version>
     <type db="mysql">&MYSQL_TABLE_TYPE;</type>
     <description>
         <db:para> This table us used by the msilo module to provide offline message storage More information about the msilo module can be found at: &KAMAILIO_MOD_DOC;msilo.html
         <description>Body of the message</description>
     </column>
 
+    <column>
+        <name>extra_hdrs</name>
+        <type>text</type>
+        <default/>
+        <description>iExtra headers that must be restored</description>
+    </column>
+
     <index>
         <name>account_idx</name>
         <colref linkend="username"/>
index e87e8f2..0c37c89 100644 (file)
@@ -71,6 +71,7 @@ db_uri_t* db_uri(const char* uri)
        char* colon;
        int len;
        db_uri_t* newp;
+       char *turi;
     
        newp = (db_uri_t*)pkg_malloc(sizeof(db_uri_t));
        if (newp == NULL) goto error;
@@ -78,7 +79,8 @@ db_uri_t* db_uri(const char* uri)
        if (db_gen_init(&newp->gen) < 0) goto error;    
 
        len = strlen(uri);
-       colon = q_memchr((char *)uri, ':', len);
+       turi = (char*)uri;
+       colon = q_memchr(turi, ':', len);
        if (colon == NULL) {
                newp->scheme.s = pkg_malloc(len + 1);
                if (newp->scheme.s == NULL) goto error;
diff --git a/main.c b/main.c
index 5e4defa..741bdad 100644 (file)
--- a/main.c
+++ b/main.c
@@ -282,6 +282,34 @@ void print_ct_constants()
 #endif
 }
 
+/* print compile-time constants */
+void print_internals()
+{
+       printf("Print out of %s internals\n", NAME);
+       printf("  Version: %s\n", full_version);
+       printf("  Default config: %s\n", CFG_FILE);
+       printf("  Default paths to modules: %s\n", MODS_DIR);
+       printf("  Compile flags: %s\n", ver_flags );
+       printf("  MAX_RECV_BUFFER_SIZE=%d\n", MAX_RECV_BUFFER_SIZE);
+       printf("  MAX_LISTEN=%d\n", MAX_LISTEN);
+       printf("  MAX_URI_SIZE=%d\n", MAX_URI_SIZE);
+       printf("  BUF_SIZE=%d\n", BUF_SIZE);
+       printf("  DEFAULT PKG_SIZE=%uMB\n", PKG_MEM_SIZE);
+#ifdef SHM_MEM
+       printf("  DEFAULT SHM_SIZE=%uMB\n", SHM_MEM_SIZE);
+#endif
+#ifdef ADAPTIVE_WAIT
+       printf("  ADAPTIVE_WAIT_LOOPS=%d\n", ADAPTIVE_WAIT_LOOPS);
+#endif
+#ifdef USE_TCP
+       printf("  TCP poll methods: %s\n", poll_support);
+#endif
+       printf("  Source code revision ID: %s\n", ver_id);
+       printf("  Compiled with: %s\n", ver_compiler);
+       printf("  Compiled on: %s\n", ver_compiled_time);
+       printf("Thank you for flying %s!\n", NAME);
+}
+
 /* debugging function */
 /*
 void receive_stdin_loop()
@@ -1788,7 +1816,7 @@ int main(int argc, char** argv)
 
        daemon_status_init();
        /* command line options */
-       options=  ":f:cm:M:dVhEb:l:L:n:vrRDTN:W:w:t:u:g:P:G:SQ:O:a:A:"
+       options=  ":f:cm:M:dVIhEb:l:L:n:vrRDTN:W:w:t:u:g:P:G:SQ:O:a:A:"
 #ifdef STATS
                "s:"
 #endif
@@ -1896,6 +1924,10 @@ int main(int argc, char** argv)
                                        printf("compiled on %s with %s\n",
                                                        ver_compiled_time, ver_compiler );
 
+                                       exit(0);
+                                       break;
+                       case 'I':
+                                       print_internals();
                                        exit(0);
                                        break;
                        case 'E':
@@ -2048,6 +2080,7 @@ try_again:
                        case 'M':
                        case 'd':
                        case 'V':
+                       case 'I':
                        case 'h':
                        case 'O':
                        case 'A':
index 46061e7..de676a5 100644 (file)
 #include "../../modules/sdpops/api.h"
 #include "../../modules_k/presence/bind_presence.h"
 #include "../../modules_k/presence_xml/api.h"
+#include "../../modules_k/textops/api.h"
+#include "../../modules_k/pua_usrloc/api.h"
+#include "../../modules_k/siputils/siputils.h"
+#include "../../modules_k/rls/api.h"
+#include "../../modules_k/alias_db/api.h"
+#include "../../modules_k/msilo/api.h"
+#include "../../modules_k/uac/api.h"
 
 #include "app_lua_api.h"
 
 #define SR_LUA_EXP_MOD_SDPOPS     (1<<10)
 #define SR_LUA_EXP_MOD_PRESENCE   (1<<11)
 #define SR_LUA_EXP_MOD_PRESENCE_XML (1<<12)
+#define SR_LUA_EXP_MOD_TEXTOPS    (1<<13)
+#define SR_LUA_EXP_MOD_PUA_USRLOC (1<<14)
+#define SR_LUA_EXP_MOD_SIPUTILS   (1<<15)
+#define SR_LUA_EXP_MOD_RLS        (1<<16)
+#define SR_LUA_EXP_MOD_ALIAS_DB   (1<<17)
+#define SR_LUA_EXP_MOD_MSILO      (1<<18)
+#define SR_LUA_EXP_MOD_UAC        (1<<19)
 
 /**
  *
@@ -132,6 +146,41 @@ static presence_api_t _lua_presenceb;
  */
 static presence_xml_api_t _lua_presence_xmlb;
 
+/**
+ * textops
+ */
+static textops_api_t _lua_textopsb;
+
+/**
+ * pua_usrloc
+ */
+static pua_usrloc_api_t _lua_pua_usrlocb;
+
+/**
+ * siputils
+ */
+static siputils_api_t _lua_siputilsb;
+
+/**
+ * rls
+ */
+static rls_api_t _lua_rlsb;
+
+/**
+ * alias_db
+ */
+static alias_db_api_t _lua_alias_dbb;
+
+/**
+ * msilo 
+ */
+static msilo_api_t _lua_msilob;
+
+/**
+ * uac
+ */
+static uac_api_t _lua_uacb;
+
 /**
  *
  */
@@ -443,6 +492,55 @@ static int lua_sr_tm_t_is_canceled(lua_State *L)
        return app_lua_return_int(L, ret);
 }
 
+/**
+ *
+ */
+static int lua_sr_tm_t_newtran(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TM))
+       {
+               LM_WARN("weird: tm function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_tmb.t_newtran(env_L->msg);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static int lua_sr_tm_t_release(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TM))
+       {
+               LM_WARN("weird: tm function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_tmb.t_release(env_L->msg);
+       return app_lua_return_int(L, ret);
+}
 
 /**
  *
@@ -455,6 +553,8 @@ static const luaL_reg _sr_tm_Map [] = {
        {"t_on_reply",     lua_sr_tm_t_on_reply},
        {"t_check_trans",  lua_sr_tm_t_check_trans},
        {"t_is_canceled",  lua_sr_tm_t_is_canceled},
+       {"t_newtran",      lua_sr_tm_t_newtran},
+       {"t_release",      lua_sr_tm_t_release},
        {NULL, NULL}
 };
 
@@ -737,12 +837,49 @@ static int lua_sr_rr_loose_route(lua_State *L)
        return app_lua_return_int(L, ret);
 }
 
+/**
+ *
+ */
+static int lua_sr_rr_add_rr_param(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+       str param;
+
+       env_L = sr_lua_env_get();
+
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RR))
+       {
+               LM_WARN("weird: rr function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+       if(lua_gettop(L)!=1)
+       {
+               LM_WARN("invalid number of parameters\n");
+               return app_lua_return_error(L);
+       }
+
+       param.s = (char*)lua_tostring(L, -1);
+       if(param.s!=NULL)
+               param.len = strlen(param.s);
+
+       ret = _lua_rrb.add_rr_param(env_L->msg, &param);
+
+       return app_lua_return_int(L, ret);
+}
+
 /**
  *
  */
 static const luaL_reg _sr_rr_Map [] = {
        {"record_route",    lua_sr_rr_record_route},
        {"loose_route",     lua_sr_rr_loose_route},
+       {"add_rr_param",    lua_sr_rr_add_rr_param},
        {NULL, NULL}
 };
 
@@ -1093,6 +1230,43 @@ static int lua_sr_registrar_lookup(lua_State *L)
        return app_lua_return_int(L, ret);
 }
 
+/**
+ *
+ */
+static int lua_sr_registrar_registered(lua_State *L)
+{
+       int ret;
+       char *table;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_REGISTRAR))
+       {
+               LM_WARN("weird: registrar function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+       if(lua_gettop(L)!=1)
+       {
+               LM_WARN("invalid number of parameters from Lua\n");
+               return app_lua_return_error(L);
+       }
+       table  = (char*)lua_tostring(L, -1);
+       if(table==NULL || strlen(table)==0)
+       {
+               LM_WARN("invalid parameters from Lua\n");
+               return app_lua_return_error(L);
+       }
+       ret = _lua_registrarb.registered(env_L->msg, table);
+
+       return app_lua_return_int(L, ret);
+}
+
 
 /**
  *
@@ -1100,6 +1274,7 @@ static int lua_sr_registrar_lookup(lua_State *L)
 static const luaL_reg _sr_registrar_Map [] = {
        {"save",      lua_sr_registrar_save},
        {"lookup",    lua_sr_registrar_lookup},
+       {"registered",lua_sr_registrar_registered},
        {NULL, NULL}
 };
 
@@ -1391,11 +1566,77 @@ static int lua_sr_pres_auth_status(lua_State *L)
        return app_lua_return_int(L, ret);
 }
 
+/**
+ *
+ */
+static int lua_sr_pres_handle_publish(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_PRESENCE))
+       {
+               LM_WARN("weird: presence function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=0)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_presenceb.handle_publish(env_L->msg, NULL, NULL);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static int lua_sr_pres_handle_subscribe(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_PRESENCE))
+       {
+               LM_WARN("weird: presence function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=0)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_presenceb.handle_subscribe(env_L->msg, NULL, NULL);
+       return app_lua_return_int(L, ret);
+}
+
 /**
  *
  */
 static const luaL_reg _sr_presence_Map [] = {
        {"pres_auth_status",       lua_sr_pres_auth_status},
+       {"handle_publish",         lua_sr_pres_handle_publish},
+       {"handle_subscribe",       lua_sr_pres_handle_subscribe},
        {NULL, NULL}
 };
 
@@ -1487,47 +1728,485 @@ static const luaL_reg _sr_presence_xml_Map [] = {
 /**
  *
  */
-int lua_sr_exp_init_mod(void)
+static int lua_sr_textops_is_privacy(lua_State *L)
 {
-       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SL)
+       str param[1];
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TEXTOPS))
        {
-               /* bind the SL API */
-               if (sl_load_api(&_lua_slb) < 0) {
-                       LM_ERR("cannot bind to SL API\n");
-                       return -1;
-               }
-               LM_DBG("loaded sl api\n");
+               LM_WARN("weird: textops function executed but module not registered\n");
+               return app_lua_return_error(L);
        }
-       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TM)
+
+       if(env_L->msg==NULL)
        {
-               /* bind the TM API */
-               if (tm_load_api(&_lua_tmb) < 0)
-               {
-                       LM_ERR("cannot bind to TM API\n");
-                       return -1;
-               }
-               LM_DBG("loaded tm api\n");
-               /* bind the TM XAPI */
-               if (tm_load_xapi(&_lua_xtmb) < 0)
-               {
-                       LM_ERR("cannot bind to TM XAPI\n");
-                       return -1;
-               }
-               LM_DBG("loaded tm xapi\n");
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
        }
-       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SQLOPS)
+
+       if(lua_gettop(L)!=1)
        {
-               /* bind the SQLOPS API */
-               if (sqlops_load_api(&_lua_sqlopsb) < 0)
-               {
-                       LM_ERR("cannot bind to SQLOPS API\n");
-                       return -1;
-               }
-               LM_DBG("loaded sqlops api\n");
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
        }
-       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RR)
+
+       param[0].s = (char *) lua_tostring(L, -1);
+       param[0].len = strlen(param[0].s);
+       
+       ret = _lua_textopsb.is_privacy(env_L->msg, &param[0]);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static const luaL_reg _sr_textops_Map [] = {
+       {"is_privacy",       lua_sr_textops_is_privacy},
+       {NULL, NULL}
+};
+
+/**
+ *
+ */
+static int lua_sr_pua_usrloc_set_publish(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_PUA_USRLOC))
        {
-               /* bind the RR API */
+               LM_WARN("weird: pua_usrloc function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=0)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_pua_usrlocb.pua_set_publish(env_L->msg, NULL, NULL);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static const luaL_reg _sr_pua_usrloc_Map [] = {
+       {"set_publish",            lua_sr_pua_usrloc_set_publish},
+       {NULL, NULL}
+};
+
+/**
+ *
+ */
+static int lua_sr_siputils_has_totag(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SIPUTILS))
+       {
+               LM_WARN("weird: siputils function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=0)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_siputilsb.has_totag(env_L->msg, NULL, NULL);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static int lua_sr_siputils_is_uri_user_e164(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+       str param[1];
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SIPUTILS))
+       {
+               LM_WARN("weird: siputils function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=1)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       param[0].s = (char *) lua_tostring(L, -1);
+       param[0].len = strlen(param[0].s);
+       
+       ret = _lua_siputilsb.is_uri_user_e164(&param[0]);
+       if (ret < 0)
+               return app_lua_return_false(L);
+
+       return app_lua_return_true(L);
+}
+
+/**
+ *
+ */
+static const luaL_reg _sr_siputils_Map [] = {
+       {"has_totag",            lua_sr_siputils_has_totag},
+       {"is_uri_user_e164",     lua_sr_siputils_is_uri_user_e164},
+       {NULL, NULL}
+};
+
+/**
+ *
+ */
+static int lua_sr_rls_handle_subscribe(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RLS))
+       {
+               LM_WARN("weird: rls function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=0)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_rlsb.rls_handle_subscribe(env_L->msg, NULL, NULL);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static int lua_sr_rls_handle_notify(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RLS))
+       {
+               LM_WARN("weird: rls function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=0)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_rlsb.rls_handle_notify(env_L->msg, NULL, NULL);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static const luaL_reg _sr_rls_Map [] = {
+       {"handle_subscribe",       lua_sr_rls_handle_subscribe},
+       {"handle_notify",          lua_sr_rls_handle_notify},
+       {NULL, NULL}
+};
+
+/**
+ *
+ */
+static int lua_sr_alias_db_lookup(lua_State *L)
+{
+       int ret;
+       str param[1];
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+       
+       if(!(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_ALIAS_DB))
+       {
+               LM_WARN("weird: alias_db function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if(env_L->msg==NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if(lua_gettop(L)!=1)
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       param[0].s = (char *) lua_tostring(L, -1);
+       param[0].len = strlen(param[0].s);
+       
+       ret = _lua_alias_dbb.alias_db_lookup(env_L->msg, param[0]);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static const luaL_reg _sr_alias_db_Map [] = {
+       {"lookup",       lua_sr_alias_db_lookup},
+       {NULL, NULL}
+};
+
+/**
+ *
+ */
+static int lua_sr_msilo_store(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+
+       if (!(_sr_lua_exp_reg_mods & SR_LUA_EXP_MOD_MSILO))
+       {
+               LM_WARN("weird: msilo function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if (env_L->msg == NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if (lua_gettop(L) == 0)
+       {
+               ret = _lua_msilob.m_store(env_L->msg, NULL);
+       }
+       else if (lua_gettop(L) == 1)
+       {
+               str owner;
+               owner.s = (char*)lua_tostring(L, -1);
+               if (owner.s == NULL)
+               {
+                       return app_lua_return_error(L);
+               }
+               owner.len = strlen(owner.s);
+               ret = _lua_msilob.m_store(env_L->msg, &owner);
+       }
+       else
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static int lua_sr_msilo_dump(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+
+       env_L = sr_lua_env_get();
+
+       if (!(_sr_lua_exp_reg_mods & SR_LUA_EXP_MOD_MSILO))
+       {
+               LM_WARN("weird: msilo function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if (env_L->msg == NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if (lua_gettop(L) == 0)
+       {
+               ret = _lua_msilob.m_dump(env_L->msg, NULL);
+       }
+       else if (lua_gettop(L) == 1)
+       {
+               str owner;
+               owner.s = (char*)lua_tostring(L, -1);
+               if (owner.s == NULL)
+               {
+                       return app_lua_return_error(L);
+               }
+               owner.len = strlen(owner.s);
+               ret = _lua_msilob.m_dump(env_L->msg, &owner);
+       }
+       else
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static const luaL_reg _sr_msilo_Map [] = {
+       {"store",       lua_sr_msilo_store},
+       {"dump",        lua_sr_msilo_dump},
+       {NULL, NULL}
+};
+
+/**
+ *
+ */
+static int lua_sr_uac_replace_from(lua_State *L)
+{
+       int ret;
+       sr_lua_env_t *env_L;
+       str param[2];
+
+       env_L = sr_lua_env_get();
+
+       if (!(_sr_lua_exp_reg_mods & SR_LUA_EXP_MOD_UAC))
+       {
+               LM_WARN("weird:uac function executed but module not registered\n");
+               return app_lua_return_error(L);
+       }
+
+       if (env_L->msg == NULL)
+       {
+               LM_WARN("invalid parameters from Lua env\n");
+               return app_lua_return_error(L);
+       }
+
+       if (lua_gettop(L) == 1)
+       {
+               param[0].s = "";
+               param[0].len = 0;
+               param[1].s = (char *) lua_tostring(L, -1);
+               param[1].len = strlen(param[1].s);
+       
+       }
+       else if (lua_gettop(L) == 2)
+       {
+               param[0].s = (char *) lua_tostring(L, -2);
+               param[0].len = strlen(param[0].s);
+               param[1].s = (char *) lua_tostring(L, -1);
+               param[1].len = strlen(param[1].s);
+       }
+       else
+       {
+               LM_ERR("incorrect number of arguments\n");
+               return app_lua_return_error(L);
+       }
+
+       ret = _lua_uacb.replace_from(env_L->msg, &param[0], &param[1]);
+       return app_lua_return_int(L, ret);
+}
+
+/**
+ *
+ */
+static const luaL_reg _sr_uac_Map [] = {
+       {"replace_from",lua_sr_uac_replace_from},
+       {NULL, NULL}
+};
+
+/**
+ *
+ */
+int lua_sr_exp_init_mod(void)
+{
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SL)
+       {
+               /* bind the SL API */
+               if (sl_load_api(&_lua_slb) < 0) {
+                       LM_ERR("cannot bind to SL API\n");
+                       return -1;
+               }
+               LM_DBG("loaded sl api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TM)
+       {
+               /* bind the TM API */
+               if (tm_load_api(&_lua_tmb) < 0)
+               {
+                       LM_ERR("cannot bind to TM API\n");
+                       return -1;
+               }
+               LM_DBG("loaded tm api\n");
+               /* bind the TM XAPI */
+               if (tm_load_xapi(&_lua_xtmb) < 0)
+               {
+                       LM_ERR("cannot bind to TM XAPI\n");
+                       return -1;
+               }
+               LM_DBG("loaded tm xapi\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SQLOPS)
+       {
+               /* bind the SQLOPS API */
+               if (sqlops_load_api(&_lua_sqlopsb) < 0)
+               {
+                       LM_ERR("cannot bind to SQLOPS API\n");
+                       return -1;
+               }
+               LM_DBG("loaded sqlops api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RR)
+       {
+               /* bind the RR API */
                if (rr_load_api(&_lua_rrb) < 0)
                {
                        LM_ERR("cannot bind to RR API\n");
@@ -1625,6 +2304,76 @@ int lua_sr_exp_init_mod(void)
                }
                LM_DBG("loaded presence_xml api\n");
        }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TEXTOPS)
+       {
+               /* bind the TEXTOPS API */
+               if (load_textops_api(&_lua_textopsb) < 0)
+               {
+                       LM_ERR("cannot bind to TEXTOPS API\n");
+                       return -1;
+               }
+               LM_DBG("loaded textops api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_PUA_USRLOC)
+       {
+               /* bind the PUA_USRLOC API */
+               if (pua_usrloc_load_api(&_lua_pua_usrlocb) < 0)
+               {
+                       LM_ERR("cannot bind to PUA_USRLOC API\n");
+                       return -1;
+               }
+               LM_DBG("loaded pua_usrloc api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SIPUTILS)
+       {
+               /* bind the SIPUTILS API */
+               if (siputils_load_api(&_lua_siputilsb) < 0)
+               {
+                       LM_ERR("cannot bind to SIPUTILS API\n");
+                       return -1;
+               }
+               LM_DBG("loaded siputils api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RLS)
+       {
+               /* bind the RLS API */
+               if (rls_load_api(&_lua_rlsb) < 0)
+               {
+                       LM_ERR("cannot bind to RLS API\n");
+                       return -1;
+               }
+               LM_DBG("loaded rls api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_ALIAS_DB)
+       {
+               /* bind the ALIAS_DB API */
+               if (alias_db_load_api(&_lua_alias_dbb) < 0)
+               {
+                       LM_ERR("cannot bind to ALIAS_DB API\n");
+                       return -1;
+               }
+               LM_DBG("loaded alias_db api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_MSILO)
+       {
+               /* bind the MSILO API */
+               if (load_msilo_api(&_lua_msilob) < 0)
+               {
+                       LM_ERR("cannot bind to MSILO API\n");
+                       return -1;
+               }
+               LM_DBG("loaded msilo api\n");
+       }
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_UAC)
+       {
+               /* bind the UAC API */
+               if (load_uac_api(&_lua_uacb) < 0)
+               {
+                       LM_ERR("cannot bind to UAC API\n");
+                       return -1;
+               }
+               LM_DBG("loaded uac api\n");
+       }
        return 0;
 }
 
@@ -1677,6 +2426,27 @@ int lua_sr_exp_register_mod(char *mname)
        } else  if(len==12 && strcmp(mname, "presence_xml")==0) {
                _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_PRESENCE_XML;
                return 0;
+       } else  if(len==7 && strcmp(mname, "textops")==0) {
+               _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_TEXTOPS;
+               return 0;
+       } else  if(len==10 && strcmp(mname, "pua_usrloc")==0) {
+               _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_PUA_USRLOC;
+               return 0;
+       } else  if(len==8 && strcmp(mname, "siputils")==0) {
+               _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_SIPUTILS;
+               return 0;
+       } else  if(len==3 && strcmp(mname, "rls")==0) {
+               _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_RLS;
+               return 0;
+       } else  if(len==8 && strcmp(mname, "alias_db")==0) {
+               _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_ALIAS_DB;
+               return 0;
+       } else  if(len==5 && strcmp(mname, "msilo")==0) {
+               _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_MSILO;
+               return 0;
+       } else  if(len==3 && strcmp(mname, "uac")==0) {
+               _sr_lua_exp_reg_mods |= SR_LUA_EXP_MOD_UAC;
+               return 0;
        }
 
        return -1;
@@ -1713,5 +2483,19 @@ void lua_sr_exp_openlibs(lua_State *L)
                luaL_openlib(L, "sr.presence",     _sr_presence_Map,  0);
        if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_PRESENCE_XML)
                luaL_openlib(L, "sr.presence_xml", _sr_presence_xml_Map, 0);
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_TEXTOPS)
+               luaL_openlib(L, "sr.textops", _sr_textops_Map,        0);
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_PUA_USRLOC)
+               luaL_openlib(L, "sr.pua_usrloc", _sr_pua_usrloc_Map,  0);
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_SIPUTILS)
+               luaL_openlib(L, "sr.siputils", _sr_siputils_Map,      0);
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_RLS)
+               luaL_openlib(L, "sr.rls", _sr_rls_Map,                0);
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_ALIAS_DB)
+               luaL_openlib(L, "sr.alias_db", _sr_alias_db_Map,      0);
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_MSILO)
+               luaL_openlib(L, "sr.msilo", _sr_msilo_Map,            0);
+       if(_sr_lua_exp_reg_mods&SR_LUA_EXP_MOD_UAC)
+               luaL_openlib(L, "sr.uac", _sr_uac_Map,                0);
 }
 
index c89c928..c178551 100644 (file)
@@ -85,7 +85,7 @@ struct module_exports exports = {
 static int
 mod_init(void)
 {
-    char *dname, *bname, *tname;
+    char *dname, *bname, *dname_src, *bname_src;
     int i;
     PyObject *sys_path, *pDir, *pModule, *pFunc, *pArgs;
     PyThreadState *mainThreadState;
@@ -100,19 +100,19 @@ mod_init(void)
         child_init_mname.len = strlen(child_init_mname.s);
     }
 
-    tname = as_asciiz(&script_name);
-       if(tname==NULL)
-       {
-               LM_ERR("no more pkg memory\n");
-               return -1;
-       }
-    dname = dirname(tname);
+    dname_src = as_asciiz(&script_name);
+    bname_src = as_asciiz(&script_name);
+    if(dname_src==NULL || bname_src==NULL)
+    {
+            LM_ERR("no more pkg memory\n");
+            return -1;
+    }
+
+    dname = dirname(dname_src);
     if (strlen(dname) == 0)
         dname = ".";
-       memcpy(tname, script_name.s, script_name.len);
-    bname = basename(tname);
+    bname = basename(bname_src);
     i = strlen(bname);
-       pkg_free(tname);
     if (bname[i - 1] == 'c' || bname[i - 1] == 'o')
         i -= 1;
     if (bname[i - 3] == '.' && bname[i - 2] == 'p' && bname[i - 1] == 'y') {
@@ -159,6 +159,9 @@ mod_init(void)
         return -1;
     }
 
+    pkg_free(dname_src);
+    pkg_free(bname_src);
+
     pFunc = PyObject_GetAttrString(pModule, mod_init_fname.s);
     Py_DECREF(pModule);
     /* pFunc is a new reference */
index 45d0971..21b2cc2 100644 (file)
@@ -10,7 +10,7 @@ Daniel-Constantin Mierla
 
    <miconda@gmail.com>
 
-   Copyright Â© 2011 asipto.com
+   Copyright © 2011 asipto.com
      __________________________________________________________________
 
    Table of Contents
@@ -107,7 +107,7 @@ modparam("async", "workers", 2)
    4.1. async_route(routename, seconds)
    4.2. async_sleep(seconds)
 
-4.1.  async_route(routename, seconds)
+4.1. async_route(routename, seconds)
 
    Simulate a sleep of 'seconds' and then continue the processing of SIP
    request with the route[routename]. In case of internal errors, the
@@ -126,6 +126,8 @@ modparam("async", "workers", 2)
    that the execution of config after resume will end once the
    route[routename] is finished.
 
+   This function can be used from REQUEST_ROUTE.
+
    Example 1.2. async_sleep usage
 ...
 async_route("RESUME", "4");
@@ -136,7 +138,7 @@ route[RESUME] {
 }
 ...
 
-4.2.  async_sleep(seconds)
+4.2. async_sleep(seconds)
 
    Simulate a sleep of 'seconds' and then continue the processing of SIP
    request with the next action. In case of internal errors, the function
@@ -152,6 +154,8 @@ route[RESUME] {
    that the execution of config after resume will end once the route block
    where async_sleep() is called is finished.
 
+   This function can be used from REQUEST_ROUTE.
+
    Example 1.3. async_sleep usage
 ...
 async_sleep("4");
index 17c7179..26e94b7 100644 (file)
@@ -56,9 +56,9 @@ struct tm_binds tmb;
 
 static cmd_export_t cmds[]={
        {"async_route", (cmd_function)w_async_route, 2, fixup_async_route,
-               0, REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
+               0, REQUEST_ROUTE|FAILURE_ROUTE},
        {"async_sleep", (cmd_function)w_async_sleep, 1, fixup_async_sleep,
-               0, REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE},
+               0, REQUEST_ROUTE|FAILURE_ROUTE},
        {0, 0, 0, 0, 0, 0}
 };
 
index 37b9a75..e4ddde4 100644 (file)
@@ -112,6 +112,9 @@ modparam("async", "workers", 2)
                that the execution of config after resume will end once the
                route[routename] is finished.
                </para>
+               <para>
+               This function can be used from REQUEST_ROUTE.
+               </para>
                <example>
                <title><function>async_sleep</function> usage</title>
                <programlisting format="linespecific">
@@ -148,6 +151,9 @@ route[RESUME] {
                that the execution of config after resume will end once the route block
                where async_sleep() is called is finished.
                </para>
+               <para>
+               This function can be used from REQUEST_ROUTE.
+               </para>
                <example>
                <title><function>async_sleep</function> usage</title>
                <programlisting format="linespecific">
index 04d7594..a29bcf5 100644 (file)
@@ -15,7 +15,7 @@ Daniel-Constantin Mierla
    asipto.com
    <miconda@gmail.com>
 
-   Copyright Â© 2002, 2003 FhG FOKUS
+   Copyright © 2002, 2003 FhG FOKUS
      __________________________________________________________________
 
    1.1. Overview
@@ -43,8 +43,9 @@ Daniel-Constantin Mierla
         1.4.1. consume_credentials()
         1.4.2. www_challenge(realm, flags)
         1.4.3. proxy_challenge(realm, flags)
-        1.4.4. pv_www_authenticate(realm, passwd, flags)
-        1.4.5. pv_proxy_authenticate(realm, passwd, flags)
+        1.4.4. auth_challenge(realm, flags)
+        1.4.5. pv_www_authenticate(realm, passwd, flags)
+        1.4.6. pv_proxy_authenticate(realm, passwd, flags)
 
 1.1. Overview
 
@@ -66,7 +67,7 @@ Daniel-Constantin Mierla
 
 1.3. Parameters
 
-1.3.1.  auth_checks_register, auth_checks_no_dlg, and auth_checks_in_dlg
+1.3.1. auth_checks_register, auth_checks_no_dlg, and auth_checks_in_dlg
 (flags)
 
    These three module parameters control which optional integrity checks
@@ -514,7 +515,7 @@ if (www_authenticate("realm", "subscriber)) {
 };
 ...
 
-1.4.2.  www_challenge(realm, flags)
+1.4.2. www_challenge(realm, flags)
 
    The function challenges a user agent. It will generate a WWW-Authorize
    header field containing a digest challenge, it will put the header
@@ -528,7 +529,7 @@ if (www_authenticate("realm", "subscriber)) {
      * realm - Realm is a opaque string that the user agent should present
        to the user so he can decide what username and password to use.
        Usually this is domain of the host the server is running on.
-       It must not be empty string “”. In case of REGISTER requests To
+       It must not be empty string "". In case of REGISTER requests To
        header field domain (e.g., variable $td) can be used (because this
        header field represents the user being registered), for all other
        messages From header field domain can be used (e.g., variable $fd).
@@ -550,7 +551,7 @@ if (!www_authenticate("$td", "subscriber")) {
 }
 ...
 
-1.4.3.  proxy_challenge(realm, flags)
+1.4.3. proxy_challenge(realm, flags)
 
    The function challenges a user agent. It will generate a
    Proxy-Authorize header field containing a digest challenge, it will put
@@ -567,12 +568,31 @@ if (!www_authenticate("$td", "subscriber")) {
 
    Example 16. proxy_challenge usage
 ...
-if (!proxy_authenticate("$fd", "subscriber)) {
+if (!proxy_authenticate("$fd", "subscriber")) {
         proxy_challenge("$fd", "1");
 };
 ...
 
-1.4.4.  pv_www_authenticate(realm, passwd, flags)
+1.4.4. auth_challenge(realm, flags)
+
+   The function challenges a user agent for authentication. It combines
+   the functions www_challenge() and proxy_challenge(), by calling
+   internally the first one for REGISTER requests and the second one for
+   the rest of the request types.
+
+   Meaning of the parameters the same as for function www_challenge(realm,
+   flags)
+
+   This function can be used from REQUEST_ROUTE.
+
+   Example 17. proxy_challenge usage
+...
+if (!auth_check("$fd", "subscriber", "1")) {
+        auth_challenge("$fd", "1");
+};
+...
+
+1.4.5. pv_www_authenticate(realm, passwd, flags)
 
    The function verifies credentials according to RFC2617. If the
    credentials are verified successfully then the function will succeed
@@ -596,7 +616,7 @@ if (!proxy_authenticate("$fd", "subscriber)) {
      * realm - Realm is a opaque string that the user agent should present
        to the user so he can decide what username and password to use.
        Usually this is domain of the host the server is running on.
-       It must not be empty string “”. In case of REGISTER requests To
+       It must not be empty string "". In case of REGISTER requests To
        header field domain (e.g., varibale $td) can be used (because this
        header field represents a user being registered), for all other
        messages From header field domain can be used (e.g., varibale $fd).
@@ -616,14 +636,14 @@ if (!proxy_authenticate("$fd", "subscriber)) {
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 17. pv_www_authenticate usage
+   Example 18. pv_www_authenticate usage
 ...
 if (!pv_www_authenticate("$td", "123abc", "0")) {
         www_challenge("$td", "1");
 };
 ...
 
-1.4.5.  pv_proxy_authenticate(realm, passwd, flags)
+1.4.6. pv_proxy_authenticate(realm, passwd, flags)
 
    The function verifies credentials according to RFC2617. If the
    credentials are verified successfully then the function will succeed
@@ -638,7 +658,7 @@ if (!pv_www_authenticate("$td", "123abc", "0")) {
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 18. pv_proxy_authenticate usage
+   Example 19. pv_proxy_authenticate usage
 ...
 $avp(password)="xyz";
 if (!pv_proxy_authenticate("$fd", "$avp(password)", "0")) {
index 976a547..9e21c0c 100644 (file)
@@ -44,6 +44,7 @@
  * return codes to config by auth functions
  */
 typedef enum auth_cfg_result {
+       AUTH_USER_MISMATCH = -8,    /*!< Auth user != From/To user */
        AUTH_NONCE_REUSED = -6,     /*!< Returned if nonce is used more than once */
        AUTH_NO_CREDENTIALS = -5,   /*!< Credentials missing */
        AUTH_STALE_NONCE = -4,      /*!< Stale nonce */
index a28c2ba..4dabc10 100644 (file)
@@ -87,6 +87,7 @@ static int fixup_pv_auth(void **param, int param_no);
 
 static int proxy_challenge(struct sip_msg *msg, char* realm, char *flags);
 static int www_challenge(struct sip_msg *msg, char* realm, char *flags);
+static int w_auth_challenge(struct sip_msg *msg, char* realm, char *flags);
 static int fixup_auth_challenge(void **param, int param_no);
 
 
@@ -138,6 +139,8 @@ static cmd_export_t cmds[] = {
                        fixup_auth_challenge, REQUEST_ROUTE},
     {"proxy_challenge",        (cmd_function)proxy_challenge,        2,
                        fixup_auth_challenge, REQUEST_ROUTE},
+    {"auth_challenge",         (cmd_function)w_auth_challenge,       2,
+                       fixup_auth_challenge, REQUEST_ROUTE},
     {"pv_www_authorize",       (cmd_function)pv_www_authenticate,    3,
                        fixup_pv_auth, REQUEST_ROUTE},
     {"pv_www_authenticate",    (cmd_function)pv_www_authenticate,    3,
@@ -749,6 +752,47 @@ error:
        return -1;
 }
 
+/**
+ *
+ */
+static int w_auth_challenge(struct sip_msg *msg, char* realm, char *flags)
+{
+       int vflags = 0;
+       str srealm  = {0, 0};
+
+       if((msg->REQ_METHOD == METHOD_ACK) || (msg->REQ_METHOD == METHOD_CANCEL)) {
+               return 1;
+       }
+
+       if(get_str_fparam(&srealm, msg, (fparam_t*)realm) < 0) {
+               LM_ERR("failed to get realm value\n");
+               goto error;
+       }
+
+       if(srealm.len==0) {
+               LM_ERR("invalid realm value - empty content\n");
+               goto error;
+       }
+
+       if(get_int_fparam(&vflags, msg, (fparam_t*)flags) < 0) {
+               LM_ERR("invalid flags value\n");
+               goto error;
+       }
+
+       if(msg->REQ_METHOD==METHOD_REGISTER)
+               return auth_challenge(msg, &srealm, vflags, HDR_AUTHORIZATION_T);
+       else
+               return auth_challenge(msg, &srealm, vflags, HDR_PROXYAUTH_T);
+
+error:
+       if(!(vflags&4)) {
+               if(auth_send_reply(msg, 500, "Internal Server Error", 0, 0) <0 )
+                       return -4;
+       }
+       return -1;
+}
+
+
 /**
  * @brief fixup function for {www,proxy}_challenge
  */
index d328def..f094e44 100644 (file)
@@ -126,7 +126,7 @@ if (!www_authenticate("$td", "subscriber")) {
                <title>proxy_challenge usage</title>
                <programlisting format="linespecific">
 ...
-if (!proxy_authenticate("$fd", "subscriber)) {
+if (!proxy_authenticate("$fd", "subscriber")) {
        proxy_challenge("$fd", "1");
 };
 ...
@@ -134,6 +134,33 @@ if (!proxy_authenticate("$fd", "subscriber)) {
                </example>
        </section>
 
+       <section id="auth_challenge">
+               <title>
+                       <function moreinfo="none">auth_challenge(realm, flags)</function>
+               </title>
+               <para>
+               The function challenges a user agent for authentication. It combines
+               the functions www_challenge() and proxy_challenge(), by calling
+               internally the first one for REGISTER requests and the second one for
+               the rest of the request types.
+               </para>
+               <para>Meaning of the parameters the same as for function
+               www_challenge(realm, flags)</para>
+               <para>
+               This function can be used from REQUEST_ROUTE.
+               </para>
+               <example>
+               <title>proxy_challenge usage</title>
+               <programlisting format="linespecific">
+...
+if (!auth_check("$fd", "subscriber", "1")) {
+       auth_challenge("$fd", "1");
+};
+...
+</programlisting>
+               </example>
+       </section>
+
        <section id="pv_www_authenticate">
                <title>
                <function moreinfo="none">pv_www_authenticate(realm, passwd, flags)</function>
index c50af47..5c10c17 100644 (file)
@@ -4,7 +4,13 @@
 #ifndef __ctl_defaults_h
 #define __ctl_defaults_h
 /*listen by default on: */
+#ifdef SRNAME
+/* this is used when compiling sercmd tool */
+#define DEFAULT_CTL_SOCKET  "unixs:/tmp/" SRNAME "_ctl"
+#else
+/* this is used when compiling sip server */
 #define DEFAULT_CTL_SOCKET  "unixs:/tmp/" NAME "_ctl"
+#endif
 /* port used by default for tcp/udp if no port is explicitely specified */
 #define DEFAULT_CTL_PORT 2049
 
index 1adf86d..81bac08 100644 (file)
@@ -108,6 +108,13 @@ struct module_exports exports = {
 };
 
 
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+       if(db_api_init()<0)
+               return -1;
+       return 0;
+}
+
 static int bdb_mod_init(void)
 {
        bdb_params_t p;
index d350d8e..61af129 100644 (file)
@@ -129,7 +129,7 @@ int km_mod_init(void)
        if(km_bdblib_init(&p))
                return -1;
 
-       return db_query_init();
+       return 0;
 }
 
 void km_destroy(void)
index efbe6e1..043a8fd 100644 (file)
@@ -139,6 +139,13 @@ struct module_exports exports = {
 };
 
 
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+       if(db_api_init()<0)
+               return -1;
+       return 0;
+}
+
 static int mod_init(void)
 {
        if (flat_delimiter.len != 1) {
index 1f758ba..462dc60 100644 (file)
@@ -90,7 +90,7 @@ struct kam_module_exports kam_exports = {
 int kam_mysql_mod_init(void)
 {
        LM_DBG("MySQL client version is %s\n", mysql_get_client_info());
-       return db_mysql_alloc_buffer();
+       return 0;
 }
 
 int db_mysql_bind_api(db_func_t *dbb)
index 4705ca0..9fd9747 100644 (file)
@@ -47,4 +47,11 @@ int db_mysql_bind_api(db_func_t *dbb);
 
 int kam_mysql_mod_init(void);
 
+/**
+ * Allocate a buffer for database module
+ * No function should be called before this
+ * \return zero on success, negative value on failure
+ */
+int db_mysql_alloc_buffer(void);
+
 #endif /* KM_DB_MOD_H */
index d85fe5f..da429d6 100644 (file)
@@ -50,7 +50,7 @@
 #include "km_db_mysql.h"
 #include "km_dbase.h"
 
-static char *sql_buf;
+static char *mysql_sql_buf;
 
 
 /**
@@ -513,32 +513,32 @@ int db_mysql_affected_rows(const db1_con_t* _h)
                return -1;
        }
  
-       ret = snprintf(sql_buf, sql_buffer_size, "insert into %.*s (", CON_TABLE(_h)->len, CON_TABLE(_h)->s);
+       ret = snprintf(mysql_sql_buf, sql_buffer_size, "insert into %.*s (", CON_TABLE(_h)->len, CON_TABLE(_h)->s);
        if (ret < 0 || ret >= sql_buffer_size) goto error;
        off = ret;
 
-       ret = db_print_columns(sql_buf + off, sql_buffer_size - off, _k, _n);
+       ret = db_print_columns(mysql_sql_buf + off, sql_buffer_size - off, _k, _n);
        if (ret < 0) return -1;
        off += ret;
 
-       ret = snprintf(sql_buf + off, sql_buffer_size - off, ") values (");
+       ret = snprintf(mysql_sql_buf + off, sql_buffer_size - off, ") values (");
        if (ret < 0 || ret >= (sql_buffer_size - off)) goto error;
        off += ret;
-       ret = db_print_values(_h, sql_buf + off, sql_buffer_size - off, _v, _n, db_mysql_val2str);
+       ret = db_print_values(_h, mysql_sql_buf + off, sql_buffer_size - off, _v, _n, db_mysql_val2str);
        if (ret < 0) return -1;
        off += ret;
 
-       *(sql_buf + off++) = ')';
+       *(mysql_sql_buf + off++) = ')';
        
-       ret = snprintf(sql_buf + off, sql_buffer_size - off, " on duplicate key update ");
+       ret = snprintf(mysql_sql_buf + off, sql_buffer_size - off, " on duplicate key update ");
        if (ret < 0 || ret >= (sql_buffer_size - off)) goto error;
        off += ret;
        
-       ret = db_print_set(_h, sql_buf + off, sql_buffer_size - off, _k, _v, _n, db_mysql_val2str);
+       ret = db_print_set(_h, mysql_sql_buf + off, sql_buffer_size - off, _k, _v, _n, db_mysql_val2str);
        if (ret < 0) return -1;
        off += ret;
        
-       sql_str.s = sql_buf;
+       sql_str.s = mysql_sql_buf;
        sql_str.len = off;
  
        if (db_mysql_submit_query(_h, &sql_str) < 0) {
@@ -587,14 +587,14 @@ int db_mysql_use_table(db1_con_t* _h, const str* _t)
  */
 int db_mysql_alloc_buffer(void)
 {
-    if (db_query_init())
+    if (db_api_init())
     {
-        LM_ERR("Failed to initialise db_query\n");
+        LM_ERR("Failed to initialise db api\n");
                return -1;
     }
 
-    sql_buf = (char*)malloc(sql_buffer_size);
-    if (sql_buf == NULL)
+    mysql_sql_buf = (char*)malloc(sql_buffer_size);
+    if (mysql_sql_buf == NULL)
         return -1;
     else
         return 0;
index 68e4e8e..a2b5f92 100644 (file)
@@ -139,11 +139,4 @@ int db_mysql_insert_delayed(const db1_con_t* _h, const db_key_t* _k,
 int db_mysql_use_table(db1_con_t* _h, const str* _t);
 
 
-/**
- * Allocate a buffer for database module
- * No function should be called before this
- * \return zero on success, negative value on failure
- */
-int db_mysql_alloc_buffer(void);
-
 #endif /* KM_DBASE_H */
index 127ad52..74c61af 100644 (file)
@@ -124,6 +124,13 @@ struct module_exports exports = {
 };
 
 
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+       if(db_mysql_alloc_buffer()<0)
+               return -1;
+       return 0;
+}
+
 static int mysql_mod_init(void)
 {
 #if MYSQL_VERSION_ID >= 40101
index 73da2ae..9b0bd8b 100644 (file)
@@ -73,7 +73,7 @@ struct kam_module_exports kam_exports = {
 
 int km_postgres_mod_init(void)
 {
-       return db_query_init();
+       return 0;
 }
 
 int db_postgres_bind_api(db_func_t *dbb)
index 3c1e2d9..c560c9d 100644 (file)
@@ -530,6 +530,13 @@ int pg_test(void)
 }
 #endif /* PG_TEST */
 
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+       if(db_api_init()<0)
+               return -1;
+       return 0;
+}
+
 static int pg_mod_init(void)
 {
 #ifdef PG_TEST
index 3036a3f..b7acda1 100644 (file)
@@ -12,9 +12,9 @@ Edited by
 
 Juha Heinanen
 
-   Copyright Â© 2007-2008 Voice Sistem SRL
+   Copyright © 2007-2008 Voice Sistem SRL
 
-   Copyright Â© 2008-2010 Juha Heinanen
+   Copyright © 2008-2010 Juha Heinanen
      __________________________________________________________________
 
    Table of Contents
@@ -78,6 +78,7 @@ Juha Heinanen
    1.12. Set fetch_rows parameter
    1.13. dp_translate usage
    1.14. dp_translate usage
+   1.15. Example of rules
 
 Chapter 1. Admin Guide
 
@@ -137,12 +138,13 @@ Chapter 1. Admin Guide
    the matching transformation.
 
    The module expects an input value which will be matched against a rule
-   by using regular expressions (see 'man pcresyntax' for syntax) or
-   string matching. Overlapping matching expressions can be controlled via
-   priorities. Once a rule is matched, the defined transformation (if any)
-   is applied and the result is returned as output value. Also, if any
-   string attribute is associated to the rule, this will be returned to
-   the script along with the output value.
+   by using regular expressions (see 'man pcresyntax' for syntax), string
+   or fnmatch (see 'man fnmatch') matching. Overlapping matching
+   expressions can be controlled via priorities. Once a rule is matched,
+   the defined transformation (if any) is applied and the result is
+   returned as output value. Also, if any string attribute is associated
+   to the rule, this will be returned to the script along with the output
+   value.
 
    The first matching rule will be processed.
 
@@ -198,7 +200,7 @@ Chapter 1. Admin Guide
 
    The translation rules will be loaded using this database URL.
 
-   Default value is “mysql://openser:openserrw@localhost/openser”.
+   Default value is "mysql://openser:openserrw@localhost/openser".
 
    Example 1.1. Set db_url parameter
 ...
@@ -209,7 +211,7 @@ modparam("dialplan", "db_url", "mysql://user:passwb@localhost/db")
 
    The table's name from which to load the translation rules.
 
-   Default value is “dialplan”.
+   Default value is "dialplan".
 
    Example 1.2. Set table_name parameter
 ...
@@ -220,7 +222,7 @@ modparam("dialplan", "table_name", "my_table")
 
    The column name used to store the dialplan ID group.
 
-   Default value is “dpid”.
+   Default value is "dpid".
 
    Example 1.3. Set dpid_col parameter
 ...
@@ -232,7 +234,7 @@ modparam("dialplan", "dpid_col", "column_name")
    The column name used to store the priority of the corresponding rule
    from the database row.
 
-   Default value is “pr”.
+   Default value is "pr".
 
    Example 1.4. Set pr_col parameter
 ...
@@ -243,7 +245,7 @@ modparam("dialplan", "pr_col", "column_name")
 
    The column name used to store the type of matching of the rule.
 
-   Default value is “match_op”.
+   Default value is "match_op".
 
    Example 1.5. Set match_op_col parameter
 ...
@@ -254,7 +256,7 @@ modparam("dialplan", "match_op_col", "column_name")
 
    The column name to store the rule match expression.
 
-   Default value is “match_exp”.
+   Default value is "match_exp".
 
    Example 1.6. Set match_exp_col parameter
 ...
@@ -266,7 +268,7 @@ modparam("dialplan", "match_exp_col", "column_name")
    The column name to store the length of a string matching the match
    expression.
 
-   Default value is “match_len”.
+   Default value is "match_len".
 
    Example 1.7. Set pr_col parameter
 ...
@@ -277,7 +279,7 @@ modparam("dialplan", "match_len_col", "column_name")
 
    The column name to store the rule's substitution expression.
 
-   Default value is “subst_exp”.
+   Default value is "subst_exp".
 
    Example 1.8. Set pr_col parameter
 ...
@@ -288,7 +290,7 @@ modparam("dialplan", "subst_exp_col", "column_name")
 
    The column name to store the rule's replacement expression.
 
-   Default value is “repl_exp”.
+   Default value is "repl_exp".
 
    Example 1.9. Set repl_exp_col parameter
 ...
@@ -300,7 +302,7 @@ modparam("dialplan", "repl_exp_col", "column_name")
    The column name to store the rule's attributes to be set to the
    message.
 
-   Default value is “attrs”.
+   Default value is "attrs".
 
    Example 1.10. Set attrs_col parameter
 ...
@@ -313,7 +315,7 @@ modparam("dialplan", "attrs_col", "column_name")
    (dp_translate() succeeds). This parameter can be an AVP or a SCRIPT
    VAR.
 
-   Default value is “NULL”.
+   Default value is "NULL".
 
    Example 1.11. Set attrs_pvar parameter
 ...
@@ -324,7 +326,7 @@ modparam("dialplan", "attrs_pvar", "$avp(s:dest)")
 
    The number of rows to be fetched at once from database
 
-   Default value is “1000”.
+   Default value is "1000".
 
    Example 1.12. Set fetch_rows parameter
 ...
@@ -335,7 +337,7 @@ modparam("dialplan", "fetch_rows", 4000)
 
    6.1. dp_translate(id, src[/dest])
 
-6.1.  dp_translate(id, src[/dest])
+6.1. dp_translate(id, src[/dest])
 
    Will try to translate src into dest according to the translation rules
    with dialplan ID equal to id. If dest is missing, only matching and
@@ -353,7 +355,7 @@ modparam("dialplan", "fetch_rows", 4000)
           + script var - the dialplan id is the value of an existing
             script variable.
      * src/dest - input and output of the function. If this parameter is
-       missing the default parameter “ruri.user/ruri.user” will be used,
+       missing the default parameter "ruri.user/ruri.user" will be used,
        thus translating the request uri user part.
        Input parameter src can be any pseudo variable. Output parameter
        dest can be:
@@ -368,7 +370,7 @@ modparam("dialplan", "fetch_rows", 4000)
             existing script variable. At output the function will set an
             script variable with the value of the output string.
 
-   This function can be used from REQUEST_ROUTE, BRANCH_ROUTE.
+   This function can be used from ANY_ROUTE.
 
    Example 1.13. dp_translate usage
 ...
@@ -456,6 +458,41 @@ xlog("translated to var $var(y) \n");
    the complete database documentation on the project webpage,
    http://www.kamailio.org/docs/db-tables/kamailio-db-devel.html.
 
+   Some sample records fromd dialplan table are presented in the next
+   figure.
+
+   Example 1.15. Example of rules
+...
+dpid: 1
+pr: 1
+match_op: 1
+match_exp: ^0([1-9][0-9]+)$
+match_len: 0
+subst_exp: ^0([1-9][0-9]+)$
+repl_exp: 0049\1
+attrs: xyz
+...
+dpid: 1
+pr: 1
+match_op: 1
+match_exp: ^0([1-9][0-9]+)$
+match_len: 0
+subst_exp: ^0(.+)$
+repl_exp: $var(prefix)\1
+attrs: xyz
+...
+
+   Note that you can use config variables in the replacement expression
+   (repl_exp) field. However, not all of config variables are safe to use
+   there - specifically the variables that have in their name other
+   variables (variables with dinamic name). References to sip message,
+   private variables ($var(...)) and AVPs with static name are among those
+   that are safe to use in replacement expressions.
+
+   The match_op field specify matching operator, valid value being: 0 -
+   string comparison; 1 - regular expression matching (pcre); 2 - fnmatch
+   (shell-like pattern) matching.
+
 Chapter 2. Developer's Guide
 
    The module does not provide any API to use in other Kamailio modules.
index 5d3a100..7b9a706 100644 (file)
@@ -111,9 +111,9 @@ static mi_export_t mi_cmds[] = {
 
 static cmd_export_t cmds[]={
        {"dp_translate",(cmd_function)dp_translate_f,   2,      dp_trans_fixup,  0,
-                               ANY_ROUTE},
+               ANY_ROUTE},
        {"dp_translate",(cmd_function)dp_translate_f,   1,      dp_trans_fixup,  0,
-                               ANY_ROUTE},
+               ANY_ROUTE},
        {0,0,0,0,0,0}
 };
 
@@ -168,10 +168,10 @@ static int mod_init(void)
 
                attr_pvar_s.len = strlen(attr_pvar_s.s);
                if( (pv_parse_spec(&attr_pvar_s, attr_pvar)==NULL) ||
-               ((attr_pvar->type != PVT_AVP) && (attr_pvar->type!=PVT_SCRIPTVAR))) {
-                               LM_ERR("invalid pvar name\n");
-                               return -1;
-                       }
+                               ((attr_pvar->type != PVT_AVP) && (attr_pvar->type!=PVT_SCRIPTVAR))) {
+                       LM_ERR("invalid pvar name\n");
+                       return -1;
+               }
        }
 
        default_par2 = (dp_param_p)shm_malloc(sizeof(dp_param_t));
@@ -228,7 +228,7 @@ static void mod_destroy(void)
 
 static int mi_child_init(void)
 {
-    return 0;
+       return 0;
 }
 
 
@@ -245,7 +245,7 @@ static int dp_get_ivalue(struct sip_msg* msg, dp_param_p dp, int *val)
        LM_DBG("searching %d\n",dp->v.sp[0].type);
 
        if( pv_get_spec_value( msg, &dp->v.sp[0], &value)!=0
-       || value.flags&(PV_VAL_NULL|PV_VAL_EMPTY) || !(value.flags&PV_VAL_INT)) {
+                       || value.flags&(PV_VAL_NULL|PV_VAL_EMPTY) || !(value.flags&PV_VAL_INT)) {
                LM_ERR("no AVP or SCRIPTVAR found (error in scripts)\n");
                return -1;
        }
@@ -261,9 +261,9 @@ static int dp_get_svalue(struct sip_msg * msg, pv_spec_t spec, str* val)
        LM_DBG("searching %d \n", spec.type);
 
        if ( pv_get_spec_value(msg,&spec,&value)!=0 || value.flags&PV_VAL_NULL
-       || value.flags&PV_VAL_EMPTY || !(value.flags&PV_VAL_STR)){
-                       LM_ERR("no AVP or SCRIPTVAR found (error in scripts)\n");
-                       return -1;
+                       || value.flags&PV_VAL_EMPTY || !(value.flags&PV_VAL_STR)){
+               LM_ERR("no AVP or SCRIPTVAR found (error in scripts)\n");
+               return -1;
        }
 
        *val = value.rs;
@@ -272,7 +272,7 @@ static int dp_get_svalue(struct sip_msg * msg, pv_spec_t spec, str* val)
 
 
 static int dp_update(struct sip_msg * msg, pv_spec_t * src, pv_spec_t * dest,
-                    str * repl, str * attrs)
+               str * repl, str * attrs)
 {
        int no_change;
        pv_value_t val;
@@ -293,7 +293,7 @@ static int dp_update(struct sip_msg * msg, pv_spec_t * src, pv_spec_t * dest,
        }
 
        if(is_route_type(FAILURE_ROUTE)
-                               && (dest->type==PVT_RURI || dest->type==PVT_RURI_USERNAME)) {
+                       && (dest->type==PVT_RURI || dest->type==PVT_RURI_USERNAME)) {
                if (append_branch(msg, 0, 0, 0, Q_UNSPECIFIED, 0, 0)!=1 ){
                        LM_ERR("append_branch action failed\n");
                        return -1;
@@ -304,7 +304,7 @@ set_attr_pvar:
 
        if(!attr_pvar)
                return 0;
-       
+
        val.rs = *attrs;
        if(attr_pvar->setf(msg, &attr_pvar->pvp, (int)EQ_T, &val)<0)
        {
@@ -350,7 +350,7 @@ static int dp_translate_f(struct sip_msg* msg, char* str1, char* str2)
        attrs_par = (!attr_pvar)?NULL:&attrs;
        if (translate(msg, input, &output, idp, attrs_par)!=0){
                LM_DBG("could not translate %.*s "
-                       "with dpid %i\n", input.len, input.s, idp->dp_id);
+                               "with dpid %i\n", input.len, input.s, idp->dp_id);
                return -1;
        }
        LM_DBG("input %.*s with dpid %i => output %.*s\n",
@@ -358,26 +358,26 @@ static int dp_translate_f(struct sip_msg* msg, char* str1, char* str2)
 
        /*set the output*/
        if (dp_update(msg, &repl_par->v.sp[0], &repl_par->v.sp[1], 
-       &output, attrs_par) !=0){
+                               &output, attrs_par) !=0){
                LM_ERR("cannot set the output\n");
                return -1;
        }
 
        return 1;
-               
+
 }
 
 #define verify_par_type(_par_no, _spec)\
        do{\
                if( ((_par_no == 1) \
-                       && ((_spec).type != PVT_AVP) && ((_spec).type!=PVT_SCRIPTVAR) )\
-                 ||((_par_no == 2) \
-                       && ((_spec).type != PVT_AVP) && ((_spec).type!=PVT_SCRIPTVAR) \
-                       && ((_spec).type!=PVT_RURI) && (_spec.type!=PVT_RURI_USERNAME))){\
-                               \
+                                       && ((_spec).type != PVT_AVP) && ((_spec).type!=PVT_SCRIPTVAR) )\
+                               ||((_par_no == 2) \
+                                       && ((_spec).type != PVT_AVP) && ((_spec).type!=PVT_SCRIPTVAR) \
+                                       && ((_spec).type!=PVT_RURI) && (_spec.type!=PVT_RURI_USERNAME))){\
+                       \
                        LM_ERR("Unsupported Parameter TYPE\n");\
-                               return E_UNSPEC;\
-                       }\
+                       return E_UNSPEC;\
+               }\
        }while(0);
 
 
@@ -433,30 +433,30 @@ static int dp_trans_fixup(void ** param, int param_no){
                }
        } else {
 
-           if (((s = strchr(p, '/')) != 0) && (*(s+1)=='\0'))
-               goto error;
+               if (((s = strchr(p, '/')) != 0) && (*(s+1)=='\0'))
+                       goto error;
 
-           if (s != 0) {
-               *s = '\0'; s++;
-           }
+               if (s != 0) {
+                       *s = '\0'; s++;
+               }
 
-           lstr.s = p; lstr.len = strlen(p);
-           if(pv_parse_spec( &lstr, &dp_par->v.sp[0])==NULL)
-               goto error;
+               lstr.s = p; lstr.len = strlen(p);
+               if(pv_parse_spec( &lstr, &dp_par->v.sp[0])==NULL)
+                       goto error;
 
-           if (s != 0) {
-               lstr.s = s; lstr.len = strlen(s);
-               if (pv_parse_spec( &lstr, &dp_par->v.sp[1] )==NULL)
-                   goto error;
-               verify_par_type(param_no, dp_par->v.sp[1]);
-           } else {
-               dp_par->v.sp[1].type = PVT_NONE;
-           }
+               if (s != 0) {
+                       lstr.s = s; lstr.len = strlen(s);
+                       if (pv_parse_spec( &lstr, &dp_par->v.sp[1] )==NULL)
+                               goto error;
+                       verify_par_type(param_no, dp_par->v.sp[1]);
+               } else {
+                       dp_par->v.sp[1].type = PVT_NONE;
+               }
 
-           dp_par->type = DP_VAL_SPEC;
+               dp_par->type = DP_VAL_SPEC;
 
        }
-       
+
        *param = (void *)dp_par;
 
        return 0;
@@ -472,14 +472,14 @@ static struct mi_root * mi_reload_rules(struct mi_root *cmd_tree, void *param)
        struct mi_root* rpl_tree= NULL;
 
        if (dp_connect_db() < 0) {
-           LM_ERR("failed to reload rules fron database (db connect)\n");
-           return 0;
+               LM_ERR("failed to reload rules fron database (db connect)\n");
+               return 0;
        }
-           
+
        if(dp_load_db() != 0){
-           LM_ERR("failed to reload rules fron database (db load)\n");
-           dp_disconnect_db();
-           return 0;
+               LM_ERR("failed to reload rules fron database (db load)\n");
+               dp_disconnect_db();
+               return 0;
        }
 
        dp_disconnect_db();
@@ -487,7 +487,7 @@ static struct mi_root * mi_reload_rules(struct mi_root *cmd_tree, void *param)
        rpl_tree = init_mi_tree( 200, MI_OK_S, MI_OK_LEN);
        if (rpl_tree==0)
                return 0;
-       
+
        return rpl_tree;
 }
 
@@ -546,7 +546,7 @@ static struct mi_root * mi_translate(struct mi_root *cmd, void *param)
                        input.len, input.s, idp->dp_id);
        if (translate(NULL, input, &output, idp, &attrs)!=0){
                LM_DBG("could not translate %.*s with dpid %i\n", 
-                       input.len, input.s, idp->dp_id);
+                               input.len, input.s, idp->dp_id);
                return init_mi_tree(404, "No translation", 14);
        }
        LM_DBG("input %.*s with dpid %i => output %.*s\n",
@@ -586,16 +586,16 @@ static const char* dialplan_rpc_reload_doc[2] = {
 static void dialplan_rpc_reload(rpc_t* rpc, void* ctx)
 {
        if (dp_connect_db() < 0) {
-           LM_ERR("failed to reload rules fron database (db connect)\n");
+               LM_ERR("failed to reload rules fron database (db connect)\n");
                rpc->fault(ctx, 500, "DB Connection Error");
-           return;
+               return;
        }
 
        if(dp_load_db() != 0){
-           LM_ERR("failed to reload rules fron database (db load)\n");
-           dp_disconnect_db();
+               LM_ERR("failed to reload rules fron database (db load)\n");
+               dp_disconnect_db();
                rpc->fault(ctx, 500, "Dialplan Reload Failed");
-           return;
+               return;
        }
 
        dp_disconnect_db();
@@ -644,7 +644,7 @@ static void dialplan_rpc_translate(rpc_t* rpc, void* ctx)
                        input.len, input.s, idp->dp_id);
        if (translate(NULL, input, &output, idp, &attrs)!=0){
                LM_DBG("could not translate %.*s with dpid %i\n",