diff options
Diffstat (limited to 'src/router/main.c')
-rw-r--r-- | src/router/main.c | 58 |
1 files changed, 45 insertions, 13 deletions
diff --git a/src/router/main.c b/src/router/main.c index 91bfdc6..82eeee3 100644 --- a/src/router/main.c +++ b/src/router/main.c @@ -33,13 +33,13 @@ #include "display.h" int num_kanal = 1; -osmo_cc_endpoint_t *cc_ep = NULL; +static osmo_cc_endpoint_t *cc_ep1 = NULL, *cc_ep2 = NULL; static char *routing_script = "~/.osmocom/router/routing.sh"; static char *routing_shell = "bash"; #define MAX_CC_ARGS 1024 -static int cc_argc = 0; -static const char *cc_argv[MAX_CC_ARGS]; +static int cc_argc1 = 0, cc_argc2 = 0; +static const char *cc_argv1[MAX_CC_ARGS], *cc_argv2[MAX_CC_ARGS]; static void print_usage(const char *app) { @@ -62,9 +62,12 @@ static void print_help() printf(" Define the shell to run the routing scrip. (default = %s)\n", routing_shell); printf(" -C --cc \"<osmo-cc arg>\" [--cc ...]\n"); printf(" Pass arguments to Osmo-CC endpoint. Use '-cc help' for description.\n"); + printf(" --cc2 \"<osmo-cc arg>\" [--cc2 ...]\n"); + printf(" Pass arguments to Osmo-CC endpoint of second instance. (multistack).\n"); } -#define OPT_XXX 256 +#define OPT_CC2 256 + static void add_options(void) { @@ -73,6 +76,7 @@ static void add_options(void) option_add('r', "routing-script", 1); option_add('s', "routing-shell", 1); option_add('C', "cc", 1); + option_add(OPT_CC2, "cc2", 1); } static int handle_options(int short_option, int argi, char **argv) @@ -106,11 +110,22 @@ static int handle_options(int short_option, int argi, char **argv) osmo_cc_help(); return 0; } - if (cc_argc == MAX_CC_ARGS) { + if (cc_argc1 == MAX_CC_ARGS) { fprintf(stderr, "Too many osmo-cc args!\n"); break; } - cc_argv[cc_argc++] = options_strdup(argv[argi]); + cc_argv1[cc_argc1++] = options_strdup(argv[argi]); + break; + case OPT_CC2: + if (!strcasecmp(argv[argi], "help")) { + osmo_cc_help(); + return 0; + } + if (cc_argc2 == MAX_CC_ARGS) { + fprintf(stderr, "Too many osmo-cc args!\n"); + break; + } + cc_argv2[cc_argc2++] = options_strdup(argv[argi]); break; default: return -EINVAL; @@ -169,15 +184,24 @@ int main(int argc, char *argv[]) return argi; /* init osmo-cc endpoint */ - cc_ep = calloc(1, sizeof(*cc_ep)); - if (!cc_ep) + cc_ep1 = calloc(1, sizeof(*cc_ep1)); + if (!cc_ep1) goto error; - rc = osmo_cc_new(cc_ep, OSMO_CC_VERSION, NULL, OSMO_CC_LOCATION_PRIV_SERV_LOC_USER, cc_message, NULL, NULL, cc_argc, cc_argv); + rc = osmo_cc_new(cc_ep1, OSMO_CC_VERSION, NULL, OSMO_CC_LOCATION_PRIV_SERV_LOC_USER, cc_message, NULL, NULL, cc_argc1, cc_argv1); if (rc < 0) goto error; + if (cc_argc2) { + /* init osmo-cc endpoint */ + cc_ep2 = calloc(1, sizeof(*cc_ep2)); + if (!cc_ep2) + goto error; + rc = osmo_cc_new(cc_ep2, OSMO_CC_VERSION, NULL, OSMO_CC_LOCATION_PRIV_SERV_LOC_USER, cc_message, NULL, NULL, cc_argc2, cc_argv2); + if (rc < 0) + goto error; + } /* init call handling */ - call_init(cc_ep, routing_script, routing_shell); + call_init(cc_ep1, cc_ep2, routing_script, routing_shell); /* prepare terminal */ tcgetattr(0, &term_orig); @@ -243,13 +267,21 @@ next_char: error: - if (cc_ep) { + if (cc_ep1) { + /* exit call handling */ + call_exit(); + + /* exit osmo-cc endpoint */ + osmo_cc_delete(cc_ep1); + free(cc_ep1); + } + if (cc_ep2) { /* exit call handling */ call_exit(); /* exit osmo-cc endpoint */ - osmo_cc_delete(cc_ep); - free(cc_ep); + osmo_cc_delete(cc_ep2); + free(cc_ep2); } /* exit FM */ |