added exporting/importing bchannel stacks to the remote application
[lcr.git] / interface.c
index 7b90d15..9842e19 100644 (file)
@@ -23,14 +23,8 @@ void default_out_channel(struct interface_port *ifport)
 {
        struct select_channel *selchannel, **selchannelp;
 
 {
        struct select_channel *selchannel, **selchannelp;
 
-       selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
-       if (!selchannel)
-       {
-               PERROR("No memory!");
-               return;
-       }
+       selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
        memuse++;
        memuse++;
-       memset(selchannel, 0, sizeof(struct select_channel));
        
        if (ifport->mISDNport->ntmode)
                selchannel->channel = CHANNEL_FREE;
        
        if (ifport->mISDNport->ntmode)
                selchannel->channel = CHANNEL_FREE;
@@ -43,14 +37,8 @@ void default_out_channel(struct interface_port *ifport)
        if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
        {
                selchannelp = &(selchannel->next);
        if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
        {
                selchannelp = &(selchannel->next);
-               selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
-               if (!selchannel)
-               {
-                       PERROR("No memory!");
-                       return;
-               }
+               selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
                memuse++;
                memuse++;
-               memset(selchannel, 0, sizeof(struct select_channel));
                selchannel->channel = CHANNEL_NO; // call waiting
                *selchannelp = selchannel;
        }
                selchannel->channel = CHANNEL_NO; // call waiting
                *selchannelp = selchannel;
        }
@@ -62,14 +50,8 @@ void default_in_channel(struct interface_port *ifport)
 {
        struct select_channel *selchannel;
 
 {
        struct select_channel *selchannel;
 
-       selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
-       if (!selchannel)
-       {
-               PERROR("No memory!");
-               return;
-       }
+       selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
        memuse++;
        memuse++;
-       memset(selchannel, 0, sizeof(struct select_channel));
        
        selchannel->channel = CHANNEL_FREE;
        
        
        selchannel->channel = CHANNEL_FREE;
        
@@ -281,14 +263,8 @@ static int inter_port(struct interface *interface, char *filename, int line, cha
                searchif = searchif->next;
        }
        /* alloc port substructure */
                searchif = searchif->next;
        }
        /* alloc port substructure */
-       ifport = (struct interface_port *)malloc(sizeof(struct interface_port));
-       if (!ifport)
-       {
-               SPRINT(interface_error, "No memory!");
-               return(-1);
-       }
+       ifport = (struct interface_port *)MALLOC(sizeof(struct interface_port));
        memuse++;
        memuse++;
-       memset(ifport, 0, sizeof(struct interface_port));
        ifport->interface = interface;
        /* set value */
        ifport->portnum = val;
        ifport->interface = interface;
        /* set value */
        ifport->portnum = val;
@@ -360,14 +336,8 @@ static int inter_channel_out(struct interface *interface, char *filename, int li
                        }
                        selchannel:
                        /* add to select-channel list */
                        }
                        selchannel:
                        /* add to select-channel list */
-                       selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
-                       if (!selchannel)
-                       {
-                               SPRINT(interface_error, "No memory!");
-                               return(-1);
-                       }
+                       selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
                        memuse++;
                        memuse++;
-                       memset(selchannel, 0, sizeof(struct select_channel));
                        /* set value */
                        selchannel->channel = val;
                        /* tail port */
                        /* set value */
                        selchannel->channel = val;
                        /* tail port */
@@ -426,14 +396,8 @@ static int inter_channel_in(struct interface *interface, char *filename, int lin
                        }
                        selchannel:
                        /* add to select-channel list */
                        }
                        selchannel:
                        /* add to select-channel list */
-                       selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
-                       if (!selchannel)
-                       {
-                               SPRINT(interface_error, "No memory!");
-                               return(-1);
-                       }
+                       selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
                        memuse++;
                        memuse++;
-                       memset(selchannel, 0, sizeof(struct select_channel));
                        /* set value */
                        selchannel->channel = val;
                        /* tail port */
                        /* set value */
                        selchannel->channel = val;
                        /* tail port */
@@ -468,14 +432,8 @@ static int inter_msn(struct interface *interface, char *filename, int line, char
                el = p;
                p = get_seperated(p);
                /* add MSN to list */
                el = p;
                p = get_seperated(p);
                /* add MSN to list */
-               ifmsn = (struct interface_msn *)malloc(sizeof(struct interface_msn));
-               if (!ifmsn)
-               {
-                       SPRINT(interface_error, "No memory!");
-                       return(-1);
-               }
+               ifmsn = (struct interface_msn *)MALLOC(sizeof(struct interface_msn));
                memuse++;
                memuse++;
-               memset(ifmsn, 0, sizeof(struct interface_msn));
                /* set value */
                SCPY(ifmsn->msn, el);
                /* tail port */
                /* set value */
                SCPY(ifmsn->msn, el);
                /* tail port */
@@ -500,14 +458,8 @@ static int inter_screen(struct interface_screen **ifscreenp, struct interface *i
        el = p;
        p = get_seperated(p);
        /* add screen entry to list*/
        el = p;
        p = get_seperated(p);
        /* add screen entry to list*/
-       ifscreen = (struct interface_screen *)malloc(sizeof(struct interface_screen));
-       if (!ifscreen)
-       {
-               SPRINT(interface_error, "No memory!");
-               return(-1);
-       }
+       ifscreen = (struct interface_screen *)MALLOC(sizeof(struct interface_screen));
        memuse++;
        memuse++;
-       memset(ifscreen, 0, sizeof(struct interface_screen));
        ifscreen->match_type = -1; /* unchecked */
        ifscreen->match_present = -1; /* unchecked */
        ifscreen->result_type = -1; /* unchanged */
        ifscreen->match_type = -1; /* unchecked */
        ifscreen->match_present = -1; /* unchecked */
        ifscreen->result_type = -1; /* unchanged */
@@ -691,10 +643,10 @@ struct interface_param interface_param[] = {
        { "extension", &inter_extension, "",
        "If keyword is given, calls to interface are handled as internal extensions."},
        {"tones", &inter_tones, "yes | no",
        { "extension", &inter_extension, "",
        "If keyword is given, calls to interface are handled as internal extensions."},
        {"tones", &inter_tones, "yes | no",
-       "Interface generates tones during call setup and release, or not.\nBy default only NT-mode interfaces generate tones."},
+       "Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
 
        {"earlyb", &inter_earlyb, "yes | no",
 
        {"earlyb", &inter_earlyb, "yes | no",
-       "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode interfaces receive tones."},
+       "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode ports receive tones."},
 
        {"hunt", &inter_hunt, "linear | roundrobin",
        "Select the algorithm for selecting port with free channel."},
 
        {"hunt", &inter_hunt, "linear | roundrobin",
        "Select the algorithm for selecting port with free channel."},
@@ -716,7 +668,7 @@ struct interface_param interface_param[] = {
        "This is required on PRI NT-mode ports that are point-to-point by default.\n"
        "This parameter must follow a 'port' parameter."},
 
        "This is required on PRI NT-mode ports that are point-to-point by default.\n"
        "This parameter must follow a 'port' parameter."},
 
-       {"channel_out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
+       {"channel-out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
        "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"
        "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"
@@ -726,10 +678,10 @@ struct interface_param interface_param[] = {
        " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
        " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
 
        " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
        " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
 
-       {"channel_in", &inter_channel_in, "[force,][<number>][,...][,free][,any][,no]",
+       {"channel-in", &inter_channel_in, "[<number>][,...][,free]",
        "Channel selection list for all incomming calls from the interface.\n"
        "A free channels is accepted if in the list.\n"
        "Channel selection list for all incomming calls from the interface.\n"
        "A free channels is accepted if in the list.\n"
-       "If no channel was requested, the first free channel found is selected.\n"
+       "If any channel was requested, the first free channel found is selected.\n"
        "This parameter must follow a 'port' parameter.\n"
        " <number>[,...] - List of channels to accept.\n"
        " free - Accept any free channel"},
        "This parameter must follow a 'port' parameter.\n"
        " <number>[,...] - List of channels to accept.\n"
        " free - Accept any free channel"},
@@ -738,18 +690,18 @@ struct interface_param interface_param[] = {
        "Incomming 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"},
 
        "Incomming 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>[%%]",
+       {"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"
        "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
        "Adds an entry for incomming 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"
+       "If '%' is given after old caller ID, it matches even if caller ID has\n"
        "additional digits.\n"
        "additional digits.\n"
-       "If '%%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
+       "If '%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
        "are added.\n"
        "Options can be:\n"
        " unknown | subsciber | national | international - Change caller ID type.\n"
        " present | restrict - Change presentation of caller ID."},
                
        "are added.\n"
        "Options can be:\n"
        " unknown | subsciber | national | international - Change caller ID type.\n"
        " present | restrict - Change presentation of caller ID."},
                
-       {"screen-out", &inter_screen_out, "<old caller ID> <new caller ID> [options]",
+       {"screen-out", &inter_screen_out, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
        "Adds an entry for outgoing calls to the caller ID screen list.\n"
        "See 'screen-in' for help."},
 
        "Adds an entry for outgoing calls to the caller ID screen list.\n"
        "See 'screen-in' for help."},
 
@@ -788,10 +740,7 @@ struct interface *read_interfaces(void)
        struct interface_param  *ifparam;
 
        if (interface_newlist != NULL)
        struct interface_param  *ifparam;
 
        if (interface_newlist != NULL)
-       {
-               PERROR("software error, list is not empty.\n");
-               exit(-1);
-       }
+               FATAL("list is not empty.\n");
        interface_error[0] = '\0';
        SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
 
        interface_error[0] = '\0';
        SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
 
@@ -894,14 +843,8 @@ struct interface *read_interfaces(void)
                        }
 
                        /* append interface to new list */
                        }
 
                        /* append interface to new list */
-                       interface = (struct interface *)malloc(sizeof(struct interface));
-                       if (!interface)
-                       {
-                               SPRINT(interface_error, "No memory!");
-                               goto error;
-                       }
+                       interface = (struct interface *)MALLOC(sizeof(struct interface));
                        memuse++;
                        memuse++;
-                       memset(interface, 0, sizeof(struct interface));
 
                        /* name interface */
                        SCPY(interface->name, parameter+1);
 
                        /* name interface */
                        SCPY(interface->name, parameter+1);
@@ -964,8 +907,7 @@ void free_interfaces(struct interface *interface)
                        {
                                temp = selchannel;
                                selchannel = selchannel->next;
                        {
                                temp = selchannel;
                                selchannel = selchannel->next;
-                               memset(temp, 0, sizeof(struct select_channel));
-                               free(temp);
+                               FREE(temp, sizeof(struct select_channel));
                                memuse--;
                        }
                        selchannel = ifport->out_channel;
                                memuse--;
                        }
                        selchannel = ifport->out_channel;
@@ -973,14 +915,12 @@ void free_interfaces(struct interface *interface)
                        {
                                temp = selchannel;
                                selchannel = selchannel->next;
                        {
                                temp = selchannel;
                                selchannel = selchannel->next;
-                               memset(temp, 0, sizeof(struct select_channel));
-                               free(temp);
+                               FREE(temp, sizeof(struct select_channel));
                                memuse--;
                        }
                        temp = ifport;
                        ifport = ifport->next;
                                memuse--;
                        }
                        temp = ifport;
                        ifport = ifport->next;
-                       memset(temp, 0, sizeof(struct interface_port));
-                       free(temp);
+                       FREE(temp, sizeof(struct interface_port));
                        memuse--;
                }
                ifmsn = interface->ifmsn;
                        memuse--;
                }
                ifmsn = interface->ifmsn;
@@ -988,8 +928,7 @@ void free_interfaces(struct interface *interface)
                {
                        temp = ifmsn;
                        ifmsn = ifmsn->next;
                {
                        temp = ifmsn;
                        ifmsn = ifmsn->next;
-                       memset(temp, 0, sizeof(struct interface_msn));
-                       free(temp);
+                       FREE(temp, sizeof(struct interface_msn));
                        memuse--;
                }
                ifscreen = interface->ifscreen_in;
                        memuse--;
                }
                ifscreen = interface->ifscreen_in;
@@ -997,8 +936,7 @@ void free_interfaces(struct interface *interface)
                {
                        temp = ifscreen;
                        ifscreen = ifscreen->next;
                {
                        temp = ifscreen;
                        ifscreen = ifscreen->next;
-                       memset(temp, 0, sizeof(struct interface_screen));
-                       free(temp);
+                       FREE(temp, sizeof(struct interface_screen));
                        memuse--;
                }
                ifscreen = interface->ifscreen_out;
                        memuse--;
                }
                ifscreen = interface->ifscreen_out;
@@ -1006,8 +944,7 @@ void free_interfaces(struct interface *interface)
                {
                        temp = ifscreen;
                        ifscreen = ifscreen->next;
                {
                        temp = ifscreen;
                        ifscreen = ifscreen->next;
-                       memset(temp, 0, sizeof(struct interface_screen));
-                       free(temp);
+                       FREE(temp, sizeof(struct interface_screen));
                        memuse--;
                }
                iffilter = interface->iffilter;
                        memuse--;
                }
                iffilter = interface->iffilter;
@@ -1015,18 +952,43 @@ void free_interfaces(struct interface *interface)
                {
                        temp = iffilter;
                        iffilter = iffilter->next;
                {
                        temp = iffilter;
                        iffilter = iffilter->next;
-                       memset(temp, 0, sizeof(struct interface_filter));
-                       free(temp);
+                       FREE(temp, sizeof(struct interface_filter));
                        memuse--;
                }
                temp = interface;
                interface = interface->next;
                        memuse--;
                }
                temp = interface;
                interface = interface->next;
-               memset(temp, 0, sizeof(struct interface));
-               free(temp);
+               FREE(temp, sizeof(struct interface));
                memuse--;
        }
 }
 
                memuse--;
        }
 }
 
+/*
+ * defaults of ports if not specified by config
+ */
+static void set_defaults(struct interface_port *ifport)
+{
+       /* default channel selection list */
+       if (!ifport->out_channel)
+               default_out_channel(ifport);
+       if (!ifport->in_channel)
+               default_in_channel(ifport);
+       /* default is_tones */
+       if (ifport->interface->is_tones)
+               ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
+       else
+               ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
+       /* default is_earlyb */
+       if (ifport->interface->is_earlyb)
+               ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
+       else
+               ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
+       /* set locally flag */
+       if (ifport->interface->extension)
+               ifport->mISDNport->locally = 1;
+       else
+               ifport->mISDNport->locally = 0;
+}
+
 
 /*
  * all links between mISDNport and interface are made
 
 /*
  * all links between mISDNport and interface are made
@@ -1061,6 +1023,7 @@ void relink_interfaces(void)
                                {
                                        ifport->mISDNport = mISDNport;
                                        mISDNport->ifport = ifport;
                                {
                                        ifport->mISDNport = mISDNport;
                                        mISDNport->ifport = ifport;
+                                       set_defaults(ifport);
                                }
                                mISDNport = mISDNport->next;
                        }
                                }
                                mISDNport = mISDNport->next;
                        }
@@ -1117,22 +1080,7 @@ void load_port(struct interface_port *ifport)
                /* link port */
                ifport->mISDNport = mISDNport;
                mISDNport->ifport = ifport;
                /* link port */
                ifport->mISDNport = mISDNport;
                mISDNport->ifport = ifport;
-               
-               /* default channel selection list */
-               if (!ifport->out_channel)
-                       default_out_channel(ifport);
-               if (!ifport->in_channel)
-                       default_in_channel(ifport);
-               /* default is_tones */
-               if (ifport->interface->is_tones)
-                       ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
-               else
-                       ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
-               /* default is_earlyb */
-               if (ifport->interface->is_earlyb)
-                       ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
-               else
-                       ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
+               set_defaults(ifport);
        } else
        {
                ifport->block = 2; /* not available */
        } else
        {
                ifport->block = 2; /* not available */