Module: kamailio
Branch: master
Commit: 1c402ddc4cc499700e186b65108303a2aaec6287
URL: 
https://github.com/kamailio/kamailio/commit/1c402ddc4cc499700e186b65108303a2aaec6287

Author: Daniel-Constantin Mierla <mico...@gmail.com>
Committer: Daniel-Constantin Mierla <mico...@gmail.com>
Date: 2019-11-26T08:49:02+01:00

core: new command line parameter --modparam

- allow setting a module parameter via command line
- format: --modparam=modname:paramname:type:valye
- type can be: 'i' for integer value; 's' for string value
- example:

kamailio --loadmodule=xprint.so --modparam=xprint:buf_size:i:2048

---

Modified: src/core/modparam.c
Modified: src/core/modparam.h
Modified: src/main.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/1c402ddc4cc499700e186b65108303a2aaec6287.diff
Patch: 
https://github.com/kamailio/kamailio/commit/1c402ddc4cc499700e186b65108303a2aaec6287.patch

---

diff --git a/src/core/modparam.c b/src/core/modparam.c
index 72ad2fbc9e..1a7d8acd78 100644
--- a/src/core/modparam.c
+++ b/src/core/modparam.c
@@ -154,3 +154,63 @@ int set_mod_param_regex(char* regex, char* name, 
modparam_t type, void* val)
        }
        return 0;
 }
+
+int set_mod_param_serialized(char* mval)
+{
+#define MPARAM_MBUF_SIZE 256
+       char mbuf[MPARAM_MBUF_SIZE];
+       char *mname = NULL;
+       char *mparam = NULL;
+       char *sval = NULL;
+       int ival = 0;
+       int ptype = PARAM_STRING;
+       char *p = NULL;
+
+       if(strlen(mval) >= MPARAM_MBUF_SIZE) {
+               LM_ERR("argument is too long: %s\n", mval);
+               return -1;
+       }
+       strcpy(mbuf, mval);
+       mname = mbuf;
+       p = strchr(mbuf, ':');
+       if(p==NULL) {
+               LM_ERR("invalid format for argument: %s\n", mval);
+               return -1;
+       }
+       *p = '\0';
+       p++;
+       mparam = p;
+       p = strchr(p, ':');
+       if(p==NULL) {
+               LM_ERR("invalid format for argument: %s\n", mval);
+               return -1;
+       }
+       *p = '\0';
+       p++;
+       if(*p=='i' || *p=='I') {
+               ptype = PARAM_INT;
+       } else if(*p=='s' || *p=='S') {
+               ptype = PARAM_STRING;
+       } else {
+               LM_ERR("invalid format for argument: %s\n", mval);
+               return -1;
+       }
+       p++;
+       if(*p!=':') {
+               LM_ERR("invalid format for argument: %s\n", mval);
+               return -1;
+       }
+       p++;
+       sval = p;
+
+       if(ptype == PARAM_STRING) {
+               return set_mod_param_regex(mname, mparam, PARAM_STRING, sval);
+       } else {
+               if(strlen(sval) <= 0) {
+                       LM_ERR("invalid format for argument: %s\n", mval);
+                       return -1;
+               }
+               strz2sint(sval, &ival);
+               return set_mod_param_regex(mname, mparam, PARAM_INT, 
(void*)(long)ival);
+       }
+}
diff --git a/src/core/modparam.h b/src/core/modparam.h
index 91c6867d59..0a4241ad4a 100644
--- a/src/core/modparam.h
+++ b/src/core/modparam.h
@@ -34,4 +34,6 @@ int set_mod_param(char* _mod, char* _name, modparam_t _type, 
void* _val);
 
 int set_mod_param_regex(char* regex, char* name, modparam_t type, void* val);
 
+int set_mod_param_serialized(char* mval);
+
 #endif
diff --git a/src/main.c b/src/main.c
index 31af3d2cef..0bc2e650dc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -78,6 +78,7 @@
 #include "core/mem/shm_mem.h"
 #include "core/shm_init.h"
 #include "core/sr_module.h"
+#include "core/modparam.h"
 #include "core/timer.h"
 #include "core/parser/msg_parser.h"
 #include "core/ip_addr.h"
@@ -196,6 +197,9 @@ Options:\n\
     --loadmodule=name load the module specified by name\n\
     -L path      Modules search path (default: " MODS_DIR ")\n\
     -m nr        Size of shared memory allocated in Megabytes\n\
+    --modparam=modname:paramname:type:value set the module parameter\n\
+                  type has to be 's' for string value and 'i' for int value, 
\n\
+                  example: --modparam=corex:alias_subdomains:s:" NAME ".org\n\
     -M nr        Size of private memory allocated, in Megabytes\n\
     -n processes Number of child processes to fork per interface\n\
                   (default: 8)\n"
@@ -1924,6 +1928,7 @@ int main(int argc, char** argv)
                {"substdefs",   required_argument, 0, KARGOPTVAL + 3},
                {"server-id",   required_argument, 0, KARGOPTVAL + 4},
                {"loadmodule",  required_argument, 0, KARGOPTVAL + 5},
+               {"modparam",    required_argument, 0, KARGOPTVAL + 6},
                {0, 0, 0, 0 }
        };
 
@@ -2140,6 +2145,7 @@ int main(int argc, char** argv)
                        case 's':
                        case 'Y':
                        case KARGOPTVAL+5:
+                       case KARGOPTVAL+6:
                                        break;
 
                        /* long options */
@@ -2239,6 +2245,12 @@ int main(int argc, char** argv)
                                                goto error;
                                        }
                                        break;
+                       case KARGOPTVAL+6:
+                                       if(set_mod_param_serialized(optarg) < 
0) {
+                                               LM_ERR("failed to set modparam: 
%s\n", optarg);
+                                               goto error;
+                                       }
+                                       break;
                        default:
                                        break;
                }


_______________________________________________
Kamailio (SER) - Development Mailing List
sr-dev@lists.kamailio.org
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to