Added 'extern' flag to interface.conf.
[lcr.git] / interface.c
index 9ab3c2c..df39b78 100644 (file)
@@ -114,6 +114,10 @@ static int inter_block(struct interface *interface, char *filename, int line, ch
 }
 static int inter_extension(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
+       if (interface->external) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed, because interface is external interface.\n", filename, line, parameter);
+               return(-1);
+       }
        if (value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
                return(-1);
@@ -121,6 +125,19 @@ static int inter_extension(struct interface *interface, char *filename, int line
        interface->extension = 1;
        return(0);
 }
+static int inter_extern(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       if (interface->extension) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed, because interface is an extension.\n", filename, line, parameter);
+               return(-1);
+       }
+       if (value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
+               return(-1);
+       }
+       interface->external = 1;
+       return(0);
+}
 static int inter_ptp(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
        struct interface_port *ifport;
@@ -310,11 +327,11 @@ static int inter_portname(struct interface *interface, char *filename, int line,
                                SPRINT(interface_error, "Error in %s (line %d): port '%s' already used above.\n", filename, line, value);
                                return(-1);
                        }
-                       /* check for use as GSM */
-                       if (ifport->gsm) {
-                               SPRINT(interface_error, "Error in %s (line %d): Interface already used for GSM.\n", filename, line);
-                               return(-1);
-                       }
+//                     /* check for use as GSM */
+//                     if (ifport->gsm) {
+//                             SPRINT(interface_error, "Error in %s (line %d): Interface already used for GSM.\n", filename, line);
+//                             return(-1);
+//                     }
                        ifport = ifport->next;
                }
                searchif = searchif->next;
@@ -889,7 +906,7 @@ static int inter_gsm(struct interface *interface, char *filename, int line, char
        }
 
        /* set portname */
-       if (inter_portname(interface, filename, line, "portname", gsm->conf.interface_lcr))
+       if (inter_portname(interface, filename, line, (char *)"portname", gsm->conf.interface_lcr))
                return(-1);
        /* goto end of chain again to set gsmflag*/
        ifport = interface->ifport;
@@ -907,6 +924,12 @@ static int inter_gsm(struct interface *interface, char *filename, int line, char
 struct interface_param interface_param[] = {
        { "extension", &inter_extension, "",
        "If keyword is given, calls to interface are handled as internal extensions."},
+
+       { "extern", &inter_extern, "",
+       "If keyword is given, this interface will be used for external calls.\n"
+       "Calls require an external interface, if the routing action 'extern' is used\nwithout specific interface given.\n"
+       "Calls forwarded by extension's 'settings' also require an external interface."},
+
        {"tones", &inter_tones, "yes | no",
        "Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},