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 out_channel */
22 void default_out_channel(struct interface_port *ifport)
24 struct select_channel *selchannel, **selchannelp;
26 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
33 memset(selchannel, 0, sizeof(struct select_channel));
35 if (ifport->mISDNport->ntmode)
36 selchannel->channel = CHANNEL_FREE;
38 selchannel->channel = CHANNEL_ANY;
40 ifport->out_channel = selchannel;
42 /* additional channel selection for multipoint NT ports */
43 if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
45 selchannelp = &(selchannel->next);
46 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
53 memset(selchannel, 0, sizeof(struct select_channel));
54 selchannel->channel = CHANNEL_NO; // call waiting
55 *selchannelp = selchannel;
60 /* set default in_channel */
61 void default_in_channel(struct interface_port *ifport)
63 struct select_channel *selchannel;
65 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
72 memset(selchannel, 0, sizeof(struct select_channel));
74 selchannel->channel = CHANNEL_FREE;
76 ifport->in_channel = 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->out_channel)
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"))
339 if (!strcasecmp(el, "free"))
344 if (!strcasecmp(el, "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->out_channel;
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_channel) if (ifport->in_channel->channel == 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"))
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_channel;
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 ifscreen->match_type = -1; /* unchecked */
513 ifscreen->match_present = -1; /* unchecked */
514 ifscreen->result_type = -1; /* unchanged */
515 ifscreen->result_present = -1; /* unchanged */
518 ifscreenp = &((*ifscreenp)->next);
519 *ifscreenp = ifscreen;
524 p = get_seperated(p);
525 if (!strcasecmp(el, "unknown"))
527 if (ifscreen->match_type != -1)
530 SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
533 ifscreen->match_type = INFO_NTYPE_UNKNOWN;
535 if (!strcasecmp(el, "subscriber"))
537 if (ifscreen->match_type != -1)
539 ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
541 if (!strcasecmp(el, "national"))
543 if (ifscreen->match_type != -1)
545 ifscreen->match_type = INFO_NTYPE_NATIONAL;
547 if (!strcasecmp(el, "international"))
549 if (ifscreen->match_type != -1)
551 ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
553 if (!strcasecmp(el, "allowed"))
555 if (ifscreen->match_present != -1)
558 SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
561 ifscreen->match_present = INFO_PRESENT_ALLOWED;
563 if (!strcasecmp(el, "restricted"))
565 if (ifscreen->match_present != -1)
567 ifscreen->match_present = INFO_PRESENT_RESTRICTED;
569 SCPY(ifscreen->match, el);
570 /* check for % at the end */
573 if (strchr(el, '%') != el+strlen(el)-1)
575 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
582 if (ifscreen->match[0] == '\0')
584 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
591 p = get_seperated(p);
592 if (!strcasecmp(el, "unknown"))
594 if (ifscreen->result_type != -1)
596 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
598 if (!strcasecmp(el, "subscriber"))
600 if (ifscreen->result_type != -1)
602 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
604 if (!strcasecmp(el, "national"))
606 if (ifscreen->result_type != -1)
608 ifscreen->result_type = INFO_NTYPE_NATIONAL;
610 if (!strcasecmp(el, "international"))
612 if (ifscreen->result_type != -1)
614 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
616 if (!strcasecmp(el, "allowed"))
618 if (ifscreen->result_present != -1)
620 ifscreen->result_present = INFO_PRESENT_ALLOWED;
622 if (!strcasecmp(el, "restricted"))
624 if (ifscreen->result_present != -1)
626 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
628 SCPY(ifscreen->result, el);
629 /* check for % at the end */
632 if (strchr(el, '%') != el+strlen(el)-1)
634 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
641 if (ifscreen->result[0] == '\0')
643 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
648 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
650 if (interface->ifmsn)
652 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
656 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
658 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
660 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
662 static int inter_nodtmf(struct interface *interface, char *filename, int line, char *parameter, char *value)
664 struct interface_port *ifport;
666 /* port in chain ? */
667 if (!interface->ifport)
669 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
672 /* goto end of chain */
673 ifport = interface->ifport;
675 ifport = ifport->next;
679 #warning filter to be done
681 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
689 * structure of parameters
691 struct interface_param interface_param[] = {
692 { "extension", &inter_extension, "",
693 "If keyword is given, calls to interface are handled as internal extensions."},
694 {"tones", &inter_tones, "yes | no",
695 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode interfaces generate tones."},
697 {"earlyb", &inter_earlyb, "yes | no",
698 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode interfaces receive tones."},
700 {"hunt", &inter_hunt, "linear | roundrobin",
701 "Select the algorithm for selecting port with free channel."},
703 {"port", &inter_port, "<number>",
704 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
706 {"block", &inter_block, "",
707 "If keyword is given, calls on this interface are blocked.\n"
708 "This parameter must follow a 'port' parameter."},
710 {"ptp", &inter_ptp, "",
711 "The given port above is opened as point-to-point.\n"
712 "This is required on NT-mode ports that are multipoint by default.\n"
713 "This parameter must follow a 'port' parameter."},
715 {"ptmp", &inter_ptmp, "",
716 "The given port above is opened as point-to-multipoint.\n"
717 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
718 "This parameter must follow a 'port' parameter."},
720 {"channel_out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
721 "Channel selection list for all outgoing calls to the interface.\n"
722 "A free channels is searched in order of appearance.\n"
723 "This parameter must follow a 'port' parameter.\n"
724 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
725 " <number>[,...] - List of channels to search.\n"
726 " free - Select any free channel\n"
727 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
728 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
730 {"channel_in", &inter_channel_in, "[force,][<number>][,...][,free][,any][,no]",
731 "Channel selection list for all incomming calls from the interface.\n"
732 "A free channels is accepted if in the list.\n"
733 "If no channel was requested, the first free channel found is selected.\n"
734 "This parameter must follow a 'port' parameter.\n"
735 " <number>[,...] - List of channels to accept.\n"
736 " free - Accept any free channel"},
738 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
739 "Incomming caller ID is checked against given MSN numbers.\n"
740 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
742 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%%] [options] <new caller ID>[%%]",
743 "Adds an entry for incomming calls to the caller ID screen list.\n"
744 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
745 "If '%%' is given after old caller ID, it matches even if caller ID has\n"
746 "additional digits.\n"
747 "If '%%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
750 " unknown | subsciber | national | international - Change caller ID type.\n"
751 " present | restrict - Change presentation of caller ID."},
753 {"screen-out", &inter_screen_out, "<old caller ID> <new caller ID> [options]",
754 "Adds an entry for outgoing calls to the caller ID screen list.\n"
755 "See 'screen-in' for help."},
757 {"nodtmf", &inter_nodtmf, "",
758 "Disables DTMF detection for this interface.\n"
759 "This parameter must follow a 'port' parameter."},
762 #warning todo: filter, also in the PmISDN object
763 {"filter", &inter_filter, "<filter> [parameters]",
764 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
765 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
766 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
769 {NULL, NULL, NULL, NULL}
774 * read settings from interface.conf
776 char interface_error[256];
777 struct interface *read_interfaces(void)
782 unsigned int line, i;
784 struct interface *interface = NULL, /* in case no interface */
785 **interfacep = &interface_newlist;
788 int expecting = 1; /* expecting new interface */
789 struct interface_param *ifparam;
791 if (interface_newlist != NULL)
793 PERROR("software error, list is not empty.\n");
796 interface_error[0] = '\0';
797 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
799 if (!(fp = fopen(filename,"r")))
801 SPRINT(interface_error, "Cannot open '%s'\n", filename);
806 while((fgets(buffer,sizeof(buffer),fp)))
808 buffer[sizeof(buffer)-1]=0;
809 if (buffer[0]) buffer[strlen(buffer)-1]=0;
813 while(*p <= 32) /* skip spaces */
819 if (*p==0 || *p=='#') /* ignore comments and empty line */
824 i=0; /* read parameter */
827 if (i+1 >= sizeof(parameter))
829 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
832 parameter[i+1] = '\0';
833 parameter[i++] = *p++;
836 while(*p <= 32) /* skip spaces */
843 if (*p!=0 && *p!='#') /* missing name */
845 i=0; /* read until end */
846 while(*p!=0 && *p!='#')
848 if (i+1 >= sizeof(value))
850 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
857 /* remove trailing spaces from value */
860 if (value[i-1]==0 || value[i-1]>32)
867 /* check for interface name as first statement */
868 if (expecting && parameter[0]!='[')
870 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
875 /* check for new interface */
876 if (parameter[0] == '[')
878 if (parameter[strlen(parameter)-1] != ']')
880 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
883 parameter[strlen(parameter)-1] = '\0';
885 /* check if interface name already exists */
886 interface = interface_first;
889 if (!strcasecmp(interface->name, parameter+1))
891 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
894 interface = interface->next;
897 /* append interface to new list */
898 interface = (struct interface *)malloc(sizeof(struct interface));
901 SPRINT(interface_error, "No memory!");
905 memset(interface, 0, sizeof(struct interface));
908 SCPY(interface->name, parameter+1);
911 *interfacep = interface;
912 interfacep = &interface->next;
917 ifparam = interface_param;
920 if (!strcasecmp(parameter, ifparam->name))
922 if (ifparam->func(interface, filename, line, parameter, value))
929 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
934 return(interface_newlist);
936 PERROR_RUNTIME("%s", interface_error);
938 free_interfaces(interface_newlist);
939 interface_newlist = NULL;
945 * freeing chain of interfaces
947 void free_interfaces(struct interface *interface)
950 struct interface_port *ifport;
951 struct select_channel *selchannel;
952 struct interface_msn *ifmsn;
953 struct interface_screen *ifscreen;
954 struct interface_filter *iffilter;
958 ifport = interface->ifport;
961 selchannel = ifport->in_channel;
965 selchannel = selchannel->next;
966 memset(temp, 0, sizeof(struct select_channel));
970 selchannel = ifport->out_channel;
974 selchannel = selchannel->next;
975 memset(temp, 0, sizeof(struct select_channel));
980 ifport = ifport->next;
981 memset(temp, 0, sizeof(struct interface_port));
985 ifmsn = interface->ifmsn;
990 memset(temp, 0, sizeof(struct interface_msn));
994 ifscreen = interface->ifscreen_in;
998 ifscreen = ifscreen->next;
999 memset(temp, 0, sizeof(struct interface_screen));
1003 ifscreen = interface->ifscreen_out;
1007 ifscreen = ifscreen->next;
1008 memset(temp, 0, sizeof(struct interface_screen));
1012 iffilter = interface->iffilter;
1016 iffilter = iffilter->next;
1017 memset(temp, 0, sizeof(struct interface_filter));
1022 interface = interface->next;
1023 memset(temp, 0, sizeof(struct interface));
1031 * all links between mISDNport and interface are made
1032 * unused mISDNports are closed, new mISDNports are opened
1033 * also set default select_channel lists
1035 void relink_interfaces(void)
1037 struct mISDNport *mISDNport;
1038 struct interface *interface;
1039 struct interface_port *ifport;
1041 /* unlink all mISDNports */
1042 mISDNport = mISDNport_first;
1045 mISDNport->ifport = NULL;
1046 mISDNport = mISDNport->next;
1049 /* relink existing mISDNports */
1050 interface = interface_newlist;
1053 ifport = interface->ifport;
1056 mISDNport = mISDNport_first;
1059 if (mISDNport->portnum == ifport->portnum)
1061 ifport->mISDNport = mISDNport;
1062 mISDNport->ifport = ifport;
1064 mISDNport = mISDNport->next;
1066 ifport = ifport->next;
1068 interface = interface->next;
1071 /* close unused mISDNports */
1073 mISDNport = mISDNport_first;
1076 if (mISDNport->ifport == NULL)
1078 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1079 /* remove all port objects and destroy port */
1080 mISDNport_close(mISDNport);
1083 mISDNport = mISDNport->next;
1086 /* open and link new mISDNports */
1087 interface = interface_newlist;
1090 ifport = interface->ifport;
1093 if (!ifport->mISDNport)
1096 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp);
1099 ifport->mISDNport = mISDNport;
1100 mISDNport->ifport = ifport;
1103 if (ifport->mISDNport)
1105 /* default channel selection list */
1106 if (!ifport->out_channel)
1107 default_out_channel(ifport);
1108 if (!ifport->in_channel)
1109 default_in_channel(ifport);
1110 /* default is_tones */
1111 if (ifport->interface->is_tones)
1112 ifport->mISDNport->is_tones = (ifport->interface->is_tones==IS_YES);
1114 ifport->mISDNport->is_tones = (ifport->mISDNport->ntmode)?1:0;
1115 /* default is_earlyb */
1116 if (ifport->interface->is_earlyb)
1117 ifport->mISDNport->is_earlyb = (ifport->interface->is_earlyb==IS_YES);
1119 ifport->mISDNport->is_earlyb = (ifport->mISDNport->ntmode)?0:1;
1122 interface = interface->next;
1128 * give summary of interface syntax
1130 void doc_interface(void)
1132 struct interface_param *ifparam;
1134 printf("Syntax overview\n");
1135 printf("---------------\n\n");
1137 printf("[<name>]\n");
1138 ifparam = interface_param;
1139 while(ifparam->name)
1141 printf("%s %s\n", ifparam->name, ifparam->usage);
1145 ifparam = interface_param;
1146 while(ifparam->name)
1148 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1149 printf("%s\n", ifparam->help);