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->result_type = -1; /* unchanged */
514 ifscreen->result_present = -1; /* unchanged */
517 ifscreenp = &((*ifscreenp)->next);
518 *ifscreenp = ifscreen;
523 p = get_seperated(p);
524 if (!strcasecmp(el, "unknown"))
526 if (ifscreen->match_type != -1)
529 SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
532 ifscreen->match_type = INFO_NTYPE_UNKNOWN;
534 if (!strcasecmp(el, "subscriber"))
536 if (ifscreen->match_type != -1)
538 ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
540 if (!strcasecmp(el, "national"))
542 if (ifscreen->match_type != -1)
544 ifscreen->match_type = INFO_NTYPE_NATIONAL;
546 if (!strcasecmp(el, "international"))
548 if (ifscreen->match_type != -1)
550 ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
552 if (!strcasecmp(el, "allowed"))
554 if (ifscreen->match_present != -1)
557 SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line, parameter);
560 ifscreen->match_present = INFO_PRESENT_ALLOWED;
562 if (!strcasecmp(el, "restricted"))
564 if (ifscreen->match_present != -1)
566 ifscreen->match_present = INFO_PRESENT_RESTRICTED;
568 SCPY(ifscreen->match, el);
572 if (ifscreen->match[0] == '\0')
574 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
581 p = get_seperated(p);
582 if (!strcasecmp(el, "unknown"))
584 if (ifscreen->result_type != -1)
586 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
588 if (!strcasecmp(el, "subscriber"))
590 if (ifscreen->result_type != -1)
592 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
594 if (!strcasecmp(el, "national"))
596 if (ifscreen->result_type != -1)
598 ifscreen->result_type = INFO_NTYPE_NATIONAL;
600 if (!strcasecmp(el, "international"))
602 if (ifscreen->result_type != -1)
604 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
606 if (!strcasecmp(el, "allowed"))
608 if (ifscreen->result_present != -1)
610 ifscreen->result_present = INFO_PRESENT_ALLOWED;
612 if (!strcasecmp(el, "restricted"))
614 if (ifscreen->result_present != -1)
616 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
618 SCPY(ifscreen->result, el);
622 if (ifscreen->result[0] == '\0')
624 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
629 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
631 if (interface->ifmsn)
633 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
637 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
639 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
641 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
643 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
645 #warning filter to be done
651 * structure of parameters
653 struct interface_param interface_param[] = {
654 { "extension", &inter_extension, "",
655 "If keyword is given, calls to interface are handled as internal extensions."},
656 {"tones", &inter_tones, "yes | no",
657 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode interfaces generate tones."},
659 {"earlyb", &inter_earlyb, "yes | no",
660 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode interfaces receive tones."},
662 {"hunt", &inter_hunt, "linear | roundrobin",
663 "Select the algorithm for selecting port with free channel."},
665 {"port", &inter_port, "<number>",
666 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
668 {"block", &inter_block, "",
669 "If keyword is given, calls on this interface are blocked.\n"
670 "This parameter must follow a 'port' parameter."},
672 {"ptp", &inter_ptp, "",
673 "The given port above is opened as point-to-point.\n"
674 "This is required on NT-mode ports that are multipoint by default.\n"
675 "This parameter must follow a 'port' parameter."},
677 {"ptmp", &inter_ptmp, "",
678 "The given port above is opened as point-to-multipoint.\n"
679 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
680 "This parameter must follow a 'port' parameter."},
682 {"channel_out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
683 "Channel selection list for all outgoing calls to the interface.\n"
684 "A free channels is searched in order of appearance.\n"
685 "This parameter must follow a 'port' parameter.\n"
686 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
687 " <number>[,...] - List of channels to search.\n"
688 " free - Select any free channel\n"
689 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
690 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
692 {"channel_in", &inter_channel_in, "[force,][<number>][,...][,free][,any][,no]",
693 "Channel selection list for all incomming calls from the interface.\n"
694 "A free channels is accepted if in the list.\n"
695 "If no channel was requested, the first free channel found is selected.\n"
696 "This parameter must follow a 'port' parameter.\n"
697 " <number>[,...] - List of channels to accept.\n"
698 " free - Accept any free channel\n"
700 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
701 "Incomming caller ID is checked against given MSN numbers.\n"
702 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
704 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%%] [options] <new caller ID>[%%]",
705 "Adds an entry for incomming calls to the caller ID screen list.\n"
706 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
707 "If '%%' is given after old caller ID, it matches even if caller ID has\n"
708 "additional digits.\n"
709 "If '%%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
712 " unknown | subsciber | national | international - Change caller ID type.\n"
713 " present | restrict - Change presentation of caller ID."},
715 {"screen-out", &inter_screen_out, "<old caller ID> <new caller ID> [options]",
716 "Adds an entry for outgoing calls to the caller ID screen list.\n"
717 "See 'screen-in' for help."},
719 {"filter", &inter_filter, "<filter> [parameters]",
720 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
721 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
722 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
724 {NULL, NULL, NULL, NULL}
729 * read settings from interface.conf
731 char interface_error[256];
732 struct interface *read_interfaces(void)
737 unsigned int line, i;
739 struct interface *interface = NULL, /* in case no interface */
740 **interfacep = &interface_newlist;
743 int expecting = 1; /* expecting new interface */
744 struct interface_param *ifparam;
746 if (interface_newlist != NULL)
748 PERROR("software error, list is not empty.\n");
751 interface_error[0] = '\0';
752 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
754 if (!(fp = fopen(filename,"r")))
756 SPRINT(interface_error, "Cannot open '%s'\n", filename);
761 while((fgets(buffer,sizeof(buffer),fp)))
763 buffer[sizeof(buffer)-1]=0;
764 if (buffer[0]) buffer[strlen(buffer)-1]=0;
768 while(*p <= 32) /* skip spaces */
774 if (*p==0 || *p=='#') /* ignore comments and empty line */
779 i=0; /* read parameter */
782 if (i+1 >= sizeof(parameter))
784 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
787 parameter[i+1] = '\0';
788 parameter[i++] = *p++;
791 while(*p <= 32) /* skip spaces */
798 if (*p!=0 && *p!='#') /* missing name */
800 i=0; /* read until end */
801 while(*p!=0 && *p!='#')
803 if (i+1 >= sizeof(value))
805 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
812 /* remove trailing spaces from value */
815 if (value[i-1]==0 || value[i-1]>32)
822 /* check for interface name as first statement */
823 if (expecting && parameter[0]!='[')
825 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
830 /* check for new interface */
831 if (parameter[0] == '[')
833 if (parameter[strlen(parameter)-1] != ']')
835 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
838 parameter[strlen(parameter)-1] = '\0';
840 /* check if interface name already exists */
841 interface = interface_first;
844 if (!strcasecmp(interface->name, parameter+1))
846 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
849 interface = interface->next;
852 /* append interface to new list */
853 interface = (struct interface *)malloc(sizeof(struct interface));
856 SPRINT(interface_error, "No memory!");
860 memset(interface, 0, sizeof(struct interface));
863 SCPY(interface->name, parameter+1);
866 *interfacep = interface;
867 interfacep = &interface->next;
872 ifparam = interface_param;
875 if (!strcasecmp(parameter, ifparam->name))
877 if (ifparam->func(interface, filename, line, parameter, value))
884 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
889 return(interface_newlist);
891 PERROR_RUNTIME("%s", interface_error);
893 free_interfaces(interface_newlist);
894 interface_newlist = NULL;
900 * freeing chain of interfaces
902 void free_interfaces(struct interface *interface)
905 struct interface_port *ifport;
906 struct select_channel *selchannel;
907 struct interface_msn *ifmsn;
908 struct interface_screen *ifscreen;
909 struct interface_filter *iffilter;
913 ifport = interface->ifport;
916 selchannel = ifport->in_channel;
920 selchannel = selchannel->next;
921 memset(temp, 0, sizeof(struct select_channel));
925 selchannel = ifport->out_channel;
929 selchannel = selchannel->next;
930 memset(temp, 0, sizeof(struct select_channel));
935 ifport = ifport->next;
936 memset(temp, 0, sizeof(struct interface_port));
940 ifmsn = interface->ifmsn;
945 memset(temp, 0, sizeof(struct interface_msn));
949 ifscreen = interface->ifscreen_in;
953 ifscreen = ifscreen->next;
954 memset(temp, 0, sizeof(struct interface_screen));
958 ifscreen = interface->ifscreen_out;
962 ifscreen = ifscreen->next;
963 memset(temp, 0, sizeof(struct interface_screen));
967 iffilter = interface->iffilter;
971 iffilter = iffilter->next;
972 memset(temp, 0, sizeof(struct interface_filter));
977 interface = interface->next;
978 memset(temp, 0, sizeof(struct interface));
986 * all links between mISDNport and interface are made
987 * unused mISDNports are closed, new mISDNports are opened
988 * also set default select_channel lists
990 void relink_interfaces(void)
992 struct mISDNport *mISDNport;
993 struct interface *interface;
994 struct interface_port *ifport;
996 /* unlink all mISDNports */
997 mISDNport = mISDNport_first;
1000 mISDNport->ifport = NULL;
1001 mISDNport = mISDNport->next;
1004 /* relink existing mISDNports */
1005 interface = interface_newlist;
1008 ifport = interface->ifport;
1011 mISDNport = mISDNport_first;
1014 if (mISDNport->portnum == ifport->portnum)
1016 ifport->mISDNport = mISDNport;
1017 mISDNport->ifport = ifport;
1019 mISDNport = mISDNport->next;
1021 ifport = ifport->next;
1023 interface = interface->next;
1026 /* close unused mISDNports */
1028 mISDNport = mISDNport_first;
1031 if (mISDNport->ifport == NULL)
1033 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1034 /* remove all port objects and destroy port */
1035 mISDNport_close(mISDNport);
1038 mISDNport = mISDNport->next;
1041 /* open and link new mISDNports */
1042 interface = interface_newlist;
1045 ifport = interface->ifport;
1048 if (!ifport->mISDNport)
1051 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp);
1054 ifport->mISDNport = mISDNport;
1055 mISDNport->ifport = ifport;
1058 if (ifport->mISDNport)
1060 /* default channel selection list */
1061 if (!ifport->selchannel)
1062 default_selchannel(ifport);
1063 /* default is_tones */
1064 if (ifport->interface->is_tones)
1065 ifport->mISDNport->is_tones = (ifport->interface->is_tones==IS_YES);
1067 ifport->mISDNport->is_tones = (ifport->mISDNport->ntmode)?1:0;
1068 /* default is_earlyb */
1069 if (ifport->interface->is_earlyb)
1070 ifport->mISDNport->is_earlyb = (ifport->interface->is_earlyb==IS_YES);
1072 ifport->mISDNport->is_earlyb = (ifport->mISDNport->ntmode)?0:1;
1075 interface = interface->next;
1081 * give summary of interface syntax
1083 void doc_interface(void)
1085 struct interface_param *ifparam;
1087 printf("Syntax overview\n");
1088 printf("---------------\n\n");
1090 printf("[<name>]\n");
1091 ifparam = interface_param;
1092 while(ifparam->name)
1094 printf("%s %s\n", ifparam->name, ifparam->usage);
1098 ifparam = interface_param;
1099 while(ifparam->name)
1101 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1102 printf("%s\n", ifparam->help);