Adding shutdown option to interface.conf
[lcr.git] / interface.c
index 09e0067..cbfed2e 100644 (file)
@@ -325,11 +325,9 @@ static int inter_portname(struct interface *interface, char *filename, int line,
                        ifport = ifport->next;
        }
 
-       /* check for port already assigned, but not for shared gsm interface */
+       /* check for port already assigned, but not for shared loop interface */
        searchif = interface_newlist;
-#if defined WITH_GSM_BS || defined WITH_GSM_MS
-       if (options.gsm && !strcmp(value, gsm->conf.interface_lcr))
-#endif
+       if (!!strcmp(value, options.loopback_lcr))
        {
                while(searchif) {
                        ifport = searchif->ifport;
@@ -899,11 +897,6 @@ static int inter_gsm_bs(struct interface *interface, char *filename, int line, c
        struct interface_port *ifport;
        struct interface *searchif;
 
-       /* check gsm */
-       if (!gsm) {
-               SPRINT(interface_error, "Error in %s (line %d): GSM is not activated.\n", filename, line);
-               return(-1);
-       }
        searchif = interface_newlist;
        while(searchif) {
                ifport = searchif->ifport;
@@ -918,7 +911,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 */
@@ -938,16 +931,9 @@ static int inter_gsm_ms(struct interface *interface, char *filename, int line, c
 #else
        struct interface_port *ifport, *searchifport;
        struct interface *searchif;
-       char *element;
-
-       /* check gsm */
-       if (!gsm) {
-               SPRINT(interface_error, "Error in %s (line %d): GSM is not activated.\n", filename, line);
-               return(-1);
-       }
 
        /* 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 */
@@ -957,27 +943,20 @@ static int inter_gsm_ms(struct interface *interface, char *filename, int line, c
        ifport->gsm_ms = 1;
 
        /* copy values */
-       element = strsep(&value, " ");
-       if (!element || !element[0]) {
+       if (!value || !value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): Missing MS name and socket name.\n", filename, line);
                return(-1);
        }
-       SCPY(ifport->gsm_ms_name, element);
-       element = strsep(&value, " ");
-       if (!element || !element[0]) {
-               SPRINT(interface_error, "Error in %s (line %d): Missing socket name after MS name.\n", filename, line);
-               return(-1);
-       }
-       SCPY(ifport->gsm_ms_socket, element);
+       SCPY(ifport->gsm_ms_name, value);
 
-       /* check if socket is used multiple times */
+       /* check if name is used multiple times */
        searchif = interface_newlist;
        while(searchif) {
                searchifport = searchif->ifport;
                while(searchifport) {
                        if (searchifport != ifport 
-                        && !strcmp(searchifport->gsm_ms_socket, ifport->gsm_ms_socket)) {
-                               SPRINT(interface_error, "Error in %s (line %d): mobile '%s' already uses the given socket '%s', choose a different one.\n", filename, line, ifport->gsm_ms_name, searchifport->gsm_ms_socket);
+                        && !strcmp(searchifport->gsm_ms_name, ifport->gsm_ms_name)) {
+                               SPRINT(interface_error, "Error in %s (line %d): mobile '%s' already uses the given MS name '%s', choose a different one.\n", filename, line, ifport->gsm_ms_name, searchifport->gsm_ms_name);
                                return(-1);
                        }
                        searchifport = searchifport->next;
@@ -1054,6 +1033,49 @@ 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);
+}
+
+static int inter_shutdown(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       interface->shutdown = 1;
+
+       return(0);
+}
 
 
 /*
@@ -1215,6 +1237,13 @@ 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."},
+
+       {"shutdown", &inter_shutdown, "",
+       "Interface will not be loaded when processing interface.conf"},
+
        {NULL, NULL, NULL, NULL}
 };
 
@@ -1470,6 +1499,17 @@ void relink_interfaces(void)
        /* unlink all mISDNports */
        mISDNport = mISDNport_first;
        while(mISDNport) {
+               if (mISDNport->ifport) {
+                       ifport = mISDNport->ifport;
+#ifdef WITH_GSM_MS
+                       if (ifport->gsm_ms)
+                               gsm_ms_delete(ifport->gsm_ms_name);
+#endif
+#ifdef WITH_GSM_BS
+                       if (ifport->gsm_bs)
+                               gsm_bs_exit(0);
+#endif
+               }
                mISDNport->ifport = NULL;
                mISDNport = mISDNport->next;
        }
@@ -1502,11 +1542,7 @@ void relink_interfaces(void)
        while(mISDNport) {
                if (mISDNport->ifport == NULL) {
                        PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
-                       /* remove all port objects and destroy port */
-#ifdef WITH_GSM_MS
-                       if (ifport->gsm_ms)
-                               gsm_ms_delete(ifport->gsm_ms_name);
-#endif
+                       /* destroy port */
                        mISDNport_close(mISDNport);
                        goto closeagain;
                }
@@ -1519,7 +1555,11 @@ void relink_interfaces(void)
                ifport = interface->ifport;
                while(ifport) {
                        if (!ifport->mISDNport) {
-                               load_port(ifport);
+                               if (!interface->shutdown) {
+                                       load_port(ifport);
+                               } else {
+                                       ifport->block = 2;
+                               }
                        }
                        ifport = ifport->next;
                }
@@ -1551,7 +1591,11 @@ void load_port(struct interface_port *ifport)
                mISDNport_static(mISDNport);
 #ifdef WITH_GSM_MS
                if (ifport->gsm_ms)
-                       gsm_ms_new(ifport->gsm_ms_name, ifport->gsm_ms_socket);
+                       gsm_ms_new(ifport->gsm_ms_name);
+#endif
+#ifdef WITH_GSM_BS
+               if (ifport->gsm_bs)
+                       gsm_bs_init();
 #endif
        } else {
                ifport->block = 2; /* not available */