1
0
Fork 0

config can be loaded by a module (e.g. from a db)

This commit is contained in:
bagyenda 2008-08-28 16:07:31 +00:00
parent bf9218da78
commit c6591fc15b
10 changed files with 311 additions and 197 deletions

View File

@ -1,3 +1,5 @@
2008-08-28 P. A. Bagyenda <bagyenda@dsmagic.com>
* Added ability to load config from a module rather than from file
2008-08-20 P. A. Bagyenda <bagyenda@dsmagic.com> 2008-08-20 P. A. Bagyenda <bagyenda@dsmagic.com>
* Added default mmsc to send-mms-user (Martin) * Added default mmsc to send-mms-user (Martin)
2008-08-19 P. A. Bagyenda <bagyenda@dsmagic.com> 2008-08-19 P. A. Bagyenda <bagyenda@dsmagic.com>

View File

@ -1,4 +1,4 @@
noinst_LIBRARIES = libmms.a noinst_LIBRARIES = libmms.a
libmms_a_SOURCES = mms_mmbox.c mms_msg.c mms_queue.c mms_strings.c mms_uaprof.c mms_util.c mms_mm7soap.c mms_cfg.c libmms_a_SOURCES = mms_mmbox.c mms_msg.c mms_queue.c mms_strings.c mms_uaprof.c mms_util.c mms_mm7soap.c mms_cfg.c
EXTRA_DIST=mms_strings.def mms_mm7soap.h mms_mmbox.h mms_msg.h mms_queue.h mms_strings.h mms_uaprof.h mms_util.h mms_cfg.h mms_cfg.def EXTRA_DIST=mms_strings.def mms_mm7soap.h mms_mmbox.h mms_msg.h mms_queue.h mms_strings.h mms_uaprof.h mms_util.h mms_cfg.h mms_cfg.def mms_cfg-impl.h

View File

@ -0,0 +1,31 @@
/*
* Mbuni - Open Source MMS Gateway
*
* config file functions (when conf is loaded from another source)
*
* Copyright (C) 2003 - 2008, Digital Solutions Ltd. - http://www.dsmagic.com
*
* Paul Bagyenda <bagyenda@dsmagic.com>
*
* This program is free software, distributed under the terms of
* the GNU General Public License, with a few exceptions granted (see LICENSE)
*/
#ifndef __MMS_CFG_IMPL__INCLUDED__
#define __MMS_CFG_IMPL__INCLUDED__
#include "mms_cfg.h"
typedef struct mCfgImpl mCfgImpl; /* Implementation-specific struct for config info. */
/* each implementation must export struct, symbol 'cfg_funcs'. */
typedef struct mCfgImpFuncs {
mCfgImpl *(*read)(Octstr *init_param);
void (*destroy)(mCfgImpl *);
mCfgGrp *(*cfg_get_single)(mCfgImpl *cfg, Octstr *name);
List *(*get_multi)(mCfgImpl *cfg,Octstr *name); /* List of mCfgGrp */
mCfgGrp *(*get_multi_by_field)(mCfgImpl *cfg, Octstr *name, Octstr *field, Octstr *value);
Octstr *(*get)(mCfgImpl *cfg, mCfgGrp *grp, Octstr *name);
Octstr *(*get_grp_name)(mCfgImpl *, mCfgGrp *);
} mCfgImpFuncs;
#endif

View File

@ -16,7 +16,8 @@
#include <errno.h> #include <errno.h>
#include "mms_cfg.h" #include "mms_cfg.h"
#include "mms_cfg-impl.h"
#include "mms_util.h"
/* config file representation. /* config file representation.
* 'grps' var is indexed by group name. * 'grps' var is indexed by group name.
@ -26,11 +27,14 @@
struct mCfg { struct mCfg {
Octstr *file; Octstr *file;
Dict *grps; Dict *grps;
mCfgImpl *xcfg; /* If set, then this is the real source of conf info. */
mCfgImpFuncs *cfg_funcs; /* Config funcs or NULL */
}; };
struct mCfgGrp { struct mCfgGrp { /* when using file-based, this is our implementation of a group. */
Octstr *name; Octstr *name;
Dict *fields; Dict *fields;
}; };
static void fixup_value(Octstr *value, int lineno) static void fixup_value(Octstr *value, int lineno)
@ -138,6 +142,9 @@ mCfg *mms_cfg_read(Octstr *file)
cfg = gw_malloc(sizeof *cfg); cfg = gw_malloc(sizeof *cfg);
cfg->file = octstr_duplicate(file); cfg->file = octstr_duplicate(file);
cfg->grps = dict_create(7, NULL); cfg->grps = dict_create(7, NULL);
cfg->xcfg = NULL;
cfg->cfg_funcs = NULL;
lines = octstr_split(sf, octstr_imm("\n")); lines = octstr_split(sf, octstr_imm("\n"));
for (i = 0, n = gwlist_len(lines); i < n; i++) { for (i = 0, n = gwlist_len(lines); i < n; i++) {
@ -209,6 +216,23 @@ mCfg *mms_cfg_read(Octstr *file)
gwlist_destroy(lines, (gwlist_item_destructor_t *)octstr_destroy); gwlist_destroy(lines, (gwlist_item_destructor_t *)octstr_destroy);
octstr_destroy(sf); octstr_destroy(sf);
/* Now check if config-source is set, use that. */
if ((grp = mms_cfg_get_single(cfg, octstr_imm("config-source"))) != NULL) {
Octstr *init = mms_cfg_get(cfg, grp, octstr_imm("config-library-init-param"));
cfg->cfg_funcs = _mms_load_module(cfg, grp, "config-library", "cfg_funcs", NULL);
if (cfg->cfg_funcs == NULL ||
cfg->cfg_funcs->read == NULL ||
(cfg->xcfg = cfg->cfg_funcs->read(init)) == NULL) {
error(0, "Failed to load cfg reader library from conf!");
mms_cfg_destroy(cfg);
cfg = NULL;
}
octstr_destroy(init);
}
return cfg; return cfg;
} }
@ -241,6 +265,11 @@ void mms_cfg_destroy(mCfg *cfg)
gwlist_destroy(l, (gwlist_item_destructor_t *)octstr_destroy); gwlist_destroy(l, (gwlist_item_destructor_t *)octstr_destroy);
dict_destroy(cfg->grps); dict_destroy(cfg->grps);
octstr_destroy(cfg->file); octstr_destroy(cfg->file);
if (cfg->xcfg && cfg->cfg_funcs &&
cfg->cfg_funcs->destroy)
cfg->cfg_funcs->destroy(cfg->xcfg);
gw_free(cfg); gw_free(cfg);
} }
@ -249,46 +278,86 @@ mCfgGrp *mms_cfg_get_single(mCfg *cfg, Octstr *name)
gw_assert(name); gw_assert(name);
gw_assert(is_multigroup(name) == 0); gw_assert(is_multigroup(name) == 0);
return dict_get(cfg->grps, name); if (cfg->xcfg == NULL)
return dict_get(cfg->grps, name);
else
return cfg->cfg_funcs->cfg_get_single(cfg->xcfg, name);
} }
List *mms_cfg_get_multi(mCfg *cfg, Octstr *name) List *mms_cfg_get_multi(mCfg *cfg, Octstr *name)
{ {
List *l = NULL, *r;
int i;
gw_assert(name); gw_assert(name);
gw_assert(is_multigroup(name) == 1); gw_assert(is_multigroup(name) == 1);
r = dict_get(cfg->grps, name); if (cfg->xcfg == NULL) {
List *l = NULL, *r;
if (r) int i;
for (i = 0, l = gwlist_create(); i < gwlist_len(r); i++) r = dict_get(cfg->grps, name);
gwlist_append(l, gwlist_get(r,i));
return l; if (r)
for (i = 0, l = gwlist_create(); i < gwlist_len(r); i++)
gwlist_append(l, gwlist_get(r,i));
return l;
} else
return cfg->cfg_funcs->get_multi(cfg->xcfg, name);
} }
Octstr *mms_cfg_get(mCfgGrp *grp, Octstr *name)
mCfgGrp *mms_get_multi_by_field(mCfg *cfg, Octstr *name, Octstr *field, Octstr *value)
{
gw_assert(name);
gw_assert(is_multigroup(name) == 1);
if (!valid_in_group(name, field))
panic(0, "Request for invalid field/variable `%s' in group `%s', unexpected!",
octstr_get_cstr(field), octstr_get_cstr(name));
if (cfg->xcfg == NULL) {
mCfgGrp *grp;
Octstr *val;
List *r;
int i;
r = dict_get(cfg->grps, name);
if (r)
for (i = 0; i < gwlist_len(r); i++)
if ((grp = gwlist_get(r, i)) != NULL &&
(val = dict_get(grp->fields, field)) != NULL &&
octstr_compare(val, value) == 0)
return grp;
return NULL;
} else
return cfg->cfg_funcs->get_multi_by_field(cfg->xcfg, name, field, value);
}
Octstr *mms_cfg_get(mCfg *cfg, mCfgGrp *grp, Octstr *name)
{ {
Octstr *val; Octstr *val;
Octstr *grp_name = cfg->xcfg ? cfg->cfg_funcs->get_grp_name(cfg->xcfg, grp) :
gw_assert(grp); octstr_duplicate(grp->name);
if (!valid_in_group(grp->name, name)) if (!valid_in_group(grp_name, name))
panic(0, "Request for invalid field/variable `%s' in group `%s', unexpected!", panic(0, "Request for invalid field/variable `%s' in group `%s', unexpected!",
octstr_get_cstr(name), octstr_get_cstr(grp->name)); octstr_get_cstr(name), octstr_get_cstr(grp_name));
val = dict_get(grp->fields, name); octstr_destroy(grp_name);
if (cfg->xcfg == NULL) {
if (!val) gw_assert(grp);
return NULL; val = dict_get(grp->fields, name);
else val = octstr_duplicate(val);
return octstr_duplicate(val); } else {
val = cfg->cfg_funcs->get(cfg->xcfg, grp, name);
if (val)
fixup_value(val, 0);
}
return val;
} }
int mms_cfg_get_int(mCfgGrp *grp, Octstr *name, long *n) int mms_cfg_get_int(mCfg *cfg, mCfgGrp *grp, Octstr *name, long *n)
{ {
Octstr *val = mms_cfg_get(grp, name); Octstr *val = mms_cfg_get(cfg, grp, name);
int ret; int ret;
if (!val) if (!val)
return -1; return -1;
@ -298,9 +367,9 @@ int mms_cfg_get_int(mCfgGrp *grp, Octstr *name, long *n)
} }
int mms_cfg_get_bool(mCfgGrp *grp, Octstr *name, int *bool) int mms_cfg_get_bool(mCfg *cfg, mCfgGrp *grp, Octstr *name, int *bool)
{ {
Octstr *val = mms_cfg_get(grp, name); Octstr *val = mms_cfg_get(cfg, grp, name);
int ret = 0; int ret = 0;
if (!val) if (!val)
return -1; return -1;
@ -323,9 +392,9 @@ int mms_cfg_get_bool(mCfgGrp *grp, Octstr *name, int *bool)
return ret; return ret;
} }
List *mms_cfg_get_list(mCfgGrp *grp, Octstr *name) List *mms_cfg_get_list(mCfg *cfg, mCfgGrp *grp, Octstr *name)
{ {
Octstr *val = mms_cfg_get(grp, name); Octstr *val = mms_cfg_get(cfg, grp, name);
List *l; List *l;
if (val == NULL) if (val == NULL)

View File

@ -3,7 +3,7 @@
* *
* MMS Config structure definitions * MMS Config structure definitions
* *
* Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com * Copyright (C) 2003 - 20058 Digital Solutions Ltd. - http://www.dsmagic.com
* *
* Paul Bagyenda <bagyenda@dsmagic.com> * Paul Bagyenda <bagyenda@dsmagic.com>
* *
@ -23,6 +23,16 @@
#error MULTI_GROUP not defined. #error MULTI_GROUP not defined.
#endif #endif
/* config-source: If it exists, the rest of the conf file is
* ignored. Instead, use the provided lib as the reader of the
* config info. (See mms_cfg-impl.h for details)
*/
SINGLE_GROUP(config-source,
OCTSTR(config-library)
OCTSTR(config-library-init-param)
)
SINGLE_GROUP(core, SINGLE_GROUP(core,
OCTSTR(log-file) OCTSTR(log-file)
OCTSTR(log-level) OCTSTR(log-level)

View File

@ -34,22 +34,24 @@ mCfgGrp *mms_cfg_get_single(mCfg *cfg, Octstr *name);
/* Get a multiple groups all of same name. */ /* Get a multiple groups all of same name. */
List *mms_cfg_get_multi(mCfg *cfg,Octstr *name); List *mms_cfg_get_multi(mCfg *cfg,Octstr *name);
mCfgGrp *mms_get_multi_by_field(mCfg *cfg, Octstr *name, Octstr *field, Octstr *value);
/* Get a string field value from a group. */ /* Get a string field value from a group. */
Octstr *mms_cfg_get(mCfgGrp *grp, Octstr *name); Octstr *mms_cfg_get(mCfg *cfg, mCfgGrp *grp, Octstr *name);
/* Get an integer field value from a group. /* Get an integer field value from a group.
* returns 0 on success, -1 on error. * returns 0 on success, -1 on error.
*/ */
int mms_cfg_get_int(mCfgGrp *grp, Octstr *name, long *n); int mms_cfg_get_int(mCfg *cfg, mCfgGrp *grp, Octstr *name, long *n);
/* Get a boolean field value from a group. /* Get a boolean field value from a group.
* returns 0 on success, -1 on error * returns 0 on success, -1 on error
*/ */
int mms_cfg_get_bool(mCfgGrp *grp, Octstr *name, int *bool); int mms_cfg_get_bool(mCfg *cfg, mCfgGrp *grp, Octstr *name, int *bool);
/* Get a field value from a group. */ /* Get a field value from a group. */
List *mms_cfg_get_list(mCfgGrp *grp, Octstr *name); List *mms_cfg_get_list(mCfg *cfg, mCfgGrp *grp, Octstr *name);
#endif #endif

View File

@ -30,9 +30,9 @@
#include "mms_queue.h" #include "mms_queue.h"
#include "mms_uaprof.h" #include "mms_uaprof.h"
Octstr *_mms_cfg_getx(mCfgGrp *grp, Octstr *item) Octstr *_mms_cfg_getx(mCfg *cfg, mCfgGrp *grp, Octstr *item)
{ {
Octstr *v = mms_cfg_get(grp, item); Octstr *v = mms_cfg_get(cfg, grp, item);
void *x = v ? v : octstr_create(""); void *x = v ? v : octstr_create("");
@ -40,7 +40,7 @@ Octstr *_mms_cfg_getx(mCfgGrp *grp, Octstr *item)
} }
int mms_load_core_settings(mCfgGrp *cgrp) int mms_load_core_settings(mCfg *cfg, mCfgGrp *cgrp)
{ {
Octstr *log, *alog; Octstr *log, *alog;
Octstr *http_proxy_host; Octstr *http_proxy_host;
@ -51,40 +51,40 @@ int mms_load_core_settings(mCfgGrp *cgrp)
panic(0,"Missing required group `core' in config file!"); panic(0,"Missing required group `core' in config file!");
/* Set the log file. */ /* Set the log file. */
log = mms_cfg_get(cgrp, octstr_imm("log-file")); log = mms_cfg_get(cfg, cgrp, octstr_imm("log-file"));
if (log != NULL) { if (log != NULL) {
if (mms_cfg_get_int(cgrp, octstr_imm("log-level"), &loglevel) == -1) if (mms_cfg_get_int(cfg, cgrp, octstr_imm("log-level"), &loglevel) == -1)
loglevel = 0; loglevel = 0;
log_open(octstr_get_cstr(log), loglevel, GW_NON_EXCL); log_open(octstr_get_cstr(log), loglevel, GW_NON_EXCL);
octstr_destroy(log); octstr_destroy(log);
} }
/* Get access log and open it. */ /* Get access log and open it. */
alog = mms_cfg_get(cgrp, octstr_imm("access-log")); alog = mms_cfg_get(cfg, cgrp, octstr_imm("access-log"));
if (alog) { if (alog) {
alog_open(octstr_get_cstr(alog), 1, 1); alog_open(octstr_get_cstr(alog), 1, 1);
octstr_destroy(alog); octstr_destroy(alog);
} }
if ((our_interface = mms_cfg_get(cgrp, octstr_imm("http-interface-name"))) != NULL) { if ((our_interface = mms_cfg_get(cfg, cgrp, octstr_imm("http-interface-name"))) != NULL) {
http_set_interface(our_interface); http_set_interface(our_interface);
octstr_destroy(our_interface); octstr_destroy(our_interface);
} }
/* look for http proxy. If set, use it. */ /* look for http proxy. If set, use it. */
if ((http_proxy_host = mms_cfg_get(cgrp, octstr_imm("http-proxy-host"))) != NULL) { if ((http_proxy_host = mms_cfg_get(cfg, cgrp, octstr_imm("http-proxy-host"))) != NULL) {
Octstr *username = mms_cfg_get(cgrp, Octstr *username = mms_cfg_get(cfg, cgrp,
octstr_imm("http-proxy-username")); octstr_imm("http-proxy-username"));
Octstr *password = mms_cfg_get(cgrp, Octstr *password = mms_cfg_get(cfg, cgrp,
octstr_imm("http-proxy-password")); octstr_imm("http-proxy-password"));
List *exceptions = mms_cfg_get_list(cgrp, List *exceptions = mms_cfg_get_list(cfg, cgrp,
octstr_imm("http-proxy-exceptions")); octstr_imm("http-proxy-exceptions"));
Octstr *except_regex = mms_cfg_get(cgrp, Octstr *except_regex = mms_cfg_get(cfg, cgrp,
octstr_imm("http-proxy-exceptions-regex")); octstr_imm("http-proxy-exceptions-regex"));
long http_proxy_port = -1; long http_proxy_port = -1;
mms_cfg_get_int(cgrp, octstr_imm("http-proxy-port"), &http_proxy_port); mms_cfg_get_int(cfg, cgrp, octstr_imm("http-proxy-port"), &http_proxy_port);
if (http_proxy_port > 0) if (http_proxy_port > 0)
http_use_proxy(http_proxy_host, http_proxy_port, 0, http_use_proxy(http_proxy_host, http_proxy_port, 0,
@ -112,18 +112,18 @@ int mms_load_core_settings(mCfgGrp *cgrp)
* load SSL client and SSL server public certificates * load SSL client and SSL server public certificates
* and private keys * and private keys
*/ */
ssl_client_certkey_file = mms_cfg_get(cgrp, octstr_imm("ssl-client-certkey-file")); ssl_client_certkey_file = mms_cfg_get(cfg, cgrp, octstr_imm("ssl-client-certkey-file"));
if (ssl_client_certkey_file != NULL) if (ssl_client_certkey_file != NULL)
use_global_client_certkey_file(ssl_client_certkey_file); use_global_client_certkey_file(ssl_client_certkey_file);
ssl_server_cert_file = mms_cfg_get(cgrp, octstr_imm("ssl-server-cert-file")); ssl_server_cert_file = mms_cfg_get(cfg, cgrp, octstr_imm("ssl-server-cert-file"));
ssl_server_key_file = mms_cfg_get(cgrp, octstr_imm("ssl-server-key-file")); ssl_server_key_file = mms_cfg_get(cfg, cgrp, octstr_imm("ssl-server-key-file"));
if (ssl_server_cert_file != NULL && ssl_server_key_file != NULL) if (ssl_server_cert_file != NULL && ssl_server_key_file != NULL)
use_global_server_certkey_file(ssl_server_cert_file, use_global_server_certkey_file(ssl_server_cert_file,
ssl_server_key_file); ssl_server_key_file);
ssl_trusted_ca_file = mms_cfg_get(cgrp, octstr_imm("ssl-trusted-ca-file")); ssl_trusted_ca_file = mms_cfg_get(cfg, cgrp, octstr_imm("ssl-trusted-ca-file"));
use_global_trusted_ca_file(ssl_trusted_ca_file); use_global_trusted_ca_file(ssl_trusted_ca_file);
@ -1826,13 +1826,13 @@ void strip_non_essential_headers(MIMEEntity *mime)
} }
void *_mms_load_module(mCfgGrp *grp, char *config_key, char *symbolname, void *_mms_load_module(mCfg *cfg, mCfgGrp *grp, char *config_key, char *symbolname,
void *shell_builtin) void *shell_builtin)
{ {
Octstr *s = NULL; Octstr *s = NULL;
void *retval = NULL; void *retval = NULL;
s = mms_cfg_get(grp, octstr_imm(config_key)); s = mms_cfg_get(cfg, grp, octstr_imm(config_key));
if (s) { if (s) {
void *x; void *x;

View File

@ -66,7 +66,7 @@
enum mms_loc_t {MMS_LOC_MMBOX = 1, MMS_LOC_MQUEUE=2}; enum mms_loc_t {MMS_LOC_MMBOX = 1, MMS_LOC_MQUEUE=2};
extern int mms_load_core_settings(mCfgGrp *cgrp); extern int mms_load_core_settings(mCfg *cfg, mCfgGrp *cgrp);
extern Octstr *mms_maketransid(char *qf, Octstr *mmscname); extern Octstr *mms_maketransid(char *qf, Octstr *mmscname);
@ -144,7 +144,7 @@ int mm_lockfile(int fd, char *fname, int shouldblock);
int _mms_gw_isprint(int c); int _mms_gw_isprint(int c);
/* Special form of cfg_get which returns zero-length string when there is nothing. */ /* Special form of cfg_get which returns zero-length string when there is nothing. */
Octstr *_mms_cfg_getx(mCfgGrp *grp, Octstr *item); Octstr *_mms_cfg_getx(mCfg *cfg, mCfgGrp *grp, Octstr *item);
/* Get envelope data from message headers. */ /* Get envelope data from message headers. */
void mms_collect_envdata_from_msgheaders(List *mh, List **xto, void mms_collect_envdata_from_msgheaders(List *mh, List **xto,
@ -224,7 +224,7 @@ void add_multipart_form_field(MIMEEntity *multipart, char *field_name,
MIMEEntity *multipart_from_urls(List *url_list); MIMEEntity *multipart_from_urls(List *url_list);
/* load a shared object, then load a symbol from it. */ /* load a shared object, then load a symbol from it. */
void *_mms_load_module(mCfgGrp *grp, char *config_key, char *symbolname, void *_mms_load_module(mCfg *cfg, mCfgGrp *grp, char *config_key, char *symbolname,
void *shell_builtin); void *shell_builtin);

View File

@ -59,28 +59,28 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
if (grp == NULL) if (grp == NULL)
panic(0,"Missing required group `mbuni' in config file!"); panic(0,"Missing required group `mbuni' in config file!");
mms_load_core_settings(cgrp); mms_load_core_settings(cfg, cgrp);
sendmms_users = gwlist_create(); sendmms_users = gwlist_create();
mms_services = gwlist_create(); mms_services = gwlist_create();
mmscs = gwlist_create(); mmscs = gwlist_create();
if (mms_cfg_get_int(grp, if (mms_cfg_get_int(cfg, grp,
octstr_imm("maximum-send-attempts"), &mmsbox_maxsendattempts) < 0) octstr_imm("maximum-send-attempts"), &mmsbox_maxsendattempts) < 0)
mmsbox_maxsendattempts = MAXQTRIES; mmsbox_maxsendattempts = MAXQTRIES;
if (mms_cfg_get_int(grp, if (mms_cfg_get_int(cfg, grp,
octstr_imm("send-attempt-back-off"), &mmsbox_send_back_off) == -1) octstr_imm("send-attempt-back-off"), &mmsbox_send_back_off) == -1)
mmsbox_send_back_off = BACKOFF_FACTOR; mmsbox_send_back_off = BACKOFF_FACTOR;
if (mms_cfg_get_int(grp, octstr_imm("default-message-expiry"), &default_msgexpiry) == -1) if (mms_cfg_get_int(cfg, grp, octstr_imm("default-message-expiry"), &default_msgexpiry) == -1)
default_msgexpiry = DEFAULT_EXPIRE; default_msgexpiry = DEFAULT_EXPIRE;
if (mms_cfg_get_int(grp, octstr_imm("max-send-threads"), &maxthreads) < 0 || if (mms_cfg_get_int(cfg, grp, octstr_imm("max-send-threads"), &maxthreads) < 0 ||
maxthreads < 1) maxthreads < 1)
maxthreads = 10; maxthreads = 10;
s = mms_cfg_get(grp, octstr_imm("queue-run-interval")); s = mms_cfg_get(cfg, grp, octstr_imm("queue-run-interval"));
if (s) { if (s) {
queue_interval = atof(octstr_get_cstr(s)); queue_interval = atof(octstr_get_cstr(s));
@ -89,14 +89,14 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
if (queue_interval <= 0) if (queue_interval <= 0)
queue_interval = QUEUERUN_INTERVAL; queue_interval = QUEUERUN_INTERVAL;
if ((sendmail_cmd = mms_cfg_get(grp, octstr_imm("send-mail-prog"))) == NULL) if ((sendmail_cmd = mms_cfg_get(cfg, grp, octstr_imm("send-mail-prog"))) == NULL)
sendmail_cmd = octstr_imm("/usr/sbin/sendmail -f '%f' '%t'"); sendmail_cmd = octstr_imm("/usr/sbin/sendmail -f '%f' '%t'");
if ((myhostname = mms_cfg_get(grp, octstr_imm("hostname"))) == NULL) if ((myhostname = mms_cfg_get(cfg, grp, octstr_imm("hostname"))) == NULL)
myhostname = octstr_imm("localhost"); myhostname = octstr_imm("localhost");
gdir = mms_cfg_get(grp, octstr_imm("storage-directory")); gdir = mms_cfg_get(cfg, grp, octstr_imm("storage-directory"));
if (gdir == NULL) if (gdir == NULL)
gdir = octstr_imm("."); gdir = octstr_imm(".");
@ -107,11 +107,11 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
panic(0, "Failed to create MMSBox storage directory: %s - %s!", panic(0, "Failed to create MMSBox storage directory: %s - %s!",
octstr_get_cstr(gdir), strerror(errno)); octstr_get_cstr(gdir), strerror(errno));
if ((qfs = _mms_load_module(grp, "queue-manager-module", "qfuncs", NULL)) == NULL) { if ((qfs = _mms_load_module(cfg, grp, "queue-manager-module", "qfuncs", NULL)) == NULL) {
qfs = &default_qfuncs; /* default queue handler. */ qfs = &default_qfuncs; /* default queue handler. */
qfs->mms_init_queue_module(gdir, maxthreads); qfs->mms_init_queue_module(gdir, maxthreads);
} else { } else {
Octstr *s = _mms_cfg_getx(grp, octstr_imm("queue-module-init-data")); Octstr *s = _mms_cfg_getx(cfg, grp, octstr_imm("queue-module-init-data"));
if (qfs->mms_init_queue_module(s, maxthreads) != 0) if (qfs->mms_init_queue_module(s, maxthreads) != 0)
panic(0, "failed to initialise queue module, with data: %s", panic(0, "failed to initialise queue module, with data: %s",
octstr_get_cstr(s)); octstr_get_cstr(s));
@ -137,37 +137,37 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
octstr_get_cstr(dlr_dir), strerror(errno)); octstr_get_cstr(dlr_dir), strerror(errno));
unified_prefix = _mms_cfg_getx(grp, octstr_imm("unified-prefix")); unified_prefix = _mms_cfg_getx(cfg, grp, octstr_imm("unified-prefix"));
if ((s = mms_cfg_get(grp, octstr_imm("strip-prefixes"))) != NULL) { if ((s = mms_cfg_get(cfg, grp, octstr_imm("strip-prefixes"))) != NULL) {
strip_prefixes = octstr_split(s, octstr_imm(";")); strip_prefixes = octstr_split(s, octstr_imm(";"));
octstr_destroy(s); octstr_destroy(s);
} else } else
strip_prefixes = NULL; strip_prefixes = NULL;
mms_cfg_get_int(grp, octstr_imm("sendmms-port"), &sendmms_port.port); mms_cfg_get_int(cfg, grp, octstr_imm("sendmms-port"), &sendmms_port.port);
#ifdef HAVE_LIBSSL #ifdef HAVE_LIBSSL
mms_cfg_get_bool(grp, octstr_imm("sendmms-port-ssl"), &send_port_ssl); mms_cfg_get_bool(cfg, grp, octstr_imm("sendmms-port-ssl"), &send_port_ssl);
#endif #endif
if (http_open_port(sendmms_port.port, send_port_ssl) < 0) if (http_open_port(sendmms_port.port, send_port_ssl) < 0)
error(0, "MMSBox: Failed to start sendmms HTTP server on %ld: %s!", error(0, "MMSBox: Failed to start sendmms HTTP server on %ld: %s!",
sendmms_port.port, sendmms_port.port,
strerror(errno)); strerror(errno));
sendmms_port.allow_ip = mms_cfg_get(grp, octstr_imm("allow-ip")); sendmms_port.allow_ip = mms_cfg_get(cfg, grp, octstr_imm("allow-ip"));
sendmms_port.deny_ip = mms_cfg_get(grp, octstr_imm("deny-ip")); sendmms_port.deny_ip = mms_cfg_get(cfg, grp, octstr_imm("deny-ip"));
/* load the filter if any. */ /* load the filter if any. */
if ((mt_filter = _mms_load_module(grp, "mmsbox-mt-filter-library", "mmsbox_mt_filter", NULL)) != NULL) if ((mt_filter = _mms_load_module(cfg, grp, "mmsbox-mt-filter-library", "mmsbox_mt_filter", NULL)) != NULL)
info(0, "MMSBox: Loaded MT Filter [%s]", mt_filter->name); info(0, "MMSBox: Loaded MT Filter [%s]", mt_filter->name);
mms_cfg_get_bool(grp, octstr_imm("mmsbox-mt-always-multipart"), &mt_multipart); mms_cfg_get_bool(cfg, grp, octstr_imm("mmsbox-mt-always-multipart"), &mt_multipart);
/* load the resolver module. */ /* load the resolver module. */
if ((rfs = _mms_load_module(grp, "resolver-library", "mmsbox_resolvefuncs", &mmsbox_resolvefuncs_shell)) == NULL) if ((rfs = _mms_load_module(cfg, grp, "resolver-library", "mmsbox_resolvefuncs", &mmsbox_resolvefuncs_shell)) == NULL)
rfs = &mmsbox_resolvefuncs; rfs = &mmsbox_resolvefuncs;
rfs_settings = _mms_cfg_getx(grp, octstr_imm("resolver-module-parameters")); rfs_settings = _mms_cfg_getx(cfg, grp, octstr_imm("resolver-module-parameters"));
rfs_data = rfs->mmsbox_resolvermodule_init(rfs_settings ? octstr_get_cstr(rfs_settings) : NULL); rfs_data = rfs->mmsbox_resolvermodule_init(rfs_settings ? octstr_get_cstr(rfs_settings) : NULL);
/* Now get sendmms users. */ /* Now get sendmms users. */
@ -178,12 +178,12 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
memset(u, 0, sizeof *u); memset(u, 0, sizeof *u);
u->user = _mms_cfg_getx(x, octstr_imm("username")); u->user = _mms_cfg_getx(cfg, x, octstr_imm("username"));
u->pass = _mms_cfg_getx(x, octstr_imm("password")); u->pass = _mms_cfg_getx(cfg, x, octstr_imm("password"));
u->faked_sender = mms_cfg_get(x, octstr_imm("faked-sender")); u->faked_sender = mms_cfg_get(cfg, x, octstr_imm("faked-sender"));
u->dlr_url = _mms_cfg_getx(x, octstr_imm("delivery-report-url")); u->dlr_url = _mms_cfg_getx(cfg, x, octstr_imm("delivery-report-url"));
u->rr_url = _mms_cfg_getx(x, octstr_imm("read-report-url")); u->rr_url = _mms_cfg_getx(cfg, x, octstr_imm("read-report-url"));
u->mmsc = mms_cfg_get(x, octstr_imm("mmsc")); u->mmsc = mms_cfg_get(cfg, x, octstr_imm("mmsc"));
gwlist_append(sendmms_users, u); gwlist_append(sendmms_users, u);
} }
gwlist_destroy(l, NULL); gwlist_destroy(l, NULL);
@ -200,23 +200,23 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
memset(m, 0, sizeof *m); memset(m, 0, sizeof *m);
m->id = _mms_cfg_getx(x, octstr_imm("id")); m->id = _mms_cfg_getx(cfg, x, octstr_imm("id"));
if (octstr_len(m->id) < 1) if (octstr_len(m->id) < 1)
panic(0,"Missing required value `id' in config file!"); panic(0,"Missing required value `id' in config file!");
m->group_id = mms_cfg_get(x, octstr_imm("group-id")); m->group_id = mms_cfg_get(cfg, x, octstr_imm("group-id"));
if (m->group_id == NULL) if (m->group_id == NULL)
m->group_id = octstr_duplicate(m->id); m->group_id = octstr_duplicate(m->id);
m->mmsc_url = _mms_cfg_getx(x, octstr_imm("mmsc-url")); m->mmsc_url = _mms_cfg_getx(cfg, x, octstr_imm("mmsc-url"));
m->allowed_prefix = mms_cfg_get(x, octstr_imm("allowed-prefix")); m->allowed_prefix = mms_cfg_get(cfg, x, octstr_imm("allowed-prefix"));
m->denied_prefix = mms_cfg_get(x, octstr_imm("denied-prefix")); m->denied_prefix = mms_cfg_get(cfg, x, octstr_imm("denied-prefix"));
m->allowed_sender_prefix = mms_cfg_get(x, octstr_imm("allowed-sender-prefix")); m->allowed_sender_prefix = mms_cfg_get(cfg, x, octstr_imm("allowed-sender-prefix"));
m->denied_sender_prefix = mms_cfg_get(x, octstr_imm("denied-sender-prefix")); m->denied_sender_prefix = mms_cfg_get(cfg, x, octstr_imm("denied-sender-prefix"));
m->incoming.allow_ip = mms_cfg_get(x, octstr_imm("allow-ip")); m->incoming.allow_ip = mms_cfg_get(cfg, x, octstr_imm("allow-ip"));
m->incoming.deny_ip = mms_cfg_get(x, octstr_imm("deny-ip")); m->incoming.deny_ip = mms_cfg_get(cfg, x, octstr_imm("deny-ip"));
info(0, "MMSC[%s], allow=[%s], deny=[%s] group_id=[%s]", info(0, "MMSC[%s], allow=[%s], deny=[%s] group_id=[%s]",
octstr_get_cstr(m->id), octstr_get_cstr(m->id),
@ -224,13 +224,13 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
octstr_get_cstr(m->incoming.deny_ip), octstr_get_cstr(m->incoming.deny_ip),
octstr_get_cstr(m->group_id)); octstr_get_cstr(m->group_id));
m->incoming.user = _mms_cfg_getx(x, octstr_imm("incoming-username")); m->incoming.user = _mms_cfg_getx(cfg, x, octstr_imm("incoming-username"));
m->incoming.pass = _mms_cfg_getx(x, octstr_imm("incoming-password")); m->incoming.pass = _mms_cfg_getx(cfg, x, octstr_imm("incoming-password"));
mms_cfg_get_int(x, octstr_imm("incoming-port"), &m->incoming.port); mms_cfg_get_int(cfg, x, octstr_imm("incoming-port"), &m->incoming.port);
#ifdef HAVE_LIBSSL #ifdef HAVE_LIBSSL
mms_cfg_get_bool(x, octstr_imm("incoming-port-ssl"), &ssl); mms_cfg_get_bool(cfg, x, octstr_imm("incoming-port-ssl"), &ssl);
#endif #endif
if ((tmp = mms_cfg_get(x, octstr_imm("max-throughput"))) != NULL) { if ((tmp = mms_cfg_get(cfg, x, octstr_imm("max-throughput"))) != NULL) {
if (octstr_parse_double(&m->throughput, tmp, 0) == -1) if (octstr_parse_double(&m->throughput, tmp, 0) == -1)
m->throughput = 0; m->throughput = 0;
info(0, "Set throughput to %.3f for mmsc id <%s>", info(0, "Set throughput to %.3f for mmsc id <%s>",
@ -238,21 +238,21 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
octstr_destroy(tmp); octstr_destroy(tmp);
} }
type = _mms_cfg_getx(x, octstr_imm("type")); type = _mms_cfg_getx(cfg, x, octstr_imm("type"));
if (octstr_case_compare(type, octstr_imm("eaif")) == 0) if (octstr_case_compare(type, octstr_imm("eaif")) == 0)
m->type = EAIF_MMSC; m->type = EAIF_MMSC;
else if (octstr_case_compare(type, octstr_imm("soap")) == 0) else if (octstr_case_compare(type, octstr_imm("soap")) == 0)
m->type = SOAP_MMSC; m->type = SOAP_MMSC;
else if (octstr_case_compare(type, octstr_imm("custom")) == 0) { else if (octstr_case_compare(type, octstr_imm("custom")) == 0) {
m->type = CUSTOM_MMSC; m->type = CUSTOM_MMSC;
m->settings = _mms_cfg_getx(x, octstr_imm("custom-settings")); m->settings = _mms_cfg_getx(cfg, x, octstr_imm("custom-settings"));
/* also load the libary. */ /* also load the libary. */
if ((m->fns = _mms_load_module(x, "mmsc-library", "mmsc_funcs", NULL)) == NULL) if ((m->fns = _mms_load_module(cfg, x, "mmsc-library", "mmsc_funcs", NULL)) == NULL)
panic(0, "failed to load MMSC libary functions from module!"); panic(0, "failed to load MMSC libary functions from module!");
} else } else
warning(0, "MMSBox: Unknown MMSC type [%s]!", warning(0, "MMSBox: Unknown MMSC type [%s]!",
octstr_get_cstr(type)); octstr_get_cstr(type));
if ((xver = _mms_cfg_getx(x, octstr_imm("mm7-version"))) != NULL && if ((xver = _mms_cfg_getx(cfg, x, octstr_imm("mm7-version"))) != NULL &&
octstr_len(xver) > 0) octstr_len(xver) > 0)
sscanf(octstr_get_cstr(xver), sscanf(octstr_get_cstr(xver),
"%d.%d.%d", "%d.%d.%d",
@ -268,7 +268,7 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
} }
} }
if ((s = mms_cfg_get(x, octstr_imm("mm7-soap-xmlns"))) != NULL) { if ((s = mms_cfg_get(cfg, x, octstr_imm("mm7-soap-xmlns"))) != NULL) {
strncpy(m->ver.xmlns, octstr_get_cstr(s), sizeof m->ver.xmlns); strncpy(m->ver.xmlns, octstr_get_cstr(s), sizeof m->ver.xmlns);
m->ver.xmlns[-1 + sizeof m->ver.xmlns] = 0; /* NULL terminate, just in case. */ m->ver.xmlns[-1 + sizeof m->ver.xmlns] = 0; /* NULL terminate, just in case. */
octstr_destroy(s); octstr_destroy(s);
@ -276,13 +276,13 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
m->ver.xmlns[0] = 0; m->ver.xmlns[0] = 0;
m->ver.use_mm7_namespace = 1; m->ver.use_mm7_namespace = 1;
mms_cfg_get_bool(x, octstr_imm("use-mm7-soap-namespace-prefix"), &m->ver.use_mm7_namespace); mms_cfg_get_bool(cfg, x, octstr_imm("use-mm7-soap-namespace-prefix"), &m->ver.use_mm7_namespace);
octstr_destroy(xver); octstr_destroy(xver);
octstr_destroy(type); octstr_destroy(type);
/* Init for filter. */ /* Init for filter. */
if ((s = mms_cfg_get(x, octstr_imm("mm7-mt-filter-params"))) != NULL) { if ((s = mms_cfg_get(cfg, x, octstr_imm("mm7-mt-filter-params"))) != NULL) {
if (mt_filter) if (mt_filter)
m->use_mt_filter = (mt_filter->init(m->mmsc_url, m->id, s) == 1); m->use_mt_filter = (mt_filter->init(m->mmsc_url, m->id, s) == 1);
else else
@ -296,13 +296,13 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
} else } else
m->use_mt_filter = 0; m->use_mt_filter = 0;
mms_cfg_get_bool(x, octstr_imm("reroute"), &m->reroute); mms_cfg_get_bool(cfg, x, octstr_imm("reroute"), &m->reroute);
mms_cfg_get_bool(x, octstr_imm("reroute-add-sender-to-subject"), &m->reroute_mod_subject); mms_cfg_get_bool(cfg, x, octstr_imm("reroute-add-sender-to-subject"), &m->reroute_mod_subject);
m->reroute_mmsc_id = mms_cfg_get(x, octstr_imm("reroute-mmsc-id")); m->reroute_mmsc_id = mms_cfg_get(cfg, x, octstr_imm("reroute-mmsc-id"));
if (m->reroute_mmsc_id != NULL && m->reroute == 0) if (m->reroute_mmsc_id != NULL && m->reroute == 0)
warning(0, "MMSBox: reroute-mmsc-id parameter set but reroute=false!"); warning(0, "MMSBox: reroute-mmsc-id parameter set but reroute=false!");
mms_cfg_get_bool(x, octstr_imm("no-sender-address"), &m->no_senderaddress); mms_cfg_get_bool(cfg, x, octstr_imm("no-sender-address"), &m->no_senderaddress);
m->mutex = mutex_create(); m->mutex = mutex_create();
/* finally start the thingie. */ /* finally start the thingie. */
@ -341,73 +341,73 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
MmsService *m = gw_malloc(sizeof *m); MmsService *m = gw_malloc(sizeof *m);
Octstr *s; Octstr *s;
m->name = _mms_cfg_getx(x, octstr_imm("name")); m->name = _mms_cfg_getx(cfg, x, octstr_imm("name"));
if ((m->url = mms_cfg_get(x, octstr_imm("get-url"))) != NULL) if ((m->url = mms_cfg_get(cfg, x, octstr_imm("get-url"))) != NULL)
m->type = TRANS_TYPE_GET_URL; m->type = TRANS_TYPE_GET_URL;
else if ((m->url = mms_cfg_get(x, octstr_imm("post-url"))) != NULL) else if ((m->url = mms_cfg_get(cfg, x, octstr_imm("post-url"))) != NULL)
m->type = TRANS_TYPE_POST_URL; m->type = TRANS_TYPE_POST_URL;
else if ((m->url = mms_cfg_get(x, octstr_imm("file"))) != NULL) else if ((m->url = mms_cfg_get(cfg, x, octstr_imm("file"))) != NULL)
m->type = TRANS_TYPE_FILE; m->type = TRANS_TYPE_FILE;
else if ((m->url = mms_cfg_get(x, octstr_imm("exec"))) != NULL) else if ((m->url = mms_cfg_get(cfg, x, octstr_imm("exec"))) != NULL)
m->type = TRANS_TYPE_EXEC; m->type = TRANS_TYPE_EXEC;
else if ((m->url = mms_cfg_get(x, octstr_imm("text"))) != NULL) else if ((m->url = mms_cfg_get(cfg, x, octstr_imm("text"))) != NULL)
m->type = TRANS_TYPE_TEXT; m->type = TRANS_TYPE_TEXT;
else else
panic(0, "MMSBox: Service [%s] has no url!", octstr_get_cstr(m->name)); panic(0, "MMSBox: Service [%s] has no url!", octstr_get_cstr(m->name));
m->faked_sender = mms_cfg_get(x, octstr_imm("faked-sender")); m->faked_sender = mms_cfg_get(cfg, x, octstr_imm("faked-sender"));
m->isdefault = 0; m->isdefault = 0;
mms_cfg_get_bool(x, octstr_imm("catch-all"), &m->isdefault); mms_cfg_get_bool(cfg, x, octstr_imm("catch-all"), &m->isdefault);
if (m->isdefault) { if (m->isdefault) {
if (catchall) if (catchall)
warning(0, "MMSBox: Multiple default mms services defined!"); warning(0, "MMSBox: Multiple default mms services defined!");
catchall = m; catchall = m;
} }
if (mms_cfg_get_bool(x, octstr_imm("omit-empty"), &m->omitempty) < 0) if (mms_cfg_get_bool(cfg, x, octstr_imm("omit-empty"), &m->omitempty) < 0)
m->omitempty = 0; m->omitempty = 0;
if (mms_cfg_get_bool(x, octstr_imm("suppress-reply"), &m->noreply) < 0) if (mms_cfg_get_bool(cfg, x, octstr_imm("suppress-reply"), &m->noreply) < 0)
m->noreply = 0; m->noreply = 0;
mms_cfg_get_bool(x, octstr_imm("accept-x-mbuni-headers"), &m->accept_x_headers); mms_cfg_get_bool(cfg, x, octstr_imm("accept-x-mbuni-headers"), &m->accept_x_headers);
if ((s = mms_cfg_get(x, octstr_imm("pass-thro-headers"))) != NULL) { if ((s = mms_cfg_get(cfg, x, octstr_imm("pass-thro-headers"))) != NULL) {
m->passthro_headers = octstr_split(s, octstr_imm(",")); m->passthro_headers = octstr_split(s, octstr_imm(","));
octstr_destroy(s); octstr_destroy(s);
} else } else
m->passthro_headers = NULL; m->passthro_headers = NULL;
mms_cfg_get_bool(x, octstr_imm("assume-plain-text"), &m->assume_plain_text); mms_cfg_get_bool(cfg, x, octstr_imm("assume-plain-text"), &m->assume_plain_text);
if ((s = mms_cfg_get(x, octstr_imm("accepted-mmscs"))) != NULL) { if ((s = mms_cfg_get(cfg, x, octstr_imm("accepted-mmscs"))) != NULL) {
m->allowed_mmscs = octstr_split(s, octstr_imm(";")); m->allowed_mmscs = octstr_split(s, octstr_imm(";"));
octstr_destroy(s); octstr_destroy(s);
} else } else
m->allowed_mmscs = NULL; /* means allow all. */ m->allowed_mmscs = NULL; /* means allow all. */
if ((s = mms_cfg_get(x, octstr_imm("denied-mmscs"))) != NULL) { if ((s = mms_cfg_get(cfg, x, octstr_imm("denied-mmscs"))) != NULL) {
m->denied_mmscs = octstr_split(s, octstr_imm(";")); m->denied_mmscs = octstr_split(s, octstr_imm(";"));
octstr_destroy(s); octstr_destroy(s);
} else } else
m->denied_mmscs = NULL; /* means allow all. */ m->denied_mmscs = NULL; /* means allow all. */
m->allowed_receiver_prefix = mms_cfg_get(x, octstr_imm("allowed-receiver-prefix")); m->allowed_receiver_prefix = mms_cfg_get(cfg, x, octstr_imm("allowed-receiver-prefix"));
m->denied_receiver_prefix = mms_cfg_get(x, octstr_imm("denied-receiver-prefix")); m->denied_receiver_prefix = mms_cfg_get(cfg, x, octstr_imm("denied-receiver-prefix"));
/* Get key words. Start with aliases to make life easier. */ /* Get key words. Start with aliases to make life easier. */
if ((s = mms_cfg_get(x, octstr_imm("aliases"))) != NULL) { if ((s = mms_cfg_get(cfg, x, octstr_imm("aliases"))) != NULL) {
m->keywords = octstr_split(s, octstr_imm(";")); m->keywords = octstr_split(s, octstr_imm(";"));
octstr_destroy(s); octstr_destroy(s);
} else } else
m->keywords = gwlist_create(); m->keywords = gwlist_create();
s = mms_cfg_get(x, octstr_imm("keyword")); s = mms_cfg_get(cfg, x, octstr_imm("keyword"));
if (!s) if (!s)
panic(0, "MMSBox: Service [%s] has no keyword!", octstr_get_cstr(m->name)); panic(0, "MMSBox: Service [%s] has no keyword!", octstr_get_cstr(m->name));
else else
gwlist_append(m->keywords, s); gwlist_append(m->keywords, s);
if ((s = mms_cfg_get(x, octstr_imm("http-post-parameters"))) != NULL) { if ((s = mms_cfg_get(cfg, x, octstr_imm("http-post-parameters"))) != NULL) {
List *r = octstr_split(s, octstr_imm("&")); List *r = octstr_split(s, octstr_imm("&"));
int i, n; int i, n;
m->params = gwlist_create(); m->params = gwlist_create();
@ -470,7 +470,7 @@ int mms_load_mmsbox_settings(mCfg *cfg, gwthread_func_t *mmsc_handler_func)
} else } else
m->params = NULL; m->params = NULL;
m->service_code = mms_cfg_get(x, octstr_imm("service-code")); m->service_code = mms_cfg_get(cfg, x, octstr_imm("service-code"));
gwlist_append(mms_services, m); gwlist_append(mms_services, m);
} }

View File

@ -52,37 +52,37 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
if (grp == NULL) if (grp == NULL)
panic(0,"Missing required group `mbuni' in config file!"); panic(0,"Missing required group `mbuni' in config file!");
mms_load_core_settings(cgrp); mms_load_core_settings(cfg, cgrp);
m->hostname = mms_cfg_get(grp, octstr_imm("hostname")); m->hostname = mms_cfg_get(cfg, grp, octstr_imm("hostname"));
if (octstr_len(m->hostname) == 0) if (octstr_len(m->hostname) == 0)
m->hostname = octstr_create("localhost"); m->hostname = octstr_create("localhost");
if ((m->host_alias = mms_cfg_get(grp, octstr_imm("host-alias"))) == NULL) if ((m->host_alias = mms_cfg_get(cfg, grp, octstr_imm("host-alias"))) == NULL)
m->host_alias = octstr_duplicate(m->hostname); m->host_alias = octstr_duplicate(m->hostname);
if (proxyrelays) if (proxyrelays)
*proxyrelays = mms_proxy_relays(cfg, m->hostname); *proxyrelays = mms_proxy_relays(cfg, m->hostname);
if (mms_cfg_get_int(grp, octstr_imm("max-send-threads"), &m->maxthreads) == -1) if (mms_cfg_get_int(cfg, grp, octstr_imm("max-send-threads"), &m->maxthreads) == -1)
m->maxthreads = 10; m->maxthreads = 10;
m->unified_prefix = _mms_cfg_getx(grp, octstr_imm("unified-prefix")); m->unified_prefix = _mms_cfg_getx(cfg, grp, octstr_imm("unified-prefix"));
m->local_prefix = _mms_cfg_getx(grp, octstr_imm("local-prefixes")); m->local_prefix = _mms_cfg_getx(cfg, grp, octstr_imm("local-prefixes"));
if ((s = mms_cfg_get(grp, octstr_imm("strip-prefixes"))) != NULL) { if ((s = mms_cfg_get(cfg, grp, octstr_imm("strip-prefixes"))) != NULL) {
m->strip_prefixes = octstr_split(s, octstr_imm(";")); m->strip_prefixes = octstr_split(s, octstr_imm(";"));
octstr_destroy(s); octstr_destroy(s);
} else } else
m->strip_prefixes = NULL; m->strip_prefixes = NULL;
m->name = _mms_cfg_getx(grp, octstr_imm("name")); m->name = _mms_cfg_getx(cfg, grp, octstr_imm("name"));
m->sendmail = _mms_cfg_getx(grp, octstr_imm("send-mail-prog")); m->sendmail = _mms_cfg_getx(cfg, grp, octstr_imm("send-mail-prog"));
qdir = _mms_cfg_getx(grp, octstr_imm("storage-directory")); qdir = _mms_cfg_getx(cfg, grp, octstr_imm("storage-directory"));
if (qdir && octstr_len(qdir) >= QFNAMEMAX) if (qdir && octstr_len(qdir) >= QFNAMEMAX)
warning(0, "storage-directory name too long. Max length is %d", QFNAMEMAX); warning(0, "storage-directory name too long. Max length is %d", QFNAMEMAX);
@ -92,11 +92,11 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
panic(0, "Failed to create queue directory: %s - %s!", panic(0, "Failed to create queue directory: %s - %s!",
octstr_get_cstr(qdir), strerror(errno)); octstr_get_cstr(qdir), strerror(errno));
if ((m->qfs = _mms_load_module(grp, "queue-manager-module", "qfuncs", NULL)) == NULL) { if ((m->qfs = _mms_load_module(cfg, grp, "queue-manager-module", "qfuncs", NULL)) == NULL) {
m->qfs = &default_qfuncs; /* default queue handler. */ m->qfs = &default_qfuncs; /* default queue handler. */
m->qfs->mms_init_queue_module(qdir, m->maxthreads); m->qfs->mms_init_queue_module(qdir, m->maxthreads);
} else { } else {
Octstr *s = _mms_cfg_getx(grp, octstr_imm("queue-module-init-data")); Octstr *s = _mms_cfg_getx(cfg, grp, octstr_imm("queue-module-init-data"));
if (m->qfs->mms_init_queue_module(s, m->maxthreads) != 0) if (m->qfs->mms_init_queue_module(s, m->maxthreads) != 0)
panic(0, "failed to initialise queue module, with data: %s", panic(0, "failed to initialise queue module, with data: %s",
octstr_get_cstr(s)); octstr_get_cstr(s));
@ -126,28 +126,28 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
panic(0, "Failed to initialise UA Profile directory, error: %s!", panic(0, "Failed to initialise UA Profile directory, error: %s!",
strerror(errno)); strerror(errno));
if (mms_cfg_get_int(grp, octstr_imm("maximum-send-attempts"), &m->maxsendattempts) == -1) if (mms_cfg_get_int(cfg, grp, octstr_imm("maximum-send-attempts"), &m->maxsendattempts) == -1)
m->maxsendattempts = MAXQTRIES; m->maxsendattempts = MAXQTRIES;
if (mms_cfg_get_int(grp, octstr_imm("default-message-expiry"), &m->default_msgexpiry) == -1) if (mms_cfg_get_int(cfg, grp, octstr_imm("default-message-expiry"), &m->default_msgexpiry) == -1)
m->default_msgexpiry = DEFAULT_EXPIRE; m->default_msgexpiry = DEFAULT_EXPIRE;
s = _mms_cfg_getx(grp, octstr_imm("queue-run-interval")); s = _mms_cfg_getx(cfg, grp, octstr_imm("queue-run-interval"));
if (!s || (m->queue_interval = atof(octstr_get_cstr(s))) <= 0) if (!s || (m->queue_interval = atof(octstr_get_cstr(s))) <= 0)
m->queue_interval = QUEUERUN_INTERVAL; m->queue_interval = QUEUERUN_INTERVAL;
octstr_destroy(s); octstr_destroy(s);
if (mms_cfg_get_int(grp, octstr_imm("send-attempt-back-off"), &m->send_back_off) == -1) if (mms_cfg_get_int(cfg, grp, octstr_imm("send-attempt-back-off"), &m->send_back_off) == -1)
m->send_back_off = BACKOFF_FACTOR; m->send_back_off = BACKOFF_FACTOR;
/* Make send sms url. */ /* Make send sms url. */
m->sendsms_url = _mms_cfg_getx(grp, octstr_imm("sendsms-url")); m->sendsms_url = _mms_cfg_getx(cfg, grp, octstr_imm("sendsms-url"));
user = mms_cfg_get(grp, octstr_imm("sendsms-username")); user = mms_cfg_get(cfg, grp, octstr_imm("sendsms-username"));
pass = mms_cfg_get(grp, octstr_imm("sendsms-password")); pass = mms_cfg_get(cfg, grp, octstr_imm("sendsms-password"));
from = mms_cfg_get(grp, octstr_imm("sendsms-global-sender")); from = mms_cfg_get(cfg, grp, octstr_imm("sendsms-global-sender"));
i = octstr_search_char(m->sendsms_url, '?', 0); /* If ? is in there, omit below. */ i = octstr_search_char(m->sendsms_url, '?', 0); /* If ? is in there, omit below. */
@ -166,45 +166,45 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
octstr_destroy(pass); octstr_destroy(pass);
octstr_destroy(from); octstr_destroy(from);
mms_cfg_get_int(grp, octstr_imm("mms-port"), &port); mms_cfg_get_int(cfg, grp, octstr_imm("mms-port"), &port);
m->port = (port > 0) ? port : MMS_PORT; m->port = (port > 0) ? port : MMS_PORT;
m->mm7port = -1; m->mm7port = -1;
mms_cfg_get_int(grp, octstr_imm("mm7-port"), &m->mm7port); mms_cfg_get_int(cfg, grp, octstr_imm("mm7-port"), &m->mm7port);
m->allow_ip = _mms_cfg_getx(grp, octstr_imm("allow-ip")); m->allow_ip = _mms_cfg_getx(cfg, grp, octstr_imm("allow-ip"));
m->deny_ip = _mms_cfg_getx(grp, octstr_imm("deny-ip")); m->deny_ip = _mms_cfg_getx(cfg, grp, octstr_imm("deny-ip"));
m->email2mmsrelay_hosts = _mms_cfg_getx(grp, m->email2mmsrelay_hosts = _mms_cfg_getx(cfg, grp,
octstr_imm("email2mms-relay-hosts")); octstr_imm("email2mms-relay-hosts"));
m->prov_notify = _mms_cfg_getx(grp,octstr_imm("prov-server-notify-script")); m->prov_notify = _mms_cfg_getx(cfg, grp,octstr_imm("prov-server-notify-script"));
m->prov_getstatus = _mms_cfg_getx(grp,octstr_imm("prov-server-sub-status-script")); m->prov_getstatus = _mms_cfg_getx(cfg, grp,octstr_imm("prov-server-sub-status-script"));
m->mms_notify_txt = _mms_cfg_getx(grp, octstr_imm("mms-notify-text")); m->mms_notify_txt = _mms_cfg_getx(cfg, grp, octstr_imm("mms-notify-text"));
m->mms_notify_unprov_txt = _mms_cfg_getx(grp, octstr_imm("mms-notify-unprovisioned-text")); m->mms_notify_unprov_txt = _mms_cfg_getx(cfg, grp, octstr_imm("mms-notify-unprovisioned-text"));
m->mms_email_txt = _mms_cfg_getx(grp, octstr_imm("mms-to-email-txt")); m->mms_email_txt = _mms_cfg_getx(cfg, grp, octstr_imm("mms-to-email-txt"));
m->mms_email_html = _mms_cfg_getx(grp, octstr_imm("mms-to-email-html")); m->mms_email_html = _mms_cfg_getx(cfg, grp, octstr_imm("mms-to-email-html"));
m->mms_email_subject = mms_cfg_get(grp, octstr_imm("mms-to-email-default-subject")); m->mms_email_subject = mms_cfg_get(cfg, grp, octstr_imm("mms-to-email-default-subject"));
m->mms_toolarge = _mms_cfg_getx(grp, octstr_imm("mms-message-too-large-txt")); m->mms_toolarge = _mms_cfg_getx(cfg, grp, octstr_imm("mms-message-too-large-txt"));
m->wap_gw_msisdn_header = mms_cfg_get(grp, octstr_imm("mms-client-msisdn-header")); m->wap_gw_msisdn_header = mms_cfg_get(cfg, grp, octstr_imm("mms-client-msisdn-header"));
if (!m->wap_gw_msisdn_header) m->wap_gw_msisdn_header = octstr_imm(XMSISDN_HEADER); if (!m->wap_gw_msisdn_header) m->wap_gw_msisdn_header = octstr_imm(XMSISDN_HEADER);
m->wap_gw_ip_header = mms_cfg_get(grp, octstr_imm("mms-client-ip-header")); m->wap_gw_ip_header = mms_cfg_get(cfg, grp, octstr_imm("mms-client-ip-header"));
if (!m->wap_gw_ip_header) m->wap_gw_ip_header = octstr_imm(XIP_HEADER); if (!m->wap_gw_ip_header) m->wap_gw_ip_header = octstr_imm(XIP_HEADER);
mms_cfg_get_bool(grp, octstr_imm("notify-unprovisioned"), &m->notify_unprovisioned); mms_cfg_get_bool(cfg, grp, octstr_imm("notify-unprovisioned"), &m->notify_unprovisioned);
m->billing_params = _mms_cfg_getx(grp, m->billing_params = _mms_cfg_getx(cfg, grp,
octstr_imm("billing-module-parameters")); octstr_imm("billing-module-parameters"));
/* Get and load the billing lib if any. */ /* Get and load the billing lib if any. */
if ((m->mms_billfuncs = _mms_load_module(grp, "billing-library", "mms_billfuncs", if ((m->mms_billfuncs = _mms_load_module(cfg, grp, "billing-library", "mms_billfuncs",
&mms_billfuncs_shell)) != NULL) { &mms_billfuncs_shell)) != NULL) {
if (m->mms_billfuncs->mms_billingmodule_init == NULL || if (m->mms_billfuncs->mms_billingmodule_init == NULL ||
m->mms_billfuncs->mms_billmsg == NULL || m->mms_billfuncs->mms_billmsg == NULL ||
@ -216,11 +216,11 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
m->mms_bill_module_data = m->mms_billfuncs->mms_billingmodule_init(octstr_get_cstr(m->billing_params)); m->mms_bill_module_data = m->mms_billfuncs->mms_billingmodule_init(octstr_get_cstr(m->billing_params));
m->resolver_params = _mms_cfg_getx(grp, m->resolver_params = _mms_cfg_getx(cfg, grp,
octstr_imm("resolver-module-parameters")); octstr_imm("resolver-module-parameters"));
/* Get and load the resolver lib if any. */ /* Get and load the resolver lib if any. */
if ((m->mms_resolvefuncs = _mms_load_module(grp, "resolver-library", if ((m->mms_resolvefuncs = _mms_load_module(cfg, grp, "resolver-library",
"mms_resolvefuncs", "mms_resolvefuncs",
&mms_resolvefuncs_shell)) != NULL) { &mms_resolvefuncs_shell)) != NULL) {
if (m->mms_resolvefuncs->mms_resolvermodule_init == NULL || if (m->mms_resolvefuncs->mms_resolvermodule_init == NULL ||
@ -232,10 +232,10 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
m->mms_resolver_module_data = m->mms_resolvefuncs->mms_resolvermodule_init(octstr_get_cstr(m->resolver_params)); m->mms_resolver_module_data = m->mms_resolvefuncs->mms_resolvermodule_init(octstr_get_cstr(m->resolver_params));
m->detokenizer_params = _mms_cfg_getx(grp, octstr_imm("detokenizer-module-parameters")); m->detokenizer_params = _mms_cfg_getx(cfg, grp, octstr_imm("detokenizer-module-parameters"));
/* Get and load the detokenizer lib if any. */ /* Get and load the detokenizer lib if any. */
if ((m->mms_detokenizefuncs = _mms_load_module(grp, "detokenizer-library", if ((m->mms_detokenizefuncs = _mms_load_module(cfg, grp, "detokenizer-library",
"mms_detokenizefuncs", "mms_detokenizefuncs",
&mms_detokenizefuncs_shell)) != NULL) { &mms_detokenizefuncs_shell)) != NULL) {
if (m->mms_detokenizefuncs->mms_detokenizer_init == NULL || if (m->mms_detokenizefuncs->mms_detokenizer_init == NULL ||
@ -248,16 +248,16 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
} else } else
m->mms_detokenizefuncs = NULL; m->mms_detokenizefuncs = NULL;
if (mms_cfg_get_bool(grp, octstr_imm("allow-ip-type"), &m->allow_ip_type) < 0) if (mms_cfg_get_bool(cfg, grp, octstr_imm("allow-ip-type"), &m->allow_ip_type) < 0)
m->allow_ip_type = 1; m->allow_ip_type = 1;
mms_cfg_get_bool(grp, octstr_imm("optimize-notification-size"), mms_cfg_get_bool(cfg, grp, octstr_imm("optimize-notification-size"),
&m->optimize_notification_size); &m->optimize_notification_size);
if (mms_cfg_get_bool(grp, octstr_imm("content-adaptation"), &m->content_adaptation) < 0) if (mms_cfg_get_bool(cfg, grp, octstr_imm("content-adaptation"), &m->content_adaptation) < 0)
m->content_adaptation = 1; m->content_adaptation = 1;
if (mms_cfg_get_bool(grp, octstr_imm("send-dlr-on-fetch"), &m->dlr_on_fetch) < 0) if (mms_cfg_get_bool(cfg, grp, octstr_imm("send-dlr-on-fetch"), &m->dlr_on_fetch) < 0)
m->dlr_on_fetch = 0; m->dlr_on_fetch = 0;
@ -272,16 +272,16 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
Octstr *s; Octstr *s;
int ibool = 0; int ibool = 0;
mv->id = _mms_cfg_getx(grp, octstr_imm("vasp-id")); mv->id = _mms_cfg_getx(cfg, grp, octstr_imm("vasp-id"));
mv->short_code = -1; mv->short_code = -1;
mms_cfg_get_int(grp, octstr_imm("short-code"), &mv->short_code); mms_cfg_get_int(cfg, grp, octstr_imm("short-code"), &mv->short_code);
mv->vasp_username = _mms_cfg_getx(grp, octstr_imm("vasp-username")); mv->vasp_username = _mms_cfg_getx(cfg, grp, octstr_imm("vasp-username"));
mv->vasp_password = _mms_cfg_getx(grp, octstr_imm("vasp-password")); mv->vasp_password = _mms_cfg_getx(cfg, grp, octstr_imm("vasp-password"));
mv->vasp_url = _mms_cfg_getx(grp, octstr_imm("vasp-url")); mv->vasp_url = _mms_cfg_getx(cfg, grp, octstr_imm("vasp-url"));
s = _mms_cfg_getx(grp, octstr_imm("type")); s = _mms_cfg_getx(cfg, grp, octstr_imm("type"));
if (octstr_case_compare(s, octstr_imm("soap")) == 0) if (octstr_case_compare(s, octstr_imm("soap")) == 0)
mv->type = SOAP_VASP; mv->type = SOAP_VASP;
@ -292,7 +292,7 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
octstr_destroy(s); octstr_destroy(s);
mv->ver.major = mv->ver.minor1 = mv->ver.minor2 = 0; mv->ver.major = mv->ver.minor1 = mv->ver.minor2 = 0;
if ((s = mms_cfg_get(grp, octstr_imm("mm7-version"))) != NULL && if ((s = mms_cfg_get(cfg, grp, octstr_imm("mm7-version"))) != NULL &&
octstr_len(s) > 0) octstr_len(s) > 0)
sscanf(octstr_get_cstr(s), "%d.%d.%d", &mv->ver.major, &mv->ver.minor1, &mv->ver.minor2); sscanf(octstr_get_cstr(s), "%d.%d.%d", &mv->ver.major, &mv->ver.minor1, &mv->ver.minor2);
else { else {
@ -307,7 +307,7 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
} }
octstr_destroy(s); octstr_destroy(s);
if ((s = mms_cfg_get(grp, octstr_imm("mm7-soap-xmlns"))) != NULL) { if ((s = mms_cfg_get(cfg, grp, octstr_imm("mm7-soap-xmlns"))) != NULL) {
strncpy(mv->ver.xmlns, octstr_get_cstr(s), sizeof mv->ver.xmlns); strncpy(mv->ver.xmlns, octstr_get_cstr(s), sizeof mv->ver.xmlns);
mv->ver.xmlns[-1 + sizeof mv->ver.xmlns] = 0; /* NULL terminate, just in case. */ mv->ver.xmlns[-1 + sizeof mv->ver.xmlns] = 0; /* NULL terminate, just in case. */
@ -316,23 +316,23 @@ MmscSettings *mms_load_mmsc_settings(mCfg *cfg, List **proxyrelays)
mv->ver.xmlns[0] = 0; mv->ver.xmlns[0] = 0;
mv->ver.use_mm7_namespace = 1; mv->ver.use_mm7_namespace = 1;
mms_cfg_get_bool(grp, octstr_imm("use-mm7-soap-namespace-prefix"), &mv->ver.use_mm7_namespace); mms_cfg_get_bool(cfg, grp, octstr_imm("use-mm7-soap-namespace-prefix"), &mv->ver.use_mm7_namespace);
/* Set the handler vasp accounts. */ /* Set the handler vasp accounts. */
if (mms_cfg_get_bool(grp, octstr_imm("mms-to-email-handler"), &ibool) == 0 && if (mms_cfg_get_bool(cfg, grp, octstr_imm("mms-to-email-handler"), &ibool) == 0 &&
ibool) { ibool) {
if (m->mms2email) if (m->mms2email)
warning(0, "mms-to-email handler VASP specified more than once! Only last config taken."); warning(0, "mms-to-email handler VASP specified more than once! Only last config taken.");
m->mms2email = mv; m->mms2email = mv;
} }
if (mms_cfg_get_bool(grp, octstr_imm("mms-to-local-copy-handler"), &ibool) == 0 && if (mms_cfg_get_bool(cfg, grp, octstr_imm("mms-to-local-copy-handler"), &ibool) == 0 &&
ibool) { ibool) {
if (m->mms2mobile) if (m->mms2mobile)
warning(0, "mms-to-mobile copy handler VASP specified more than once! Only last config taken."); warning(0, "mms-to-mobile copy handler VASP specified more than once! Only last config taken.");
m->mms2mobile = mv; m->mms2mobile = mv;
} }
if ((s = mms_cfg_get(grp, octstr_imm("send-uaprof"))) != NULL){ if ((s = mms_cfg_get(cfg, grp, octstr_imm("send-uaprof"))) != NULL){
if (octstr_str_case_compare(s, "url") == 0) if (octstr_str_case_compare(s, "url") == 0)
mv->send_uaprof = UAProf_URL; mv->send_uaprof = UAProf_URL;
else if (octstr_str_case_compare(s, "ua") == 0) else if (octstr_str_case_compare(s, "ua") == 0)
@ -361,16 +361,16 @@ List *mms_proxy_relays(mCfg *cfg, Octstr *myhostname)
MmsProxyRelay *m = gw_malloc(sizeof *m); MmsProxyRelay *m = gw_malloc(sizeof *m);
Octstr *s; Octstr *s;
m->host = _mms_cfg_getx(grp, octstr_imm("host")); m->host = _mms_cfg_getx(cfg, grp, octstr_imm("host"));
m->name = _mms_cfg_getx(grp, octstr_imm("name")); m->name = _mms_cfg_getx(cfg, grp, octstr_imm("name"));
m->allowed_prefix = _mms_cfg_getx(grp, octstr_imm("allowed-prefix")); m->allowed_prefix = _mms_cfg_getx(cfg, grp, octstr_imm("allowed-prefix"));
m->denied_prefix = _mms_cfg_getx(grp, octstr_imm("denied-prefix")); m->denied_prefix = _mms_cfg_getx(cfg, grp, octstr_imm("denied-prefix"));
if (mms_cfg_get_bool(grp, octstr_imm("confirmed-delivery"), &m->confirmed_mm4) < 0) if (mms_cfg_get_bool(cfg, grp, octstr_imm("confirmed-delivery"), &m->confirmed_mm4) < 0)
m->confirmed_mm4 = 1; m->confirmed_mm4 = 1;
m->sendmail = mms_cfg_get(grp, octstr_imm("send-mail-prog")); m->sendmail = mms_cfg_get(cfg, grp, octstr_imm("send-mail-prog"));
m->unified_prefix = mms_cfg_get(grp, octstr_imm("unified-prefix")); m->unified_prefix = mms_cfg_get(cfg, grp, octstr_imm("unified-prefix"));
if ((s = mms_cfg_get(grp, octstr_imm("strip-prefixes"))) != NULL) { if ((s = mms_cfg_get(cfg, grp, octstr_imm("strip-prefixes"))) != NULL) {
m->strip_prefixes = octstr_split(s, octstr_imm(";")); m->strip_prefixes = octstr_split(s, octstr_imm(";"));
octstr_destroy(s); octstr_destroy(s);
} else } else