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;
261 val = get_number(value);
264 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one numeric value.\n", filename, line, parameter);
267 /* check for port already assigned */
268 searchif = interface_newlist;
271 ifport = searchif->ifport;
274 if (ifport->portnum == val)
276 SPRINT(interface_error, "Error in %s (line %d): port '%d' already used above.\n", filename, line, val);
279 ifport = ifport->next;
281 searchif = searchif->next;
283 /* alloc port substructure */
284 ifport = (struct interface_port *)malloc(sizeof(struct interface_port));
287 SPRINT(interface_error, "No memory!");
291 memset(ifport, 0, sizeof(struct interface_port));
292 ifport->interface = interface;
294 ifport->portnum = val;
296 ifportp = &interface->ifport;
298 ifportp = &((*ifportp)->next);
302 static int inter_channel_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
304 struct interface_port *ifport;
305 struct select_channel *selchannel, **selchannelp;
309 /* port in chain ? */
310 if (!interface->ifport)
312 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
315 /* goto end of chain */
316 ifport = interface->ifport;
318 ifport = ifport->next;
323 p = get_seperated(p);
324 if (!strcasecmp(el, "force"))
326 ifport->channel_force = 1;
327 if (ifport->out_channel)
329 SPRINT(interface_error, "Error in %s (line %d): value 'force' may only appear as first element in list.\n", filename, line);
333 if (!strcasecmp(el, "any"))
338 if (!strcasecmp(el, "free"))
343 if (!strcasecmp(el, "no"))
349 val = get_number(el);
352 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);
356 if (val<1 || val==16 || val>126)
358 SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
362 /* add to select-channel list */
363 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
366 SPRINT(interface_error, "No memory!");
370 memset(selchannel, 0, sizeof(struct select_channel));
372 selchannel->channel = val;
374 selchannelp = &ifport->out_channel;
376 selchannelp = &((*selchannelp)->next);
377 *selchannelp = selchannel;
382 static int inter_channel_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
384 struct interface_port *ifport;
385 struct select_channel *selchannel, **selchannelp;
389 /* port in chain ? */
390 if (!interface->ifport)
392 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
395 /* goto end of chain */
396 ifport = interface->ifport;
398 ifport = ifport->next;
403 p = get_seperated(p);
404 if (ifport->in_channel) if (ifport->in_channel->channel == CHANNEL_FREE)
406 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has values behind 'free' keyword. They has no effect.\n", filename, line, parameter);
409 if (!strcasecmp(el, "free"))
415 val = get_number(el);
418 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of channel numbers and 'free'.\n", filename, line, parameter);
422 if (val<1 || val==16 || val>126)
424 SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
428 /* add to select-channel list */
429 selchannel = (struct select_channel *)malloc(sizeof(struct select_channel));
432 SPRINT(interface_error, "No memory!");
436 memset(selchannel, 0, sizeof(struct select_channel));
438 selchannel->channel = val;
440 selchannelp = &ifport->in_channel;
442 selchannelp = &((*selchannelp)->next);
443 *selchannelp = selchannel;
448 static int inter_msn(struct interface *interface, char *filename, int line, char *parameter, char *value)
450 struct interface_msn *ifmsn, **ifmsnp;
455 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one MSN number or a list.\n", filename, line, parameter);
458 if (interface->ifscreen_in)
460 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'screen_in' parameter.\n", filename, line, parameter);
469 p = get_seperated(p);
470 /* add MSN to list */
471 ifmsn = (struct interface_msn *)malloc(sizeof(struct interface_msn));
474 SPRINT(interface_error, "No memory!");
478 memset(ifmsn, 0, sizeof(struct interface_msn));
480 SCPY(ifmsn->msn, el);
482 ifmsnp = &interface->ifmsn;
484 ifmsnp = &((*ifmsnp)->next);
489 static int inter_screen(struct interface_screen **ifscreenp, struct interface *interface, char *filename, int line, char *parameter, char *value)
491 struct interface_screen *ifscreen;
496 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID and new caller ID.\n", filename, line, parameter);
501 p = get_seperated(p);
502 /* add screen entry to list*/
503 ifscreen = (struct interface_screen *)malloc(sizeof(struct interface_screen));
506 SPRINT(interface_error, "No memory!");
510 memset(ifscreen, 0, sizeof(struct interface_screen));
511 ifscreen->match_type = -1; /* unchecked */
512 ifscreen->match_present = -1; /* unchecked */
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);
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);
569 /* check for % at the end */
572 if (strchr(el, '%') != el+strlen(el)-1)
574 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
581 if (ifscreen->match[0] == '\0')
583 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
590 p = get_seperated(p);
591 if (!strcasecmp(el, "unknown"))
593 if (ifscreen->result_type != -1)
595 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
597 if (!strcasecmp(el, "subscriber"))
599 if (ifscreen->result_type != -1)
601 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
603 if (!strcasecmp(el, "national"))
605 if (ifscreen->result_type != -1)
607 ifscreen->result_type = INFO_NTYPE_NATIONAL;
609 if (!strcasecmp(el, "international"))
611 if (ifscreen->result_type != -1)
613 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
615 if (!strcasecmp(el, "allowed"))
617 if (ifscreen->result_present != -1)
619 ifscreen->result_present = INFO_PRESENT_ALLOWED;
621 if (!strcasecmp(el, "restricted"))
623 if (ifscreen->result_present != -1)
625 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
627 SCPY(ifscreen->result, el);
628 /* check for % at the end */
631 if (strchr(el, '%') != el+strlen(el)-1)
633 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
640 if (ifscreen->result[0] == '\0')
642 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
647 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
649 if (interface->ifmsn)
651 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
655 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
657 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
659 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
661 static int inter_nodtmf(struct interface *interface, char *filename, int line, char *parameter, char *value)
663 struct interface_port *ifport;
665 /* port in chain ? */
666 if (!interface->ifport)
668 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
671 /* goto end of chain */
672 ifport = interface->ifport;
674 ifport = ifport->next;
678 #warning filter to be done
680 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
688 * structure of parameters
690 struct interface_param interface_param[] = {
691 { "extension", &inter_extension, "",
692 "If keyword is given, calls to interface are handled as internal extensions."},
693 {"tones", &inter_tones, "yes | no",
694 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode interfaces generate tones."},
696 {"earlyb", &inter_earlyb, "yes | no",
697 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode interfaces receive tones."},
699 {"hunt", &inter_hunt, "linear | roundrobin",
700 "Select the algorithm for selecting port with free channel."},
702 {"port", &inter_port, "<number>",
703 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
705 {"block", &inter_block, "",
706 "If keyword is given, calls on this interface are blocked.\n"
707 "This parameter must follow a 'port' parameter."},
709 {"ptp", &inter_ptp, "",
710 "The given port above is opened as point-to-point.\n"
711 "This is required on NT-mode ports that are multipoint by default.\n"
712 "This parameter must follow a 'port' parameter."},
714 {"ptmp", &inter_ptmp, "",
715 "The given port above is opened as point-to-multipoint.\n"
716 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
717 "This parameter must follow a 'port' parameter."},
719 {"channel_out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
720 "Channel selection list for all outgoing calls to the interface.\n"
721 "A free channels is searched in order of appearance.\n"
722 "This parameter must follow a 'port' parameter.\n"
723 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
724 " <number>[,...] - List of channels to search.\n"
725 " free - Select any free channel\n"
726 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
727 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
729 {"channel_in", &inter_channel_in, "[force,][<number>][,...][,free][,any][,no]",
730 "Channel selection list for all incomming calls from the interface.\n"
731 "A free channels is accepted if in the list.\n"
732 "If no channel was requested, the first free channel found is selected.\n"
733 "This parameter must follow a 'port' parameter.\n"
734 " <number>[,...] - List of channels to accept.\n"
735 " free - Accept any free channel"},
737 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
738 "Incomming caller ID is checked against given MSN numbers.\n"
739 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
741 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%%] [options] <new caller ID>[%%]",
742 "Adds an entry for incomming calls to the caller ID screen list.\n"
743 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
744 "If '%%' is given after old caller ID, it matches even if caller ID has\n"
745 "additional digits.\n"
746 "If '%%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
749 " unknown | subsciber | national | international - Change caller ID type.\n"
750 " present | restrict - Change presentation of caller ID."},
752 {"screen-out", &inter_screen_out, "<old caller ID> <new caller ID> [options]",
753 "Adds an entry for outgoing calls to the caller ID screen list.\n"
754 "See 'screen-in' for help."},
756 {"nodtmf", &inter_nodtmf, "",
757 "Disables DTMF detection for this interface.\n"
758 "This parameter must follow a 'port' parameter."},
761 #warning todo: filter, also in the PmISDN object
762 {"filter", &inter_filter, "<filter> [parameters]",
763 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
764 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
765 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
768 {NULL, NULL, NULL, NULL}
773 * read settings from interface.conf
775 char interface_error[256];
776 struct interface *read_interfaces(void)
781 unsigned int line, i;
783 struct interface *interface = NULL, /* in case no interface */
784 **interfacep = &interface_newlist;
787 int expecting = 1; /* expecting new interface */
788 struct interface_param *ifparam;
790 if (interface_newlist != NULL)
792 PERROR("software error, list is not empty.\n");
795 interface_error[0] = '\0';
796 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
798 if (!(fp = fopen(filename,"r")))
800 SPRINT(interface_error, "Cannot open '%s'\n", filename);
805 while((fgets(buffer,sizeof(buffer),fp)))
807 buffer[sizeof(buffer)-1]=0;
808 if (buffer[0]) buffer[strlen(buffer)-1]=0;
812 while(*p <= 32) /* skip spaces */
818 if (*p==0 || *p=='#') /* ignore comments and empty line */
823 i=0; /* read parameter */
826 if (i+1 >= sizeof(parameter))
828 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
831 parameter[i+1] = '\0';
832 parameter[i++] = *p++;
835 while(*p <= 32) /* skip spaces */
842 if (*p!=0 && *p!='#') /* missing name */
844 i=0; /* read until end */
845 while(*p!=0 && *p!='#')
847 if (i+1 >= sizeof(value))
849 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
856 /* remove trailing spaces from value */
859 if (value[i-1]==0 || value[i-1]>32)
866 /* check for interface name as first statement */
867 if (expecting && parameter[0]!='[')
869 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
874 /* check for new interface */
875 if (parameter[0] == '[')
877 if (parameter[strlen(parameter)-1] != ']')
879 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
882 parameter[strlen(parameter)-1] = '\0';
884 /* check if interface name already exists */
885 interface = interface_newlist;
888 if (!strcasecmp(interface->name, parameter+1))
890 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
893 interface = interface->next;
896 /* append interface to new list */
897 interface = (struct interface *)malloc(sizeof(struct interface));
900 SPRINT(interface_error, "No memory!");
904 memset(interface, 0, sizeof(struct interface));
907 SCPY(interface->name, parameter+1);
910 *interfacep = interface;
911 interfacep = &interface->next;
916 ifparam = interface_param;
919 if (!strcasecmp(parameter, ifparam->name))
921 if (ifparam->func(interface, filename, line, parameter, value))
930 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
935 return(interface_newlist);
937 PERROR_RUNTIME("%s", interface_error);
939 free_interfaces(interface_newlist);
940 interface_newlist = NULL;
946 * freeing chain of interfaces
948 void free_interfaces(struct interface *interface)
951 struct interface_port *ifport;
952 struct select_channel *selchannel;
953 struct interface_msn *ifmsn;
954 struct interface_screen *ifscreen;
955 struct interface_filter *iffilter;
959 ifport = interface->ifport;
962 selchannel = ifport->in_channel;
966 selchannel = selchannel->next;
967 memset(temp, 0, sizeof(struct select_channel));
971 selchannel = ifport->out_channel;
975 selchannel = selchannel->next;
976 memset(temp, 0, sizeof(struct select_channel));
981 ifport = ifport->next;
982 memset(temp, 0, sizeof(struct interface_port));
986 ifmsn = interface->ifmsn;
991 memset(temp, 0, sizeof(struct interface_msn));
995 ifscreen = interface->ifscreen_in;
999 ifscreen = ifscreen->next;
1000 memset(temp, 0, sizeof(struct interface_screen));
1004 ifscreen = interface->ifscreen_out;
1008 ifscreen = ifscreen->next;
1009 memset(temp, 0, sizeof(struct interface_screen));
1013 iffilter = interface->iffilter;
1017 iffilter = iffilter->next;
1018 memset(temp, 0, sizeof(struct interface_filter));
1023 interface = interface->next;
1024 memset(temp, 0, sizeof(struct interface));
1032 * all links between mISDNport and interface are made
1033 * unused mISDNports are closed, new mISDNports are opened
1034 * also set default select_channel lists
1036 void relink_interfaces(void)
1038 struct mISDNport *mISDNport;
1039 struct interface *interface;
1040 struct interface_port *ifport;
1042 /* unlink all mISDNports */
1043 mISDNport = mISDNport_first;
1046 mISDNport->ifport = NULL;
1047 mISDNport = mISDNport->next;
1050 /* relink existing mISDNports */
1051 interface = interface_newlist;
1054 ifport = interface->ifport;
1057 mISDNport = mISDNport_first;
1060 if (mISDNport->portnum == ifport->portnum)
1062 ifport->mISDNport = mISDNport;
1063 mISDNport->ifport = ifport;
1065 mISDNport = mISDNport->next;
1067 ifport = ifport->next;
1069 interface = interface->next;
1072 /* close unused mISDNports */
1074 mISDNport = mISDNport_first;
1077 if (mISDNport->ifport == NULL)
1079 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1080 /* remove all port objects and destroy port */
1081 mISDNport_close(mISDNport);
1084 mISDNport = mISDNport->next;
1087 /* open and link new mISDNports */
1088 interface = interface_newlist;
1091 ifport = interface->ifport;
1094 if (!ifport->mISDNport)
1098 ifport = ifport->next;
1100 interface = interface->next;
1109 void load_port(struct interface_port *ifport)
1111 struct mISDNport *mISDNport;
1114 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->interface);
1118 ifport->mISDNport = mISDNport;
1119 mISDNport->ifport = ifport;
1121 /* default channel selection list */
1122 if (!ifport->out_channel)
1123 default_out_channel(ifport);
1124 if (!ifport->in_channel)
1125 default_in_channel(ifport);
1126 /* default is_tones */
1127 if (ifport->interface->is_tones)
1128 ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
1130 ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
1131 /* default is_earlyb */
1132 if (ifport->interface->is_earlyb)
1133 ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
1135 ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
1138 ifport->block = 2; /* not available */
1143 * give summary of interface syntax
1145 void doc_interface(void)
1147 struct interface_param *ifparam;
1149 printf("Syntax overview\n");
1150 printf("---------------\n\n");
1152 printf("[<name>]\n");
1153 ifparam = interface_param;
1154 while(ifparam->name)
1156 printf("%s %s\n", ifparam->name, ifparam->usage);
1160 ifparam = interface_param;
1161 while(ifparam->name)
1163 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1164 printf("%s\n", ifparam->help);