1 /*****************************************************************************\
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** reading interface.conf file and filling structure **
10 \*****************************************************************************/
17 struct interface *interface_first = NULL; /* first interface is current list */
18 struct interface *interface_newlist = NULL; /* first interface in new list */
21 /* set default selchannel */
22 void default_selchannel(struct interface_port *ifport)
24 struct select_channel *selchannel, **selchannelp;
26 /* channel selection for TE-ports */
27 if (!ifport->mISDNport->ntmode)
29 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
36 memset(*selchannelp, 0, sizeof(struct select_channel));
37 *selchannelp->channel = SEL_CHANNEL_ANY;
38 selchannelp = &ifport->selchannel;
40 selchannelp = &((*selchannelp)->next);
41 *selchannelp = selchannel;
45 /* channel selection for NT-ports */
46 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
53 memset(*selchannelp, 0, sizeof(struct select_channel));
54 *selchannelp->channel = SEL_CHANNEL_FREE;
55 selchannelp = &ifport->selchannel;
57 selchannelp = &((*selchannelp)->next);
58 *selchannelp = selchannel;
60 /* additional channel selection for multipoint ports */
61 if (!ifport->mISDNport->ptp)
63 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
70 memset(*selchannelp, 0, sizeof(struct select_channel));
71 *selchannelp->channel = SEL_CHANNEL_NO; // call waiting
72 selchannelp = &ifport->selchannel;
74 selchannelp = &((*selchannelp)->next);
75 *selchannelp = selchannel;
80 /* parse string for a positive number */
81 static int get_number(char *value)
88 SPRINT(text, "%d", val);
90 if (!strcmp(value, text))
97 /* remove element from buffer
98 * and return pointer to next element in buffer */
99 static char *get_seperated(char *buffer)
103 if (*buffer==',' || *buffer<=32) /* seperate */
106 while((*buffer>'\0' && *buffer<=32) || *buffer==',')
116 * parameter processing
118 static int inter_block(struct interface *interface, char *filename, int line, char *parameter, char *value)
120 struct interface_port *ifport;
122 /* port in chain ? */
123 if (!interface->ifport)
125 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
128 /* goto end of chain */
129 ifport = interface->ifport;
131 ifport = ifport->next;
135 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
141 static int inter_extension(struct interface *interface, char *filename, int line, char *parameter, char *value)
145 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
148 interface->extension = 1;
151 static int inter_ptp(struct interface *interface, char *filename, int line, char *parameter, char *value)
153 struct interface_port *ifport;
155 /* port in chain ? */
156 if (!interface->ifport)
158 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
161 if (interface->ifport->ptmp)
163 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptmp was given.\n", filename, line, parameter);
166 /* goto end of chain */
167 ifport = interface->ifport;
169 ifport = ifport->next;
173 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
179 static int inter_ptmp(struct interface *interface, char *filename, int line, char *parameter, char *value)
181 struct interface_port *ifport;
183 /* port in chain ? */
184 if (!interface->ifport)
186 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
189 if (interface->ifport->ptp)
191 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptp was given.\n", filename, line, parameter);
194 /* goto end of chain */
195 ifport = interface->ifport;
197 ifport = ifport->next;
201 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
207 static int inter_tones(struct interface *interface, char *filename, int line, char *parameter, char *value)
209 if (!strcasecmp(value, "yes"))
211 interface->is_tones = IS_YES;
213 if (!strcasecmp(value, "no"))
215 interface->is_tones = IS_NO;
218 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
223 static int inter_earlyb(struct interface *interface, char *filename, int line, char *parameter, char *value)
225 if (!strcasecmp(value, "yes"))
227 interface->is_earlyb = IS_YES;
229 if (!strcasecmp(value, "no"))
231 interface->is_earlyb = IS_NO;
234 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
239 static int inter_hunt(struct interface *interface, char *filename, int line, char *parameter, char *value)
241 if (!strcasecmp(value, "linear"))
243 interface->hunt = HUNT_LINEAR;
245 if (!strcasecmp(value, "roundrobin"))
247 interface->hunt = HUNT_ROUNDROBIN;
250 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'linear' or 'roundrobin'.\n", filename, line, parameter);
255 static int inter_port(struct interface *interface, char *filename, int line, char *parameter, char *value)
257 struct interface_port *ifport, **ifportp;
258 struct interface *searchif;
259 struct interface_port *searchport;
262 val = get_number(value);
265 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one numeric value.\n", filename, line, parameter);
268 /* check for port already assigned */
269 searchif = interface_newlist;
272 searchport = searchif->ifport;
275 if (ifport->portnum == val)
277 SPRINT(interface_error, "Error in %s (line %d): port '%d' already used above.\n", filename, line, val);
280 ifport = ifport->next;
282 searchif = searchif->next;
284 /* alloc port substructure */
285 ifport = (struct interface_port *)malloc(sizeof(struct interface_port));
288 SPRINT(interface_error, "No memory!");
292 memset(ifport, 0, sizeof(struct interface_port));
293 ifport->interface = interface;
295 ifport->portnum = val;
297 ifportp = &interface->ifport;
299 ifportp = &((*ifportp)->next);
303 static int inter_channel_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
305 struct interface_port *ifport;
306 struct select_channel *selchannel, **selchannelp;
310 /* port in chain ? */
311 if (!interface->ifport)
313 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
316 /* goto end of chain */
317 ifport = interface->ifport;
319 ifport = ifport->next;
324 p = get_seperated(p);
325 if (!strcasecmp(el, "force"))
327 ifport->channel_force = 1;
328 if (ifport->selchannel)
330 SPRINT(interface_error, "Error in %s (line %d): value 'force' may only appear as first element in list.\n", filename, line);
334 if (!strcasecmp(el, "any"))
336 val = SEL_CHANNEL_ANY;
339 if (!strcasecmp(el, "free"))
341 val = SEL_CHANNEL_FREE;
344 if (!strcasecmp(el, "no"))
346 val = SEL_CHANNEL_NO;
350 val = get_number(el);
353 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);
357 if (val<1 || val==16 || val>126)
359 SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
363 /* add to select-channel list */
364 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
367 SPRINT(interface_error, "No memory!");
371 memset(selchannel, 0, sizeof(struct select_channel));
373 selchannel->channel = val;
375 selchannelp = &ifport->selchannel;
377 selchannelp = &((*selchannelp)->next);
378 *selchannelp = selchannel;
383 static int inter_channel_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
385 struct interface_port *ifport;
386 struct select_channel *selchannel, **selchannelp;
390 /* port in chain ? */
391 if (!interface->ifport)
393 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
396 /* goto end of chain */
397 ifport = interface->ifport;
399 ifport = ifport->next;
404 p = get_seperated(p);
405 if (ifport->in_select) if (ifport->in_select->channel == SEL_CHANNEL_FREE)
407 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has values behind 'free' keyword. They has no effect.\n", filename, line, parameter);
410 if (!strcasecmp(el, "free"))
412 val = SEL_CHANNEL_FREE;
416 val = get_number(el);
419 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of channel numbers and 'free'.\n", filename, line, parameter);
423 if (val<1 || val==16 || val>126)
425 SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
429 /* add to select-channel list */
430 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
433 SPRINT(interface_error, "No memory!");
437 memset(selchannel, 0, sizeof(struct select_channel));
439 selchannel->channel = val;
441 selchannelp = &ifport->in_select;
443 selchannelp = &((*selchannelp)->next);
444 *selchannelp = selchannel;
449 static int inter_msn(struct interface *interface, char *filename, int line, char *parameter, char *value)
451 struct interface_msn *ifmsn, **ifmsnp;
456 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one MSN number or a list.\n", filename, line, parameter);
459 if (interface->ifscreen_in)
461 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'screen_in' parameter.\n", filename, line, parameter);
470 p = get_seperated(p);
471 /* add MSN to list */
472 ifmsn = (struct interface_msn *)malloc(sizeof(struct interface_msn));
475 SPRINT(interface_error, "No memory!");
479 memset(ifmsn, 0, sizeof(struct interface_msn));
481 SCPY(ifmsn->msn, el);
483 ifmsnp = &interface->ifmsn;
485 ifmsnp = &((*ifmsnp)->next);
490 static int inter_screen(struct interface_screen **ifscreenp, struct interface *interface, char *filename, int line, char *parameter, char *value)
492 struct interface_screen *ifscreen;
497 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID and new caller ID.\n", filename, line, parameter);
502 p = get_seperated(p);
503 /* add screen entry to list*/
504 ifscreen = (struct interface_screen *)malloc(sizeof(struct interface_screen));
507 SPRINT(interface_error, "No memory!");
511 memset(ifscreen, 0, sizeof(struct interface_screen));
512 #warning handle unchanged as unchanged!!
513 ifscreen->match_type = -1; /* unchecked */
514 ifscreen->match_present = -1; /* unchecked */
515 ifscreen->result_type = -1; /* unchanged */
516 ifscreen->result_present = -1; /* unchanged */
519 ifscreenp = &((*ifscreenp)->next);
520 *ifscreenp = ifscreen;
525 p = get_seperated(p);
526 if (!strcasecmp(el, "unknown"))
528 if (ifscreen->match_type != -1)
531 SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
534 ifscreen->match_type = INFO_NTYPE_UNKNOWN;
536 if (!strcasecmp(el, "subscriber"))
538 if (ifscreen->match_type != -1)
540 ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
542 if (!strcasecmp(el, "national"))
544 if (ifscreen->match_type != -1)
546 ifscreen->match_type = INFO_NTYPE_NATIONAL;
548 if (!strcasecmp(el, "international"))
550 if (ifscreen->match_type != -1)
552 ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
554 if (!strcasecmp(el, "allowed"))
556 if (ifscreen->match_present != -1)
559 SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
562 ifscreen->match_present = INFO_PRESENT_ALLOWED;
564 if (!strcasecmp(el, "restricted"))
566 if (ifscreen->match_present != -1)
568 ifscreen->match_present = INFO_PRESENT_RESTRICTED;
570 SCPY(ifscreen->match, el);
571 /* check for % at the end */
574 if (strchr(el, '%') != el+len(el)-1)
576 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
583 if (ifscreen->match[0] == '\0')
585 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
592 p = get_seperated(p);
593 if (!strcasecmp(el, "unknown"))
595 if (ifscreen->result_type != -1)
597 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
599 if (!strcasecmp(el, "subscriber"))
601 if (ifscreen->result_type != -1)
603 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
605 if (!strcasecmp(el, "national"))
607 if (ifscreen->result_type != -1)
609 ifscreen->result_type = INFO_NTYPE_NATIONAL;
611 if (!strcasecmp(el, "international"))
613 if (ifscreen->result_type != -1)
615 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
617 if (!strcasecmp(el, "allowed"))
619 if (ifscreen->result_present != -1)
621 ifscreen->result_present = INFO_PRESENT_ALLOWED;
623 if (!strcasecmp(el, "restricted"))
625 if (ifscreen->result_present != -1)
627 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
629 SCPY(ifscreen->result, el);
630 /* check for % at the end */
633 if (strchr(el, '%') != el+len(el)-1)
635 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
642 if (ifscreen->result[0] == '\0')
644 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
649 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
651 if (interface->ifmsn)
653 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
657 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
659 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
661 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
663 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
665 #warning filter to be done
671 * structure of parameters
673 struct interface_param interface_param[] = {
674 { "extension", &inter_extension, "",
675 "If keyword is given, calls to interface are handled as internal extensions."},
676 {"tones", &inter_tones, "yes | no",
677 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode interfaces generate tones."},
679 {"earlyb", &inter_earlyb, "yes | no",
680 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode interfaces receive tones."},
682 {"hunt", &inter_hunt, "linear | roundrobin",
683 "Select the algorithm for selecting port with free channel."},
685 {"port", &inter_port, "<number>",
686 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
688 {"block", &inter_block, "",
689 "If keyword is given, calls on this interface are blocked.\n"
690 "This parameter must follow a 'port' parameter."},
692 {"ptp", &inter_ptp, "",
693 "The given port above is opened as point-to-point.\n"
694 "This is required on NT-mode ports that are multipoint by default.\n"
695 "This parameter must follow a 'port' parameter."},
697 {"ptmp", &inter_ptmp, "",
698 "The given port above is opened as point-to-multipoint.\n"
699 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
700 "This parameter must follow a 'port' parameter."},
702 {"channel_out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
703 "Channel selection list for all outgoing calls to the interface.\n"
704 "A free channels is searched in order of appearance.\n"
705 "This parameter must follow a 'port' parameter.\n"
706 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
707 " <number>[,...] - List of channels to search.\n"
708 " free - Select any free channel\n"
709 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
710 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
712 {"channel_in", &inter_channel_in, "[force,][<number>][,...][,free][,any][,no]",
713 "Channel selection list for all incomming calls from the interface.\n"
714 "A free channels is accepted if in the list.\n"
715 "If no channel was requested, the first free channel found is selected.\n"
716 "This parameter must follow a 'port' parameter.\n"
717 " <number>[,...] - List of channels to accept.\n"
718 " free - Accept any free channel\n"
720 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
721 "Incomming caller ID is checked against given MSN numbers.\n"
722 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
724 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%%] [options] <new caller ID>[%%]",
725 "Adds an entry for incomming calls to the caller ID screen list.\n"
726 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
727 "If '%%' is given after old caller ID, it matches even if caller ID has\n"
728 "additional digits.\n"
729 "If '%%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
732 " unknown | subsciber | national | international - Change caller ID type.\n"
733 " present | restrict - Change presentation of caller ID."},
735 {"screen-out", &inter_screen_out, "<old caller ID> <new caller ID> [options]",
736 "Adds an entry for outgoing calls to the caller ID screen list.\n"
737 "See 'screen-in' for help."},
740 #warning todo: filter, also in the PmISDN object
741 {"filter", &inter_filter, "<filter> [parameters]",
742 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
743 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
744 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
747 {NULL, NULL, NULL, NULL}
752 * read settings from interface.conf
754 char interface_error[256];
755 struct interface *read_interfaces(void)
760 unsigned int line, i;
762 struct interface *interface = NULL, /* in case no interface */
763 **interfacep = &interface_newlist;
766 int expecting = 1; /* expecting new interface */
767 struct interface_param *ifparam;
769 if (interface_newlist != NULL)
771 PERROR("software error, list is not empty.\n");
774 interface_error[0] = '\0';
775 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
777 if (!(fp = fopen(filename,"r")))
779 SPRINT(interface_error, "Cannot open '%s'\n", filename);
784 while((fgets(buffer,sizeof(buffer),fp)))
786 buffer[sizeof(buffer)-1]=0;
787 if (buffer[0]) buffer[strlen(buffer)-1]=0;
791 while(*p <= 32) /* skip spaces */
797 if (*p==0 || *p=='#') /* ignore comments and empty line */
802 i=0; /* read parameter */
805 if (i+1 >= sizeof(parameter))
807 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
810 parameter[i+1] = '\0';
811 parameter[i++] = *p++;
814 while(*p <= 32) /* skip spaces */
821 if (*p!=0 && *p!='#') /* missing name */
823 i=0; /* read until end */
824 while(*p!=0 && *p!='#')
826 if (i+1 >= sizeof(value))
828 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
835 /* remove trailing spaces from value */
838 if (value[i-1]==0 || value[i-1]>32)
845 /* check for interface name as first statement */
846 if (expecting && parameter[0]!='[')
848 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
853 /* check for new interface */
854 if (parameter[0] == '[')
856 if (parameter[strlen(parameter)-1] != ']')
858 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
861 parameter[strlen(parameter)-1] = '\0';
863 /* check if interface name already exists */
864 interface = interface_first;
867 if (!strcasecmp(interface->name, parameter+1))
869 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
872 interface = interface->next;
875 /* append interface to new list */
876 interface = (struct interface *)malloc(sizeof(struct interface));
879 SPRINT(interface_error, "No memory!");
883 memset(interface, 0, sizeof(struct interface));
886 SCPY(interface->name, parameter+1);
889 *interfacep = interface;
890 interfacep = &interface->next;
895 ifparam = interface_param;
898 if (!strcasecmp(parameter, ifparam->name))
900 if (ifparam->func(interface, filename, line, parameter, value))
907 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
912 return(interface_newlist);
914 PERROR_RUNTIME("%s", interface_error);
916 free_interfaces(interface_newlist);
917 interface_newlist = NULL;
923 * freeing chain of interfaces
925 void free_interfaces(struct interface *interface)
928 struct interface_port *ifport;
929 struct select_channel *selchannel;
930 struct interface_msn *ifmsn;
931 struct interface_screen *ifscreen;
932 struct interface_filter *iffilter;
936 ifport = interface->ifport;
939 selchannel = ifport->in_channel;
943 selchannel = selchannel->next;
944 memset(temp, 0, sizeof(struct select_channel));
948 selchannel = ifport->out_channel;
952 selchannel = selchannel->next;
953 memset(temp, 0, sizeof(struct select_channel));
958 ifport = ifport->next;
959 memset(temp, 0, sizeof(struct interface_port));
963 ifmsn = interface->ifmsn;
968 memset(temp, 0, sizeof(struct interface_msn));
972 ifscreen = interface->ifscreen_in;
976 ifscreen = ifscreen->next;
977 memset(temp, 0, sizeof(struct interface_screen));
981 ifscreen = interface->ifscreen_out;
985 ifscreen = ifscreen->next;
986 memset(temp, 0, sizeof(struct interface_screen));
990 iffilter = interface->iffilter;
994 iffilter = iffilter->next;
995 memset(temp, 0, sizeof(struct interface_filter));
1000 interface = interface->next;
1001 memset(temp, 0, sizeof(struct interface));
1009 * all links between mISDNport and interface are made
1010 * unused mISDNports are closed, new mISDNports are opened
1011 * also set default select_channel lists
1013 void relink_interfaces(void)
1015 struct mISDNport *mISDNport;
1016 struct interface *interface;
1017 struct interface_port *ifport;
1019 /* unlink all mISDNports */
1020 mISDNport = mISDNport_first;
1023 mISDNport->ifport = NULL;
1024 mISDNport = mISDNport->next;
1027 /* relink existing mISDNports */
1028 interface = interface_newlist;
1031 ifport = interface->ifport;
1034 mISDNport = mISDNport_first;
1037 if (mISDNport->portnum == ifport->portnum)
1039 ifport->mISDNport = mISDNport;
1040 mISDNport->ifport = ifport;
1042 mISDNport = mISDNport->next;
1044 ifport = ifport->next;
1046 interface = interface->next;
1049 /* close unused mISDNports */
1051 mISDNport = mISDNport_first;
1054 if (mISDNport->ifport == NULL)
1056 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1057 /* remove all port objects and destroy port */
1058 mISDNport_close(mISDNport);
1061 mISDNport = mISDNport->next;
1064 /* open and link new mISDNports */
1065 interface = interface_newlist;
1068 ifport = interface->ifport;
1071 if (!ifport->mISDNport)
1074 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp);
1077 ifport->mISDNport = mISDNport;
1078 mISDNport->ifport = ifport;
1081 if (ifport->mISDNport)
1083 /* default channel selection list */
1084 if (!ifport->selchannel)
1085 default_selchannel(ifport);
1086 /* default is_tones */
1087 if (ifport->interface->is_tones)
1088 ifport->mISDNport->is_tones = (ifport->interface->is_tones==IS_YES);
1090 ifport->mISDNport->is_tones = (ifport->mISDNport->ntmode)?1:0;
1091 /* default is_earlyb */
1092 if (ifport->interface->is_earlyb)
1093 ifport->mISDNport->is_earlyb = (ifport->interface->is_earlyb==IS_YES);
1095 ifport->mISDNport->is_earlyb = (ifport->mISDNport->ntmode)?0:1;
1098 interface = interface->next;
1104 * give summary of interface syntax
1106 void doc_interface(void)
1108 struct interface_param *ifparam;
1110 printf("Syntax overview\n");
1111 printf("---------------\n\n");
1113 printf("[<name>]\n");
1114 ifparam = interface_param;
1115 while(ifparam->name)
1117 printf("%s %s\n", ifparam->name, ifparam->usage);
1121 ifparam = interface_param;
1122 while(ifparam->name)
1124 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1125 printf("%s\n", ifparam->help);