Module: sip-router
Branch: daniel/pv
Commit: ea31876f3efd0d33fd86352299981dd16e3f7908
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ea31876…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Nov 20 17:33:44 2008 +0100
modules: support for mod_register
- new mod_register function added to the module interface
(separate from exports structure):
If a module exports a mod_register function it will be called
immediately after loading the module and checking the module
version and module interface (this means way before calling
mod_init).
The mod_register function prototype is:
int mod_register(char* path, int* dlflags, void* r1, void* r2)
where path is the module path including the filename, dlflags
is a pointer to the dlflags used when loading the module (If
the value is changed to a different and non-zero value, the
module will be reloaded with the new flags), and r1 and r2 are
parameters reserved for future use.
A 0 return means success and -1 means error (the module will not
be loaded).
This new function can be used to register new parsing functions,
alter dynamically the mod_exports structure contents a.s.o.
- kamailio compatible mod exports dlflags handling (but a warning
will be printed saying this is deprecated and the preferred way
is using mod_register().
---
sr_module.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
sr_module.h | 14 ++++++++++++++
2 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/sr_module.c b/sr_module.c
index 21d89ac..491e971 100644
--- a/sr_module.c
+++ b/sr_module.c
@@ -216,17 +216,29 @@ static inline int version_control(void *handle, char *path)
return 0;
}
-/* returns 0 on success , <0 on error */
+/** load a sr module.
+ * tries to load the module specified by path.
+ * If modname does contain a '/' or a '.' it would be assumed to contain a
+ * path to the module and it will be used as give.
+ * else <MODS_DIR>/<modname>.so will be tried and if this fails
+ * <MODS_DIR>/<modname>/<modname>.so
+ * @param modname - path or module name
+ * @return 0 on success , <0 on error
+ */
int load_module(char* path)
{
void* handle;
char* error;
+ mod_register_function mr;
union module_exports_u* exp;
unsigned* mod_if_ver;
struct sr_module* t;
struct stat stat_buf;
char* modname;
int len;
+ int dlflags;
+ int new_dlflags;
+ int retries;
#ifndef RTLD_NOW
/* for openbsd */
@@ -287,7 +299,9 @@ int load_module(char* path)
}
#endif /* !EXTRA_DEBUG */
}
-
+ retries=2;
+ dlflags=RTLD_NOW;
+reload:
handle=dlopen(path, RTLD_NOW); /* resolve all symbols now */
if (handle==0){
LOG(L_ERR, "ERROR: load_module: could not open module <%s>: %s\n",
@@ -314,11 +328,47 @@ int load_module(char* path)
goto error1;
}
/* launch register */
+ mr = (mod_register_function)dlsym(handle, DLSYM_PREFIX "mod_register");
+ if (((error =(char*)dlerror())==0) && mr) {
+ /* no error call it */
+ new_dlflags=dlflags;
+ if (mr(path, &dlflags, 0, 0)!=0) {
+ LOG(L_ERR, "ERROR: load_module: %s: mod_register failed\n", path);
+ goto error1;
+ }
+ if (new_dlflags!=dlflags && new_dlflags!=0) {
+ /* we have to reload the module */
+ dlclose(handle);
+ dlflags=new_dlflags;
+ retries--;
+ if (retries>0) goto reload;
+ LOG(L_ERR, "ERROR: load_module: %s: cannot agree"
+ " on the dlflags\n", path);
+ goto error;
+ }
+ }
exp = (union module_exports_u*)dlsym(handle, DLSYM_PREFIX "exports");
if ( (error =(char*)dlerror())!=0 ){
LOG(L_ERR, "ERROR: load_module: %s\n", error);
goto error1;
}
+ /* hack to allow for kamailio style dlflags inside exports */
+ if (*mod_if_ver == 1) {
+ new_dlflags = exp->v1.dlflags;
+ if (new_dlflags!=dlflags && new_dlflags!=DEFAULT_DLFLAGS) {
+ /* we have to reload the module */
+ dlclose(handle);
+ WARN("%s: exports dlflags interface is deprecated and it will not"
+ "be supported in newer versions; consider using"
+ " mod_register() instead", path);
+ dlflags=new_dlflags;
+ retries--;
+ if (retries>0) goto reload;
+ LOG(L_ERR, "ERROR: load_module: %s: cannot agree"
+ " on the dlflags\n", path);
+ goto error;
+ }
+ }
if (register_module(*mod_if_ver, exp, path, handle)<0) goto error1;
return 0;
diff --git a/sr_module.h b/sr_module.h
index f2aea0e..13474cd 100644
--- a/sr_module.h
+++ b/sr_module.h
@@ -89,6 +89,20 @@
#endif
+/** type used for the mod_register function export.
+ * mod_register is a function called when loading a module
+ * (if present), prior to registering the module exports.
+ * @param path - path to the module, including file name
+ * @param dlflags - pointer to the dlflags used when loading the module.
+ * If the value is changed to a different and non-zero
+ * value, the module will be reloaded with the new flags.
+ * @param reserved1 - reserved for future use.
+ * @param reserved2 - reserver for future use
+ * @return 0 on success, -1 on error, all the other values are reserved
+ * for future use (<0 meaning error and >0 success)
+ */
+typedef int (*mod_register_function)(char*, int*, void*, void*);
+
typedef struct module_exports* (*module_register)(void);
typedef int (*cmd_function)(struct sip_msg*, char*, char*);
typedef int (*cmd_function3)(struct sip_msg*, char*, char*, char*);
Module: sip-router
Branch: andrei/mod_f_params
Commit: ca19a01ec657d1a431b1616a261a5a5f1d53a691
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ca19a01…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Tue Nov 18 23:59:14 2008 +0100
mod if: more prototypes and defines
- prototypes for module (cmd_function) with 3, 4, 5, 6 and
variable number of parameters added. The 3-6 versions just extend the
old version with more char* parameters and are kamailio compatible.
The variable number of parameters function is something new and
experimental. It takes the sip_msg, the number of extra parameters
and an array of action_u_t values (the internal routing engine
parameters representation).
- added a magic value for the parameters numbers, to be used by
variable parameter functions (VAR_PARAM_NO)
- moved/added the NO_SCRIPT macro (parameters number magic value for
functions that should not be called from the script) from tm.
---
sr_module.h | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/sr_module.h b/sr_module.h
index 1301138..f2aea0e 100644
--- a/sr_module.h
+++ b/sr_module.h
@@ -44,6 +44,8 @@
* 2008-11-17 sip-router version: includes some of the openser/kamailio
* changes: f(void) instead of f(), free_fixup_function()
* dual module interface support: ser & kamailio (andrei)
+ * 2008-11-18 prototypes for various fixed parameters numbers module
+ * functions (3, 4, 5 & 6) and variable parameters (andrei)
*/
/*!
@@ -89,6 +91,15 @@
typedef struct module_exports* (*module_register)(void);
typedef int (*cmd_function)(struct sip_msg*, char*, char*);
+typedef int (*cmd_function3)(struct sip_msg*, char*, char*, char*);
+typedef int (*cmd_function4)(struct sip_msg*, char*, char*, char*, char*);
+typedef int (*cmd_function5)(struct sip_msg*, char*, char*, char*,
+ char*, char*);
+typedef int (*cmd_function6)(struct sip_msg*, char*, char*, char*,
+ char*, char*, char*);
+/* variable number of param module function, takes as param the sip_msg,
+ extra paremeters number and a pointer to an array of parameters */
+typedef int (*cmd_function_var)(struct sip_msg*, int no, action_u_t* vals );
typedef int (*fixup_function)(void** param, int param_no);
typedef int (*free_fixup_function)(void** param, int param_no);
typedef int (*response_function)(struct sip_msg*);
@@ -114,6 +125,13 @@ typedef unsigned int modparam_t;
typedef int (*param_func_t)( modparam_t type, void* val);
+/* magic parameter number values */
+
+#define NO_SCRIPT -1 /* export not usable from scripts */
+#define VAR_PARAM_NO -128 /* function has variable number of parameters
+ (see cmd_function_var for the prototype) */
+
+/* functions flags */
#define REQUEST_ROUTE 1 /* Function can be used in request route blocks */
#define FAILURE_ROUTE 2 /* Function can be used in reply route blocks */
#define ONREPLY_ROUTE 4 /* Function can be used in on_reply */
Module: sip-router
Branch: andrei/mod_register
Commit: ea31876f3efd0d33fd86352299981dd16e3f7908
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ea31876…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Thu Nov 20 17:33:44 2008 +0100
modules: support for mod_register
- new mod_register function added to the module interface
(separate from exports structure):
If a module exports a mod_register function it will be called
immediately after loading the module and checking the module
version and module interface (this means way before calling
mod_init).
The mod_register function prototype is:
int mod_register(char* path, int* dlflags, void* r1, void* r2)
where path is the module path including the filename, dlflags
is a pointer to the dlflags used when loading the module (If
the value is changed to a different and non-zero value, the
module will be reloaded with the new flags), and r1 and r2 are
parameters reserved for future use.
A 0 return means success and -1 means error (the module will not
be loaded).
This new function can be used to register new parsing functions,
alter dynamically the mod_exports structure contents a.s.o.
- kamailio compatible mod exports dlflags handling (but a warning
will be printed saying this is deprecated and the preferred way
is using mod_register().
---
sr_module.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
sr_module.h | 14 ++++++++++++++
2 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/sr_module.c b/sr_module.c
index 21d89ac..491e971 100644
--- a/sr_module.c
+++ b/sr_module.c
@@ -216,17 +216,29 @@ static inline int version_control(void *handle, char *path)
return 0;
}
-/* returns 0 on success , <0 on error */
+/** load a sr module.
+ * tries to load the module specified by path.
+ * If modname does contain a '/' or a '.' it would be assumed to contain a
+ * path to the module and it will be used as give.
+ * else <MODS_DIR>/<modname>.so will be tried and if this fails
+ * <MODS_DIR>/<modname>/<modname>.so
+ * @param modname - path or module name
+ * @return 0 on success , <0 on error
+ */
int load_module(char* path)
{
void* handle;
char* error;
+ mod_register_function mr;
union module_exports_u* exp;
unsigned* mod_if_ver;
struct sr_module* t;
struct stat stat_buf;
char* modname;
int len;
+ int dlflags;
+ int new_dlflags;
+ int retries;
#ifndef RTLD_NOW
/* for openbsd */
@@ -287,7 +299,9 @@ int load_module(char* path)
}
#endif /* !EXTRA_DEBUG */
}
-
+ retries=2;
+ dlflags=RTLD_NOW;
+reload:
handle=dlopen(path, RTLD_NOW); /* resolve all symbols now */
if (handle==0){
LOG(L_ERR, "ERROR: load_module: could not open module <%s>: %s\n",
@@ -314,11 +328,47 @@ int load_module(char* path)
goto error1;
}
/* launch register */
+ mr = (mod_register_function)dlsym(handle, DLSYM_PREFIX "mod_register");
+ if (((error =(char*)dlerror())==0) && mr) {
+ /* no error call it */
+ new_dlflags=dlflags;
+ if (mr(path, &dlflags, 0, 0)!=0) {
+ LOG(L_ERR, "ERROR: load_module: %s: mod_register failed\n", path);
+ goto error1;
+ }
+ if (new_dlflags!=dlflags && new_dlflags!=0) {
+ /* we have to reload the module */
+ dlclose(handle);
+ dlflags=new_dlflags;
+ retries--;
+ if (retries>0) goto reload;
+ LOG(L_ERR, "ERROR: load_module: %s: cannot agree"
+ " on the dlflags\n", path);
+ goto error;
+ }
+ }
exp = (union module_exports_u*)dlsym(handle, DLSYM_PREFIX "exports");
if ( (error =(char*)dlerror())!=0 ){
LOG(L_ERR, "ERROR: load_module: %s\n", error);
goto error1;
}
+ /* hack to allow for kamailio style dlflags inside exports */
+ if (*mod_if_ver == 1) {
+ new_dlflags = exp->v1.dlflags;
+ if (new_dlflags!=dlflags && new_dlflags!=DEFAULT_DLFLAGS) {
+ /* we have to reload the module */
+ dlclose(handle);
+ WARN("%s: exports dlflags interface is deprecated and it will not"
+ "be supported in newer versions; consider using"
+ " mod_register() instead", path);
+ dlflags=new_dlflags;
+ retries--;
+ if (retries>0) goto reload;
+ LOG(L_ERR, "ERROR: load_module: %s: cannot agree"
+ " on the dlflags\n", path);
+ goto error;
+ }
+ }
if (register_module(*mod_if_ver, exp, path, handle)<0) goto error1;
return 0;
diff --git a/sr_module.h b/sr_module.h
index f2aea0e..13474cd 100644
--- a/sr_module.h
+++ b/sr_module.h
@@ -89,6 +89,20 @@
#endif
+/** type used for the mod_register function export.
+ * mod_register is a function called when loading a module
+ * (if present), prior to registering the module exports.
+ * @param path - path to the module, including file name
+ * @param dlflags - pointer to the dlflags used when loading the module.
+ * If the value is changed to a different and non-zero
+ * value, the module will be reloaded with the new flags.
+ * @param reserved1 - reserved for future use.
+ * @param reserved2 - reserver for future use
+ * @return 0 on success, -1 on error, all the other values are reserved
+ * for future use (<0 meaning error and >0 success)
+ */
+typedef int (*mod_register_function)(char*, int*, void*, void*);
+
typedef struct module_exports* (*module_register)(void);
typedef int (*cmd_function)(struct sip_msg*, char*, char*);
typedef int (*cmd_function3)(struct sip_msg*, char*, char*, char*);
The commit email script has some quirks that you should be aware of.
Some unexpected feature is that if you create a new branch
(git push origin my_branch:new_branch_that_does_not_exist_yet)
an email will be sent only for the last commit message in the branch.
If you update an existing branch or you don't care that only the last
commit will be emailed (the others will be emailed only if/when somebody
merges your branch in an existing branch), you can skip this.
Example:
git checkout -b my_branch master
vim file1
git add file1
git commit file1
vim file2
git add file2
git commit file2
git push origin my_branch:tmp/my_new_branch
=> only the 2nd commit will be emailed to the list.
This happens because of the email comit script that tries to send
mail only for changes on the branch: it looks at the original branch
and at the new branch head and sends an email for all the commits
between them . However when creating a new branch, there is not enough
information to get the original branch and you either send emails for
all the commits since project start (:-)) or only for the last one.
Even if that happen to you, all the commits messages will be sent the
first time you merge your new branch into some existing branch.
A way to avoid it in the first place is to first create a new branch,
e.g:
git checkout -b my_new_branch master
git push origin my_new_branch:tmp/my_new_branch
and then push your branch on it:
git checkout my_branch
git push origin my_branch:tmp/my_new_branch
Andrei
Module: sip-router
Branch: daniel/pv
Commit: 3247010ccea606a386cf24e00083dc38ae8b43c2
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=3247010…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Thu Nov 20 14:45:47 2008 +0200
PV get null helper added
- PV get null helper function required to stay in the API
- removed unused PV types - now AVP type is used to detect the type of
parameters, some related to R-URI are used by avpops, to be added if a
different solution is not found. Would be hard to manage the types in
core and do the implementation in module.
---
pvapi.c | 23 ++++++++++++++++++-----
pvar.h | 35 ++++-------------------------------
2 files changed, 22 insertions(+), 36 deletions(-)
diff --git a/pvapi.c b/pvapi.c
index f6c6399..eb4ea7a 100644
--- a/pvapi.c
+++ b/pvapi.c
@@ -1,16 +1,16 @@
/*
- * $Id: items.h 2111 2007-05-01 11:18:08Z juhe $
+ * $Id$
*
* Copyright (C) 2001-2003 FhG Fokus
*
- * This file is part of Kamailio, a free SIP server.
+ * This file is part of SIP-Router, a free SIP server.
*
- * Kamailio is free software; you can redistribute it and/or modify
+ * SIP-Router is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
- * Kamailio is distributed in the hope that it will be useful,
+ * SIP-Router is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
@@ -296,7 +296,20 @@ static str pv_str_marker = { PV_MARKER_STR, 1 };
static int pv_get_marker(struct sip_msg *msg, pv_param_t *param,
pv_value_t *res)
{
- return pv_get_strintval(msg, param, res, &pv_str_marker, (int)pv_str_marker.s[0]);
+ return pv_get_strintval(msg, param, res, &pv_str_marker,
+ (int)pv_str_marker.s[0]);
+}
+
+static str pv_str_empty = { "", 0 };
+int pv_get_null(struct sip_msg *msg, pv_param_t *param, pv_value_t *res)
+{
+ if(res==NULL)
+ return -1;
+
+ res->rs = pv_str_empty;
+ res->ri = 0;
+ res->flags = PV_VAL_NULL;
+ return 0;
}
pv_export_t* pv_lookup_spec_name(str *pvname, pv_spec_p e)
diff --git a/pvar.h b/pvar.h
index fcf3982..be7b3bc 100644
--- a/pvar.h
+++ b/pvar.h
@@ -3,14 +3,14 @@
*
* Copyright (C) 2001-2003 FhG Fokus
*
- * This file is part of Kamailio, a free SIP server.
+ * This file is part of SIP-Router, a free SIP server.
*
- * Kamailio is free software; you can redistribute it and/or modify
+ * SIP-Router is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
- * Kamailio is distributed in the hope that it will be useful,
+ * SIP-Router is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
@@ -72,34 +72,7 @@
enum _pv_type {
PVT_NONE=0, PVT_EMPTY, PVT_NULL,
- PVT_MARKER, PVT_AVP, PVT_HDR,
- PVT_PID, PVT_RETURN_CODE, PVT_TIMES,
- PVT_TIMEF, PVT_MSGID, PVT_METHOD,
- PVT_STATUS, PVT_REASON, PVT_RURI,
- PVT_RURI_USERNAME, PVT_RURI_DOMAIN, PVT_RURI_PORT,
- PVT_FROM, PVT_FROM_USERNAME, PVT_FROM_DOMAIN,
- PVT_FROM_TAG, PVT_TO, PVT_TO_USERNAME,
- PVT_TO_DOMAIN, PVT_TO_TAG, PVT_CSEQ,
- PVT_CONTACT, PVT_CALLID, PVT_USERAGENT,
- PVT_MSG_BUF, PVT_MSG_LEN, PVT_FLAGS,
- PVT_HEXFLAGS, PVT_SRCIP, PVT_SRCPORT,
- PVT_RCVIP, PVT_RCVPORT, PVT_REFER_TO,
- PVT_DSET, PVT_DSTURI, PVT_COLOR,
- PVT_BRANCH, PVT_BRANCHES, PVT_CONTENT_TYPE,
- PVT_CONTENT_LENGTH, PVT_MSG_BODY, PVT_AUTH_USERNAME,
- PVT_AUTH_REALM, PVT_RURI_PROTOCOL, PVT_DSTURI_DOMAIN,
- PVT_DSTURI_PORT, PVT_DSTURI_PROTOCOL, PVT_FROM_DISPLAYNAME,
- PVT_TO_DISPLAYNAME, PVT_OURI, PVT_OURI_USERNAME,
- PVT_OURI_DOMAIN, PVT_OURI_PORT, PVT_OURI_PROTOCOL,
- PVT_FORCE_SOCK, PVT_RPID_URI, PVT_DIVERSION_URI,
- PVT_ACC_USERNAME, PVT_PPI, PVT_PPI_DISPLAYNAME,
- PVT_PPI_DOMAIN, PVT_PPI_USERNAME, PVT_PAI_URI,
- PVT_BFLAGS, PVT_HEXBFLAGS, PVT_SFLAGS,
- PVT_HEXSFLAGS, PVT_ERR_CLASS, PVT_ERR_LEVEL,
- PVT_ERR_INFO, PVT_ERR_RCODE, PVT_ERR_RREASON,
- PVT_SCRIPTVAR, PVT_PROTO, PVT_AUTH_USERNAME_WHOLE,
- PVT_AUTH_DURI, PVT_DIV_REASON, PVT_DIV_PRIVACY,
- PVT_AUTH_DOMAIN, PVT_OTHER,
+ PVT_MARKER, PVT_AVP, PVT_OTHER,
PVT_EXTRA /* keep it last */
};
Module: sip-router
Branch: daniel/pv
Commit: d74b7829c6f0c23d786e6e3c3f0cba8b61b438b1
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=d74b782…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: Thu Nov 20 13:39:29 2008 +0200
pseudo-variable engine api
- imported pvar.h and unified PV and transformations interface in
pvapi.c
- PV engine does not use anymore static array plus a linked list for PV
implementations, PVs will be in module and indexed in a hash table
(small performance enhancement)
- transformations are registered via same model as PV, they will be
implemented in modules, the core will held a hash table to index them
- the core gets a smaller footprint now and better flexibility in
hadling PVs and transformations. pv and transformations will be moved
in pv module
- compiles but no testing so far
---
pvapi.c | 952 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 952 insertions(+), 0 deletions(-)
Diff: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commitdiff;h=d74…
Hello,
working to port PV engine to srouter, but also needed for kamailio's
migration of pseudo-variables (PVs) from core to modules, I need to
extend the module interface. The srouter has already support to work in
dual mode committed by Andrei few days ago, so it should affect only
kamailio's module interface if ser side does not need.
Here is the issue. In kamailio/openser we have so called transformations
that are bound to PV. They are now implemented directly in core. To move
them in a module, the interface needs to be extended, like we did in the
past to export PVs from modules. The important aspect is that they must
become visible immediately after the module is loaded -- this happens
also with PVs (so cannot use mod_init, etc...). This is required because
they may occur during script parsing, therefore the core/parser should
get knowledge of them in very early stage.
PVs are exported via a specific structure in module interface. We can do
same for transformations. There is another option, which can be used for
other purposes in the future - introducing in module interface a
callback to be run immediately after a module is loaded. The
transformations can be exported inside the callback.
Extending this way, in the future, the modules can make other attributes
visible to core/other modules immediately after loading without changing
the module interface.
Therefore I would go for second option. Other opinions?
Cheers,
Daniel
--
Daniel-Constantin Mierla
http://www.asipto.com