Fixed null-pointer bug when GSM support is disabled
[lcr.git] / interface.c
index 1495d3b..e7ab171 100644 (file)
@@ -328,7 +328,7 @@ static int inter_portname(struct interface *interface, char *filename, int line,
        /* check for port already assigned, but not for shared gsm interface */
        searchif = interface_newlist;
 #if defined WITH_GSM_BS || defined WITH_GSM_MS
-       if (!strcmp(value, gsm->conf.interface_lcr))
+       if (options.gsm && !strcmp(value, gsm->conf.interface_lcr))
 #endif
        {
                while(searchif) {
@@ -918,7 +918,7 @@ static int inter_gsm_bs(struct interface *interface, char *filename, int line, c
        }
 
        /* set portname */
-       if (inter_portname(interface, filename, line, (char *)"portname", gsm->conf.interface_lcr))
+       if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
                return(-1);
 
        /* goto end of chain again to set gsmflag */
@@ -947,7 +947,7 @@ static int inter_gsm_ms(struct interface *interface, char *filename, int line, c
        }
 
        /* set portname */
-       if (inter_portname(interface, filename, line, (char *)"portname", gsm->conf.interface_lcr))
+       if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
                return(-1);
 
        /* goto end of chain again to set gsmflag and socket */
@@ -1054,6 +1054,42 @@ static int inter_ss5(struct interface *interface, char *filename, int line, char
        return(0);
 }
 #endif
+static int inter_remote(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       struct interface_port *ifport;
+       struct interface *searchif;
+
+       if (!value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects application name as value.\n", filename, line, parameter);
+               return(-1);
+       }
+       searchif = interface_newlist;
+       while(searchif) {
+               ifport = searchif->ifport;
+               while(ifport) {
+                       if (ifport->remote && !strcmp(ifport->remote_app, value)) {
+                               SPRINT(interface_error, "Error in %s (line %d): port '%s' already uses remote application '%s'.\n", filename, line, ifport->portname, value);
+                               return(-1);
+                       }
+                       ifport = ifport->next;
+               }
+               searchif = searchif->next;
+       }
+
+       /* set portname */
+       if (inter_portname(interface, filename, line, (char *)"portname", options.loopback_lcr))
+               return(-1);
+
+       /* goto end of chain again to set application name */
+       ifport = interface->ifport;
+       while(ifport->next)
+               ifport = ifport->next;
+       ifport->remote = 1;
+       SCPY(ifport->remote_app, value);
+
+
+       return(0);
+}
 
 
 /*
@@ -1127,7 +1163,8 @@ struct interface_param interface_param[] = {
        "Channel selection list for all outgoing calls to the interface.\n"
        "A free channels is searched in order of appearance.\n"
        "This parameter must follow a 'port' parameter.\n"
-       " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
+       " force - Forces the selected port with no acceptable alternative (see Q.931).\n"
+       "  -> this will be automatically set for multipoint (ptmp) NT-mode ports\n"
        " <number>[,...] - List of channels to search.\n"
        " free - Select any free channel\n"
        " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
@@ -1214,6 +1251,10 @@ struct interface_param interface_param[] = {
        " suppress - Suppress received tones, as they will be recognized."},
 #endif
 
+       {"remote", &inter_remote, "<application>",
+       "Sets up an interface that communicates with the remote application.\n"
+       "Use \"asterisk\" to use chan_lcr as remote application."},
+
        {NULL, NULL, NULL, NULL}
 };
 
@@ -1434,6 +1475,9 @@ static void set_defaults(struct interface_port *ifport)
                default_out_channel(ifport);
        if (!ifport->in_channel)
                default_in_channel(ifport);
+       /* must force the channel on PTMP/NT ports */
+       if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
+               ifport->channel_force = 1;
        /* default is_tones */
        if (ifport->interface->is_tones)
                ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);