Added 'extern' flag to interface.conf.
[lcr.git] / interface.c
index 4acc514..df39b78 100644 (file)
@@ -9,9 +9,6 @@
 **                                                                           **
 \*****************************************************************************/ 
 
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
 #include "main.h"
 
 struct interface *interface_first = NULL; /* first interface is current list */
@@ -34,8 +31,7 @@ void default_out_channel(struct interface_port *ifport)
        ifport->out_channel = selchannel;
 
        /* additional channel selection for multipoint NT ports */
-       if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
-       {
+       if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode) {
                selchannelp = &(selchannel->next);
                selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
                memuse++;
@@ -80,10 +76,8 @@ static int get_number(char *value)
  * and return pointer to next element in buffer */
 static char *get_seperated(char *buffer)
 {
-       while(*buffer)
-       {
-               if (*buffer==',' || *buffer<=32) /* seperate */
-               {
+       while(*buffer) {
+               if (*buffer==',' || *buffer<=32) { /* seperate */
                        *buffer++ = '\0';
                        while((*buffer>'\0' && *buffer<=32) || *buffer==',')
                                buffer++;
@@ -102,8 +96,7 @@ static int inter_block(struct interface *interface, char *filename, int line, ch
        struct interface_port *ifport;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
@@ -112,8 +105,7 @@ static int inter_block(struct interface *interface, char *filename, int line, ch
        while(ifport->next)
                ifport = ifport->next;
        /* add value */
-       if (value[0])
-       {
+       if (value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
                return(-1);
        }
@@ -122,26 +114,40 @@ 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 (value[0])
-       {
+       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);
        }
        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;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
-       if (interface->ifport->ptmp)
-       {
+       if (interface->ifport->ptmp) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptmp was given.\n", filename, line, parameter);
                return(-1);
        }
@@ -150,26 +156,24 @@ static int inter_ptp(struct interface *interface, char *filename, int line, char
        while(ifport->next)
                ifport = ifport->next;
        /* add value */
-       if (value[0])
-       {
+       if (value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
                return(-1);
        }
        ifport->ptp = 1;
        return(0);
 }
+#if 0
 static int inter_ptmp(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
        struct interface_port *ifport;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
-       if (interface->ifport->ptp)
-       {
+       if (interface->ifport->ptp) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptp was given.\n", filename, line, parameter);
                return(-1);
        }
@@ -178,22 +182,20 @@ static int inter_ptmp(struct interface *interface, char *filename, int line, cha
        while(ifport->next)
                ifport = ifport->next;
        /* add value */
-       if (value[0])
-       {
+       if (value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
                return(-1);
        }
        ifport->ptmp = 1;
        return(0);
 }
+#endif
 static int inter_nt(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
-#ifdef SOCKET_MISDN
        struct interface_port *ifport;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
@@ -202,26 +204,42 @@ static int inter_nt(struct interface *interface, char *filename, int line, char
        while(ifport->next)
                ifport = ifport->next;
        /* add value */
-       if (value[0])
-       {
+       if (value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
                return(-1);
        }
        ifport->nt = 1;
-#endif
+       return(0);
+}
+static int inter_tespecial(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       struct interface_port *ifport;
+
+       /* port in chain ? */
+       if (!interface->ifport) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+               return(-1);
+       }
+       /* goto end of chain */
+       ifport = interface->ifport;
+       while(ifport->next)
+               ifport = ifport->next;
+       /* add value */
+       if (value[0]) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
+               return(-1);
+       }
+       ifport->tespecial = 1;
        return(0);
 }
 static int inter_tones(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
-       if (!strcasecmp(value, "yes"))
-       {
+       if (!strcasecmp(value, "yes")) {
                interface->is_tones = IS_YES;
        } else
-       if (!strcasecmp(value, "no"))
-       {
+       if (!strcasecmp(value, "no")) {
                interface->is_tones = IS_NO;
-       } else
-       {
+       } else {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
                return(-1);
        }
@@ -229,15 +247,12 @@ static int inter_tones(struct interface *interface, char *filename, int line, ch
 }
 static int inter_earlyb(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
-       if (!strcasecmp(value, "yes"))
-       {
+       if (!strcasecmp(value, "yes")) {
                interface->is_earlyb = IS_YES;
        } else
-       if (!strcasecmp(value, "no"))
-       {
+       if (!strcasecmp(value, "no")) {
                interface->is_earlyb = IS_NO;
-       } else
-       {
+       } else {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
                return(-1);
        }
@@ -245,15 +260,12 @@ static int inter_earlyb(struct interface *interface, char *filename, int line, c
 }
 static int inter_hunt(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
-       if (!strcasecmp(value, "linear"))
-       {
+       if (!strcasecmp(value, "linear")) {
                interface->hunt = HUNT_LINEAR;
        } else
-       if (!strcasecmp(value, "roundrobin"))
-       {
+       if (!strcasecmp(value, "roundrobin")) {
                interface->hunt = HUNT_ROUNDROBIN;
-       } else
-       {
+       } else {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'linear' or 'roundrobin'.\n", filename, line, parameter);
                return(-1);
        }
@@ -261,25 +273,26 @@ static int inter_hunt(struct interface *interface, char *filename, int line, cha
 }
 static int inter_port(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
+       SPRINT(interface_error, "Error in %s (line %d): parameter '%s' is outdated.\nPlease use 'portnum' and decrease port number by 1! Ports are counted from 0 now.\n", filename, line, parameter);
+       return(-1);
+}
+static int inter_portnum(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
        struct interface_port *ifport, **ifportp;
        struct interface *searchif;
        int val;
 
        val = get_number(value);
-       if (val == -1)
-       {
+       if (val == -1) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one numeric value.\n", filename, line, parameter);
                return(-1);
        }
        /* check for port already assigned */
        searchif = interface_newlist;
-       while(searchif)
-       {
+       while(searchif) {
                ifport = searchif->ifport;
-               while(ifport)
-               {
-                       if (ifport->portnum == val)
-                       {
+               while(ifport) {
+                       if (ifport->portnum == val) {
                                SPRINT(interface_error, "Error in %s (line %d): port '%d' already used above.\n", filename, line, val);
                                return(-1);
                        }
@@ -300,6 +313,91 @@ static int inter_port(struct interface *interface, char *filename, int line, cha
        *ifportp = ifport;
        return(0);
 }
+static int inter_portname(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       struct interface_port *ifport, **ifportp;
+       struct interface *searchif;
+
+       /* check for port already assigned */
+       searchif = interface_newlist;
+       while(searchif) {
+               ifport = searchif->ifport;
+               while(ifport) {
+                       if (!strcasecmp(ifport->portname, value)) {
+                               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);
+//                     }
+                       ifport = ifport->next;
+               }
+               searchif = searchif->next;
+       }
+       /* alloc port substructure */
+       ifport = (struct interface_port *)MALLOC(sizeof(struct interface_port));
+       memuse++;
+       ifport->interface = interface;
+       /* set value */
+       ifport->portnum = -1; // disable until resolved
+       SCPY(ifport->portname, value);
+       /* tail port */
+       ifportp = &interface->ifport;
+       while(*ifportp)
+               ifportp = &((*ifportp)->next);
+       *ifportp = ifport;
+       return(0);
+}
+static int inter_l1hold(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       struct interface_port *ifport;
+
+       /* port in chain ? */
+       if (!interface->ifport) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+               return(-1);
+       }
+       /* goto end of chain */
+       ifport = interface->ifport;
+       while(ifport->next)
+               ifport = ifport->next;
+       if (!strcmp(value, "yes")) {
+               ifport->l1hold = 1;
+       } else
+       if (!strcmp(value, "no")) {
+               ifport->l1hold = 0;
+       } else {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expecting parameter 'yes' or 'no'.\n", filename, line, parameter);
+               return(-1);
+       }
+       return(0);
+}
+static int inter_l2hold(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       struct interface_port *ifport;
+
+       /* port in chain ? */
+       if (!interface->ifport) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+               return(-1);
+       }
+       /* goto end of chain */
+       ifport = interface->ifport;
+       while(ifport->next)
+               ifport = ifport->next;
+       if (!strcmp(value, "yes")) {
+               ifport->l2hold = 1;
+       } else
+       if (!strcmp(value, "no")) {
+               ifport->l2hold = -1;
+       } else {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expecting parameter 'yes' or 'no'.\n", filename, line, parameter);
+               return(-1);
+       }
+       return(0);
+}
 static int inter_channel_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
        struct interface_port *ifport;
@@ -308,8 +406,7 @@ static int inter_channel_out(struct interface *interface, char *filename, int li
        char *p, *el;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
@@ -318,44 +415,35 @@ static int inter_channel_out(struct interface *interface, char *filename, int li
        while(ifport->next)
                ifport = ifport->next;
        p = value;
-       while(*p)
-       {
+       while(*p) {
                el = p;
                p = get_seperated(p);
-               if (!strcasecmp(el, "force"))
-               {
+               if (!strcasecmp(el, "force")) {
                        ifport->channel_force = 1;
-                       if (ifport->out_channel)
-                       {
+                       if (ifport->out_channel) {
                                SPRINT(interface_error, "Error in %s (line %d): value 'force' may only appear as first element in list.\n", filename, line);
                                return(-1);
                        }
                } else
-               if (!strcasecmp(el, "any"))
-               {
+               if (!strcasecmp(el, "any")) {
                        val = CHANNEL_ANY;
                        goto selchannel;
                } else
-               if (!strcasecmp(el, "free"))
-               {
+               if (!strcasecmp(el, "free")) {
                        val = CHANNEL_FREE;
                        goto selchannel;
                } else
-               if (!strcasecmp(el, "no"))
-               {
+               if (!strcasecmp(el, "no")) {
                        val = CHANNEL_NO;
                        goto selchannel;
-               } else
-               {
+               } else {
                        val = get_number(el);
-                       if (val == -1)
-                       {
+                       if (val == -1) {
                                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of 'force', 'any', 'free', 'no' and any channel number.\n", filename, line, parameter);
                                return(-1);
                        }
 
-                       if (val<1 || val==16 || val>126)
-                       {
+                       if (val<1 || val==16 || val>126) {
                                SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
                                return(-1);
                        }
@@ -382,8 +470,7 @@ static int inter_channel_in(struct interface *interface, char *filename, int lin
        char *p, *el;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
@@ -392,30 +479,24 @@ static int inter_channel_in(struct interface *interface, char *filename, int lin
        while(ifport->next)
                ifport = ifport->next;
        p = value;
-       while(*p)
-       {
+       while(*p) {
                el = p;
                p = get_seperated(p);
-               if (ifport->in_channel) if (ifport->in_channel->channel == CHANNEL_FREE)
-               {
+               if (ifport->in_channel) if (ifport->in_channel->channel == CHANNEL_FREE) {
                        SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has values behind 'free' keyword. They has no effect.\n", filename, line, parameter);
                                return(-1);
                }
-               if (!strcasecmp(el, "free"))
-               {
+               if (!strcasecmp(el, "free")) {
                        val = CHANNEL_FREE;
                        goto selchannel;
-               } else
-               {
+               } else {
                        val = get_number(el);
-                       if (val == -1)
-                       {
+                       if (val == -1) {
                                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of channel numbers and 'free'.\n", filename, line, parameter);
                                return(-1);
                        }
 
-                       if (val<1 || val==16 || val>126)
-                       {
+                       if (val<1 || val==16 || val>126) {
                                SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
                                return(-1);
                        }
@@ -437,13 +518,12 @@ static int inter_channel_in(struct interface *interface, char *filename, int lin
 static int inter_timeouts(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
        struct interface_port *ifport;
-       struct select_channel *selchannel, **selchannelp;
-       int val;
+//     struct select_channel *selchannel, **selchannelp;
+//     int val;
        char *p, *el;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
@@ -452,8 +532,7 @@ static int inter_timeouts(struct interface *interface, char *filename, int line,
        while(ifport->next)
                ifport = ifport->next;
        p = value;
-       if (!*p)
-       {
+       if (!*p) {
                nofive:
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects five timeout values.\n", filename, line, parameter);
                return(-1);
@@ -488,21 +567,18 @@ static int inter_msn(struct interface *interface, char *filename, int line, char
        struct interface_msn *ifmsn, **ifmsnp;
        char *p, *el;
 
-       if (!value[0])
-       {
+       if (!value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one MSN number or a list.\n", filename, line, parameter);
                return(-1);
        }
-       if (interface->ifscreen_in)
-       {
+       if (interface->ifscreen_in) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'screen_in' parameter.\n", filename, line, parameter);
                return(-1);
        }
 
        /* process list */
        p = value;
-       while(*p)
-       {
+       while(*p) {
                el = p;
                p = get_seperated(p);
                /* add MSN to list */
@@ -523,8 +599,7 @@ static int inter_screen(struct interface_screen **ifscreenp, struct interface *i
        struct interface_screen *ifscreen;
        char *p, *el;
 
-       if (!value[0])
-       {
+       if (!value[0]) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID and new caller ID.\n", filename, line, parameter);
                return(-1);
        }
@@ -542,60 +617,49 @@ static int inter_screen(struct interface_screen **ifscreenp, struct interface *i
 //     printf("interface=%s\n", interface->name);
        /* get match */
        p = value;
-       while(*p)
-       {
+       while(*p) {
                el = p;
                p = get_seperated(p);
-               if (!strcasecmp(el, "unknown"))
-               {
-                       if (ifscreen->match_type != -1)
-                       {
+               if (!strcasecmp(el, "unknown")) {
+                       if (ifscreen->match_type != -1) {
                                typeerror:
                                SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
                                return(-1);
                        }
                        ifscreen->match_type = INFO_NTYPE_UNKNOWN;
                } else
-               if (!strcasecmp(el, "subscriber"))
-               {
+               if (!strcasecmp(el, "subscriber")) {
                        if (ifscreen->match_type != -1)
                                goto typeerror;
                        ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
                } else
-               if (!strcasecmp(el, "national"))
-               {
+               if (!strcasecmp(el, "national")) {
                        if (ifscreen->match_type != -1)
                                goto typeerror;
                        ifscreen->match_type = INFO_NTYPE_NATIONAL;
                } else
-               if (!strcasecmp(el, "international"))
-               {
+               if (!strcasecmp(el, "international")) {
                        if (ifscreen->match_type != -1)
                                goto typeerror;
                        ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
                } else
-               if (!strcasecmp(el, "allowed"))
-               {
-                       if (ifscreen->match_present != -1)
-                       {
+               if (!strcasecmp(el, "allowed")) {
+                       if (ifscreen->match_present != -1) {
                                presenterror:
                                SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
                                return(-1);
                        }
                        ifscreen->match_present = INFO_PRESENT_ALLOWED;
                } else
-               if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted"))
-               {
+               if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted")) {
                        if (ifscreen->match_present != -1)
                                goto presenterror;
                        ifscreen->match_present = INFO_PRESENT_RESTRICTED;
                } else {
                        SCPY(ifscreen->match, el);
                        /* check for % at the end */
-                       if (strchr(el, '%'))
-                       {
-                               if (strchr(el, '%') != el+strlen(el)-1)
-                               {
+                       if (strchr(el, '%')) {
+                               if (strchr(el, '%') != el+strlen(el)-1) {
                                        SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
                                        return(-1);
                                }
@@ -603,58 +667,48 @@ static int inter_screen(struct interface_screen **ifscreenp, struct interface *i
                        break;
                }
        }
-       if (ifscreen->match[0] == '\0')
-       {
+       if (ifscreen->match[0] == '\0') {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
                return(-1);
        }
        /* get result */
-       while(*p)
-       {
+       while(*p) {
                el = p;
                p = get_seperated(p);
-               if (!strcasecmp(el, "unknown"))
-               {
+               if (!strcasecmp(el, "unknown")) {
                        if (ifscreen->result_type != -1)
                                goto typeerror;
                        ifscreen->result_type = INFO_NTYPE_UNKNOWN;
                } else
-               if (!strcasecmp(el, "subscriber"))
-               {
+               if (!strcasecmp(el, "subscriber")) {
                        if (ifscreen->result_type != -1)
                                goto typeerror;
                        ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
                } else
-               if (!strcasecmp(el, "national"))
-               {
+               if (!strcasecmp(el, "national")) {
                        if (ifscreen->result_type != -1)
                                goto typeerror;
                        ifscreen->result_type = INFO_NTYPE_NATIONAL;
                } else
-               if (!strcasecmp(el, "international"))
-               {
+               if (!strcasecmp(el, "international")) {
                        if (ifscreen->result_type != -1)
                                goto typeerror;
                        ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
                } else
-               if (!strcasecmp(el, "allowed"))
-               {
+               if (!strcasecmp(el, "present") || !strcasecmp(el, "presented") || !strcasecmp(el, "allowed") || !strcasecmp(el, "allow")) {
                        if (ifscreen->result_present != -1)
                                goto presenterror;
                        ifscreen->result_present = INFO_PRESENT_ALLOWED;
                } else
-               if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted"))
-               {
+               if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted") || !strcasecmp(el, "deny") || !strcasecmp(el, "denied")) {
                        if (ifscreen->result_present != -1)
                                goto presenterror;
                        ifscreen->result_present = INFO_PRESENT_RESTRICTED;
                } else {
                        SCPY(ifscreen->result, el);
                        /* check for % at the end */
-                       if (strchr(el, '%'))
-                       {
-                               if (strchr(el, '%') != el+strlen(el)-1)
-                               {
+                       if (strchr(el, '%')) {
+                               if (strchr(el, '%') != el+strlen(el)-1) {
                                        SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
                                        return(-1);
                                }
@@ -662,8 +716,7 @@ static int inter_screen(struct interface_screen **ifscreenp, struct interface *i
                        break;
                }
        }
-       if (ifscreen->result[0] == '\0')
-       {
+       if (ifscreen->result[0] == '\0') {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
                return(-1);
        }
@@ -671,8 +724,7 @@ static int inter_screen(struct interface_screen **ifscreenp, struct interface *i
 }
 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
 {
-       if (interface->ifmsn)
-       {
+       if (interface->ifmsn) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
                return(-1);
        }
@@ -688,8 +740,7 @@ static int inter_nodtmf(struct interface *interface, char *filename, int line, c
        struct interface_port *ifport;
 
        /* port in chain ? */
-       if (!interface->ifport)
-       {
+       if (!interface->ifport) {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
                return(-1);
        }
@@ -708,62 +759,51 @@ static int inter_filter(struct interface *interface, char *filename, int line, c
        p = value;
        while(*p > 32)
                p++;
-       if (*p)
-       {
+       if (*p) {
                *p++ = 0;
                while(*p > 0 && *p <= 32)
                        p++;
        }
 
-       if (!strcasecmp(value, "gain"))
-       {
+       if (!strcasecmp(value, "gain")) {
                q = p;
                while(*q > 32)
                        q++;
-               if (*q)
-               {
+               if (*q) {
                        *q++ = 0;
                        while(*q > 0 && *q <= 32)
                                q++;
                }
-               if (*p == 0 || *q == 0)
-               {
+               if (*p == 0 || *q == 0) {
                        SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' expects two gain values.\n", filename, line, parameter, value);
                        return(-1);
                }
-               if (atoi(p)<-8 || atoi(p)>8 || atoi(q)<-8 || atoi(q)>8)
-               {
+               if (atoi(p)<-8 || atoi(p)>8 || atoi(q)<-8 || atoi(q)>8) {
                        SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' gain values not in range. (-8...8)\n", filename, line, parameter, value);
                        return(-1);
                }
-               interface->gain_tx = atoi(p);
-               interface->gain_rx = atoi(q);
+               interface->tx_gain = atoi(p);
+               interface->rx_gain = atoi(q);
        } else
-       if (!strcasecmp(value, "pipeline"))
-       {
-               if (*p == 0)
-               {
+       if (!strcasecmp(value, "pipeline")) {
+               if (*p == 0) {
                        SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' expects pipeline string.\n", filename, line, parameter, value);
                        return(-1);
                }
                SCPY(interface->pipeline, p);
        } else
-       if (!strcasecmp(value, "blowfish"))
-       {
+       if (!strcasecmp(value, "blowfish")) {
                unsigned char key[56];
                int l;
                
-               if (!!strncmp(p, "0x", 2))
-               {
+               if (!!strncmp(p, "0x", 2)) {
                        SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' expects blowfish key starting with '0x'.\n", filename, line, parameter, value);
                        return(-1);
                }
                p += 2;
                l = 0; 
-               while(*p)
-               {
-                       if (l == 56)
-                       {
+               while(*p) {
+                       if (l == 56) {
                                SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key too long.\n", filename, line, parameter, value);
                                return(-1);
                        }
@@ -773,15 +813,13 @@ static int inter_filter(struct interface *interface, char *filename, int line, c
                                key[l] = (*p-'a'+10)<<4;
                        else if (*p >= 'A' && *p <= 'F')
                                key[l] = (*p-'A'+10)<<4;
-                       else
-                       {
+                       else {
                                digout:
                                SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key has digits out of range. (0...9, a...f)\n", filename, line, parameter, value);
                                return(-1);
                        }
                        p++;
-                       if (*p == 0)
-                       {
+                       if (*p == 0) {
                                SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key must end on an 8 bit boundary (two character boundary).\n", filename, line, parameter, value);
                                return(-1);
                        }
@@ -796,20 +834,88 @@ static int inter_filter(struct interface *interface, char *filename, int line, c
                        p++;
                        l++;
                }
-               if (l < 4)
-               {
+               if (l < 4) {
                        SPRINT(interface_error, "Error in %s (line %d): parameter '%s %s' key must be at least 4 bytes (8 characters).\n", filename, line, parameter, value);
                        return(-1);
                }
                memcpy(interface->bf_key, key, l);
                interface->bf_len = l;
-       } else
-       {
+       } else {
                SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has unknown filter '%s'.\n", filename, line, parameter, value);
                return(-1);
        }
        return(0);
 }
+static int inter_dialmax(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       struct interface_port *ifport;
+
+       /* port in chain ? */
+       if (!interface->ifport) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+               return(-1);
+       }
+       /* goto end of chain */
+       ifport = interface->ifport;
+       while(ifport->next)
+               ifport = ifport->next;
+       ifport->dialmax = atoi(value);
+       return(0);
+}
+static int inter_tones_dir(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+       struct interface_port *ifport;
+
+       /* port in chain ? */
+       if (!interface->ifport) {
+               SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
+               return(-1);
+       }
+       /* goto end of chain */
+       ifport = interface->ifport;
+       while(ifport->next)
+               ifport = ifport->next;
+       SCPY(ifport->tones_dir, value);
+       return(0);
+}
+static int inter_gsm(struct interface *interface, char *filename, int line, char *parameter, char *value)
+{
+#ifndef WITH_GSM
+       SPRINT(interface_error, "Error in %s (line %d): GSM not compiled in.\n", filename, line);
+       return(-1);
+#else
+       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;
+               while(ifport) {
+                       if (ifport->gsm) {
+                               SPRINT(interface_error, "Error in %s (line %d): port '%s' already uses gsm\n", filename, line, value);
+                               return(-1);
+                       }
+                       ifport = ifport->next;
+               }
+               searchif = searchif->next;
+       }
+
+       /* set portname */
+       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;
+       while(ifport->next)
+               ifport = ifport->next;
+       ifport->gsm = 1;
+       return(0);
+#endif
+}
 
 
 /*
@@ -818,6 +924,12 @@ static int inter_filter(struct interface *interface, char *filename, int line, c
 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."},
 
@@ -828,7 +940,11 @@ struct interface_param interface_param[] = {
        "Select the algorithm for selecting port with free channel."},
 
        {"port", &inter_port, "<number>",
+       ""},
+       {"portnum", &inter_portnum, "<number>",
        "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
+       {"portname", &inter_portname, "<name>",
+       "Same as 'portnum', but the name is given instead.\nUse 'isdninfo' to list all available ports and names."},
 
        {"block", &inter_block, "",
        "If keyword is given, calls on this interface are blocked.\n"
@@ -839,17 +955,34 @@ struct interface_param interface_param[] = {
        "This is required on NT-mode ports that are multipoint by default.\n"
        "This parameter must follow a 'port' parameter."},
 
+#if 0
        {"ptmp", &inter_ptmp, "",
        "The given port above is opened as point-to-multipoint.\n"
        "This is required on PRI NT-mode ports that are point-to-point by default.\n"
        "This parameter must follow a 'port' parameter."},
+#endif
+
        {"nt", &inter_nt, "",
        "The given port above is opened in NT-mode.\n"
-#ifdef SOCKET_MISDN
        "This is required on interfaces that support both NT-mode and TE-mode.\n"
-#else
-       "This parameter is only required for socket based mISDN driver.\n"
-#endif
+       "This parameter must follow a 'port' parameter."},
+
+       {"te-special", &inter_tespecial, "",
+       "The given port uses a modified TE-mode.\n"
+       "All information elements that are allowed Network->User will then be\n"
+       "transmitted User->Network also. This is usefull to pass all informations\n"
+       "between two interconnected LCRs, like 'redirected number' or 'display'.\n"
+       "Note that this is not compliant with ISDN protocol.\n"
+       "This parameter must follow a 'port' parameter."},
+
+       {"layer1hold", &inter_l1hold, "yes | no",
+       "The given port will not release layer 1 after layer 2 is down.\n"
+       "It is required to keep layer 1 of telephones up, to solve activation problems.\n"
+       "This parameter must follow a 'port' parameter."},
+
+       {"layer2hold", &inter_l2hold, "yes | no",
+       "The given port will continuously try to establish layer 2 link and hold it.\n"
+       "It is required for PTP links in most cases, therefore it is default.\n"
        "This parameter must follow a 'port' parameter."},
 
        {"channel-out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
@@ -863,7 +996,7 @@ struct interface_param interface_param[] = {
        " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
 
        {"channel-in", &inter_channel_in, "[<number>][,...][,free]",
-       "Channel selection list for all incomming calls from the interface.\n"
+       "Channel selection list for all incoming calls from the interface.\n"
        "A free channels is accepted if in the list.\n"
        "If any channel was requested, the first free channel found is selected.\n"
        "This parameter must follow a 'port' parameter.\n"
@@ -871,16 +1004,16 @@ struct interface_param interface_param[] = {
        " free - Accept any free channel"},
 
        {"timeouts", &inter_timeouts, "<setup> <dialing> <proceeding> <alerting> <disconnect>",
-       "Timeout values for call states. They are both for incomming and outgoing states.\n"
+       "Timeout values for call states. They are both for incoming and outgoing states.\n"
        "The default is 120 seconds for all states. Use 0 to disable.\n"
        "This parameter must follow a 'port' parameter.\n"},
 
        {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
-       "Incomming caller ID is checked against given MSN numbers.\n"
+       "Incoming caller ID is checked against given MSN numbers.\n"
        "If the caller ID is not found in this list, it is overwritten by the first MSN"},
 
        {"screen-in", &inter_screen_in, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
-       "Adds an entry for incomming calls to the caller ID screen list.\n"
+       "Adds an entry for incoming calls to the caller ID screen list.\n"
        "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
        "If '%' is given after old caller ID, it matches even if caller ID has\n"
        "additional digits.\n"
@@ -898,19 +1031,24 @@ struct interface_param interface_param[] = {
        "Disables DTMF detection for this interface.\n"
        "This parameter must follow a 'port' parameter."},
 
-#if 0
-       {"layer2keep", &inter_layer2keep, "yes | no",
-       "By default, layer 2 is establised and kept up on PTP interfaces.\n"
-       ".\n"
-       "This parameter must follow a 'port' parameter."},
-#endif
-
        {"filter", &inter_filter, "<filter> <parameters>",
        "Adds/appends a filter. Filters are ordered in transmit direction.\n"
        "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
        "pipeline <string> - Sets echo cancelation pipeline.\n"
        "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
 
+       {"dialmax", &inter_dialmax, "<digits>",
+       "Limits the number of digits in setup/information message."},
+
+       {"tones_dir", &inter_tones_dir, "<path>",
+       "Overrides the given tone_dir in options.conf.\n"
+       "To used kernel tones in mISDN_dsp.ko, say 'american', 'german', or 'oldgerman'."},
+
+       {"gsm", &inter_gsm, "",
+       "Sets up GSM interface for using OpenBSC.\n"
+       "This interface must be a loopback interface. The second loopback interface\n"
+       "must be assigned to OpenBSC"},
+
        {NULL, NULL, NULL, NULL}
 };
 
@@ -936,24 +1074,21 @@ struct interface *read_interfaces(void)
        if (interface_newlist != NULL)
                FATAL("list is not empty.\n");
        interface_error[0] = '\0';
-       SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
+       SPRINT(filename, "%s/interface.conf", CONFIG_DATA);
 
-       if (!(fp = fopen(filename,"r")))
-       {
+       if (!(fp = fopen(filename,"r"))) {
                SPRINT(interface_error, "Cannot open '%s'\n", filename);
                goto error;
        }
 
        line=0;
-       while((fgets(buffer,sizeof(buffer),fp)))
-       {
+       while((fgets(buffer,sizeof(buffer),fp))) {
                buffer[sizeof(buffer)-1]=0;
                if (buffer[0]) buffer[strlen(buffer)-1]=0;
                p=buffer;
                line++;
 
-               while(*p <= 32) /* skip spaces */
-               {
+               while(*p <= 32) { /* skip spaces */
                        if (*p == 0)
                                break;
                        p++;
@@ -964,10 +1099,8 @@ struct interface *read_interfaces(void)
                parameter[0]=0;
                value[0]=0;
                i=0; /* read parameter */
-               while(*p > 32)
-               {
-                       if (i+1 >= sizeof(parameter))
-                       {
+               while(*p > 32) {
+                       if (i+1 >= sizeof(parameter)) {
                                SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
                                goto error;
                        }
@@ -975,20 +1108,16 @@ struct interface *read_interfaces(void)
                        parameter[i++] = *p++;
                }
 
-               while(*p <= 32) /* skip spaces */
-               {
+               while(*p <= 32) { /* skip spaces */
                        if (*p == 0)
                                break;
                        p++;
                }
 
-               if (*p!=0 && *p!='#') /* missing name */
-               {
+               if (*p!=0 && *p!='#') { /* missing name */
                        i=0; /* read until end */
-                       while(*p!=0 && *p!='#')
-                       {
-                               if (i+1 >= sizeof(value))
-                               {
+                       while(*p!=0 && *p!='#') {
+                               if (i+1 >= sizeof(value)) {
                                        SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
                                        goto error;
                                }
@@ -997,8 +1126,7 @@ struct interface *read_interfaces(void)
                        }
 
                        /* remove trailing spaces from value */
-                       while(i)
-                       {
+                       while(i) {
                                if (value[i-1]==0 || value[i-1]>32)
                                        break;
                                value[i-1] = '\0';
@@ -1007,18 +1135,15 @@ struct interface *read_interfaces(void)
                }
 
                /* check for interface name as first statement */
-               if (expecting && parameter[0]!='[')
-               {
+               if (expecting && parameter[0]!='[') {
                        SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
                        goto error;
                }
                expecting = 0;
 
                /* check for new interface */
-               if (parameter[0] == '[')
-               {
-                       if (parameter[strlen(parameter)-1] != ']')
-                       {
+               if (parameter[0] == '[') {
+                       if (parameter[strlen(parameter)-1] != ']') {
                                SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
                                goto error;
                        }
@@ -1026,10 +1151,8 @@ struct interface *read_interfaces(void)
 
                        /* check if interface name already exists */
                        interface = interface_newlist;
-                       while(interface)
-                       {
-                               if (!strcasecmp(interface->name, parameter+1))
-                               {
+                       while(interface) {
+                               if (!strcasecmp(interface->name, parameter+1)) {
                                        SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
                                        goto error;
                                }
@@ -1051,10 +1174,8 @@ struct interface *read_interfaces(void)
                }
 
                ifparam = interface_param;
-               while(ifparam->name)
-               {
-                       if (!strcasecmp(parameter, ifparam->name))
-                       {
+               while(ifparam->name) {
+                       if (!strcasecmp(parameter, ifparam->name)) {
                                if (ifparam->func(interface, filename, line, parameter, value))
                                        goto error;
                                break;
@@ -1090,22 +1211,18 @@ void free_interfaces(struct interface *interface)
        struct interface_msn *ifmsn;
        struct interface_screen *ifscreen;
 
-       while(interface)
-       {
+       while(interface) {
                ifport = interface->ifport;
-               while(ifport)
-               {
+               while(ifport) {
                        selchannel = ifport->in_channel;
-                       while(selchannel)
-                       {
+                       while(selchannel) {
                                temp = selchannel;
                                selchannel = selchannel->next;
                                FREE(temp, sizeof(struct select_channel));
                                memuse--;
                        }
                        selchannel = ifport->out_channel;
-                       while(selchannel)
-                       {
+                       while(selchannel) {
                                temp = selchannel;
                                selchannel = selchannel->next;
                                FREE(temp, sizeof(struct select_channel));
@@ -1117,24 +1234,21 @@ void free_interfaces(struct interface *interface)
                        memuse--;
                }
                ifmsn = interface->ifmsn;
-               while(ifmsn)
-               {
+               while(ifmsn) {
                        temp = ifmsn;
                        ifmsn = ifmsn->next;
                        FREE(temp, sizeof(struct interface_msn));
                        memuse--;
                }
                ifscreen = interface->ifscreen_in;
-               while(ifscreen)
-               {
+               while(ifscreen) {
                        temp = ifscreen;
                        ifscreen = ifscreen->next;
                        FREE(temp, sizeof(struct interface_screen));
                        memuse--;
                }
                ifscreen = interface->ifscreen_out;
-               while(ifscreen)
-               {
+               while(ifscreen) {
                        temp = ifscreen;
                        ifscreen = ifscreen->next;
                        FREE(temp, sizeof(struct interface_screen));
@@ -1188,24 +1302,22 @@ void relink_interfaces(void)
 
        /* unlink all mISDNports */
        mISDNport = mISDNport_first;
-       while(mISDNport)
-       {
+       while(mISDNport) {
                mISDNport->ifport = NULL;
                mISDNport = mISDNport->next;
        }
 
        /* relink existing mISDNports */
        interface = interface_newlist;
-       while(interface)
-       {
+       while(interface) {
                ifport = interface->ifport;
-               while(ifport)
-               {
+               while(ifport) {
                        mISDNport = mISDNport_first;
-                       while(mISDNport)
-                       {
-                               if (mISDNport->portnum == ifport->portnum)
-                               {
+                       while(mISDNport) {
+                               if (!strcmp(mISDNport->name, ifport->portname))
+                                       ifport->portnum = mISDNport->portnum; /* same name, so we use same number */
+                               if (mISDNport->portnum == ifport->portnum) {
+                                       PDEBUG(DEBUG_ISDN, "Port %d:%s relinking!\n", mISDNport->portnum);
                                        ifport->mISDNport = mISDNport;
                                        mISDNport->ifport = ifport;
                                        set_defaults(ifport);
@@ -1220,10 +1332,8 @@ void relink_interfaces(void)
        /* close unused mISDNports */
        closeagain:
        mISDNport = mISDNport_first;
-       while(mISDNport)
-       {
-               if (mISDNport->ifport == NULL)
-               {
+       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 */
                        mISDNport_close(mISDNport);
@@ -1234,13 +1344,10 @@ void relink_interfaces(void)
 
        /* open and link new mISDNports */
        interface = interface_newlist;
-       while(interface)
-       {
+       while(interface) {
                ifport = interface->ifport;
-               while(ifport)
-               {
-                       if (!ifport->mISDNport)
-                       {
+               while(ifport) {
+                       if (!ifport->mISDNport) {
                                load_port(ifport);
                        }
                        ifport = ifport->next;
@@ -1259,15 +1366,17 @@ void load_port(struct interface_port *ifport)
        struct mISDNport *mISDNport;
 
        /* open new port */
-       mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->nt, ifport->interface);
-       if (mISDNport)
-       {
+       mISDNport = mISDNport_open(ifport->portnum, ifport->portname, ifport->ptp, ifport->nt, ifport->tespecial, ifport->l1hold, ifport->l2hold, ifport->interface, ifport->gsm);
+       if (mISDNport) {
                /* link port */
                ifport->mISDNport = mISDNport;
                mISDNport->ifport = ifport;
+               /* set number and name */
+               ifport->portnum = mISDNport->portnum;
+               SCPY(ifport->portname, mISDNport->name);
+               /* set defaults */
                set_defaults(ifport);
-       } else
-       {
+       } else {
                ifport->block = 2; /* not available */
        }
 }
@@ -1284,24 +1393,25 @@ void doc_interface(void)
 
        printf("[<name>]\n");
        ifparam = interface_param;
-       while(ifparam->name)
-       {
-               printf("%s %s\n", ifparam->name, ifparam->usage);
+       while(ifparam->name) {
+               if (ifparam->name[0])
+                       printf("%s %s\n", ifparam->name, ifparam->usage);
                ifparam++;
        }
 
        ifparam = interface_param;
-       while(ifparam->name)
-       {
-               printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
-               printf("%s\n", ifparam->help);
+       while(ifparam->name) {
+               if (ifparam->name[0]) {
+                       printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
+                       printf("%s\n", ifparam->help);
+               }
                ifparam++;
        }
 }
 
 
 /* screen caller id
- * out==0: incomming caller id, out==1: outgoing caller id
+ * out==0: incoming caller id, out==1: outgoing caller id
  */
 void do_screen(int out, char *id, int idsize, int *type, int *present, struct interface *interface)
 {
@@ -1311,30 +1421,25 @@ void do_screen(int out, char *id, int idsize, int *type, int *present, struct in
        char suffix[64];
 
        /* screen incoming caller id */
-       if (!out)
-       {
+       if (!out) {
                /* check for MSN numbers, use first MSN if no match */
                msn1 = NULL;
                ifmsn = interface->ifmsn;
-               while(ifmsn)
-               {
+               while(ifmsn) {
                        if (!msn1)
                                msn1 = ifmsn->msn;
-                       if (!strcmp(ifmsn->msn, id))
-                       {
+                       if (!strcmp(ifmsn->msn, id)) {
                                break;
                        }
                        ifmsn = ifmsn->next;
                }
-               if (ifmsn)
-               {
-                       start_trace(0, interface, numberrize_callerinfo(id, *type), NULL, DIRECTION_IN, 0, 0, "SCREEN (fount in MSN list)");
+               if (ifmsn) {
+                       start_trace(-1, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, DIRECTION_IN, 0, 0, "SCREEN (found in MSN list)");
                        add_trace("msn", NULL, "%s", id);
                        end_trace();
                }
-               if (!ifmsn && msn1) // not in list, first msn given
-               {
-                       start_trace(0, interface, numberrize_callerinfo(id, *type), NULL, DIRECTION_IN, 0, 0, "SCREEN (not fount in MSN list)");
+               if (!ifmsn && msn1) { // not in list, first msn given
+                       start_trace(-1, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, DIRECTION_IN, 0, 0, "SCREEN (not found in MSN list)");
                        add_trace("msn", "given", "%s", id);
                        add_trace("msn", "used", "%s", msn1);
                        end_trace();
@@ -1348,28 +1453,22 @@ void do_screen(int out, char *id, int idsize, int *type, int *present, struct in
                ifscreen = interface->ifscreen_out;
        else
                ifscreen = interface->ifscreen_in;
-       while (ifscreen)
-       {
+       while (ifscreen) {
                if (ifscreen->match_type==-1 || ifscreen->match_type==*type)
-               if (ifscreen->match_present==-1 || ifscreen->match_present==*present)
-               {
-                       if (strchr(ifscreen->match,'%'))
-                       {
+               if (ifscreen->match_present==-1 || ifscreen->match_present==*present) {
+                       if (strchr(ifscreen->match,'%')) {
                                if (!strncmp(ifscreen->match, id, strchr(ifscreen->match,'%')-ifscreen->match))
                                        break;
-                       } else
-                       {
+                       } else {
                                if (!strcmp(ifscreen->match, id))
                                        break;
                        }
                }
                ifscreen = ifscreen->next;
        }
-       if (ifscreen) // match
-       {
-               start_trace(0, interface, numberrize_callerinfo(id, *type), NULL, out?DIRECTION_OUT:DIRECTION_IN, 0, 0, "SCREEN (fount in screen list)");
-               switch(*type)
-               {
+       if (ifscreen) { // match
+               start_trace(-1, interface, numberrize_callerinfo(id, *type, options.national, options.international), NULL, out?DIRECTION_OUT:DIRECTION_IN, 0, 0, "SCREEN (found in screen list)");
+               switch(*type) {
                        case INFO_NTYPE_UNKNOWN:
                        add_trace("given", "type", "unknown");
                        break;
@@ -1383,8 +1482,7 @@ void do_screen(int out, char *id, int idsize, int *type, int *present, struct in
                        add_trace("given", "type", "international");
                        break;
                }
-               switch(*present)
-               {
+               switch(*present) {
                        case INFO_PRESENT_ALLOWED:
                        add_trace("given", "present", "allowed");
                        break;
@@ -1396,11 +1494,9 @@ void do_screen(int out, char *id, int idsize, int *type, int *present, struct in
                        break;
                }
                add_trace("given", "id", "%s", id[0]?id:"<empty>");
-               if (ifscreen->result_type != -1)
-               {
+               if (ifscreen->result_type != -1) {
                        *type = ifscreen->result_type;
-                       switch(*type)
-                       {
+                       switch(*type) {
                                case INFO_NTYPE_UNKNOWN:
                                add_trace("used", "type", "unknown");
                                break;
@@ -1415,11 +1511,9 @@ void do_screen(int out, char *id, int idsize, int *type, int *present, struct in
                                break;
                        }
                }
-               if (ifscreen->result_present != -1)
-               {
+               if (ifscreen->result_present != -1) {
                        *present = ifscreen->result_present;
-                       switch(*present)
-                       {
+                       switch(*present) {
                                case INFO_PRESENT_ALLOWED:
                                add_trace("used", "present", "allowed");
                                break;
@@ -1431,19 +1525,16 @@ void do_screen(int out, char *id, int idsize, int *type, int *present, struct in
                                break;
                        }
                }
-               if (strchr(ifscreen->match,'%'))
-               {
+               if (strchr(ifscreen->match,'%')) {
                        SCPY(suffix, strchr(ifscreen->match,'%') - ifscreen->match + id);
                        UNCPY(id, ifscreen->result, idsize);
                        id[idsize-1] = '\0';
-                       if (strchr(id,'%'))
-                       {
+                       if (strchr(id,'%')) {
                                *strchr(id,'%') = '\0';
                                UNCAT(id, suffix, idsize);
                                id[idsize-1] = '\0';
                        }
-               } else
-               {
+               } else {
                        UNCPY(id, ifscreen->result, idsize);
                        id[idsize-1] = '\0';
                }