/* * Mbuni - Open Source MMS Gateway * * MMS Relay, implements message routing * * Copyright (C) 2003 - 2005, Digital Solutions Ltd. - http://www.dsmagic.com * * Paul Bagyenda * * This program is free software, distributed under the terms of * the GNU General Public License, with a few exceptions granted (see LICENSE) */ #include "mmsrelay.h" static Cfg *cfg; MmsBoxSettings *settings; List *proxyrelays; static int rstop = 0; /* Set to 1 to stop relay. */ static void quit_now(int notused) { rstop = 1; } int main(int argc, char *argv[]) { int cfidx; Octstr *fname; CfgGroup *grp; Octstr *log, *alog; long loglevel; long qthread = 0; mms_lib_init(); srandom(time(NULL)); cfidx = get_and_set_debugs(argc, argv, NULL); if (argv[cfidx] == NULL) fname = octstr_imm("mmsc.conf"); else fname = octstr_create(argv[cfidx]); cfg = cfg_create(fname); if (cfg_read(cfg) == -1) panic(0, "Couldn't read configuration from '%s'.", octstr_get_cstr(fname)); octstr_destroy(fname); info(0, "----------------------------------------"); info(0, " " MM_NAME " MMSC Relay version %s starting", MMSC_VERSION); grp = cfg_get_single_group(cfg, octstr_imm("core")); log = cfg_get(grp, octstr_imm("log-file")); if (log != NULL) { if (cfg_get_integer(&loglevel, grp, octstr_imm("log-level")) == -1) loglevel = 0; log_open(octstr_get_cstr(log), loglevel, GW_NON_EXCL); octstr_destroy(log); } /* Get access log and open it. */ alog = cfg_get(grp, octstr_imm("access-log")); if (alog) { alog_open(octstr_get_cstr(alog), 1, 1); octstr_destroy(alog); } /* Load proxy relays. */ proxyrelays = mms_proxy_relays(cfg); /* Load settings. */ settings = mms_load_mmsbox_settings(cfg); if (!settings) panic(0, "No global MMSC configuration!"); mms_start_profile_engine(octstr_get_cstr(settings->ua_profile_cache_dir)); signal(SIGHUP, quit_now); signal(SIGTERM, quit_now); signal(SIGPIPE,SIG_IGN); /* Ignore pipe errors. They kill us sometimes for nothing*/ /* Start global queue runner. */ info(0, "Starting Global Queue Runner..."); qthread = gwthread_create((gwthread_func_t *)mbuni_global_queue_runner, &rstop); /* Start the local queue runner. */ info(0, "Starting Local Queue Runner..."); mbuni_mm1_queue_runner(&rstop); gwthread_join(qthread); /* Wait for it to die... */ sleep(2); /* It terminates, so start dying... */ mms_stop_profile_engine(); /* Stop profile stuff. */ sleep(2); /* Wait for them to die. */ return 0; };