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));
29 if (ifport->mISDNport->ntmode)
30 selchannel->channel = CHANNEL_FREE;
32 selchannel->channel = CHANNEL_ANY;
34 ifport->out_channel = selchannel;
36 /* additional channel selection for multipoint NT ports */
37 if (!ifport->mISDNport->ptp && ifport->mISDNport->ntmode)
39 selchannelp = &(selchannel->next);
40 selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
42 selchannel->channel = CHANNEL_NO; // call waiting
43 *selchannelp = selchannel;
48 /* set default in_channel */
49 void default_in_channel(struct interface_port *ifport)
51 struct select_channel *selchannel;
53 selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
56 selchannel->channel = CHANNEL_FREE;
58 ifport->in_channel = selchannel;
62 /* parse string for a positive number */
63 static int get_number(char *value)
70 SPRINT(text, "%d", val);
72 if (!strcmp(value, text))
79 /* remove element from buffer
80 * and return pointer to next element in buffer */
81 static char *get_seperated(char *buffer)
85 if (*buffer==',' || *buffer<=32) /* seperate */
88 while((*buffer>'\0' && *buffer<=32) || *buffer==',')
98 * parameter processing
100 static int inter_block(struct interface *interface, char *filename, int line, char *parameter, char *value)
102 struct interface_port *ifport;
104 /* port in chain ? */
105 if (!interface->ifport)
107 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
110 /* goto end of chain */
111 ifport = interface->ifport;
113 ifport = ifport->next;
117 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
123 static int inter_extension(struct interface *interface, char *filename, int line, char *parameter, char *value)
127 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
130 interface->extension = 1;
133 static int inter_ptp(struct interface *interface, char *filename, int line, char *parameter, char *value)
135 struct interface_port *ifport;
137 /* port in chain ? */
138 if (!interface->ifport)
140 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
143 if (interface->ifport->ptmp)
145 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptmp was given.\n", filename, line, parameter);
148 /* goto end of chain */
149 ifport = interface->ifport;
151 ifport = ifport->next;
155 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
161 static int inter_ptmp(struct interface *interface, char *filename, int line, char *parameter, char *value)
163 struct interface_port *ifport;
165 /* port in chain ? */
166 if (!interface->ifport)
168 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
171 if (interface->ifport->ptp)
173 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' previously ptp was given.\n", filename, line, parameter);
176 /* goto end of chain */
177 ifport = interface->ifport;
179 ifport = ifport->next;
183 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
189 static int inter_nt(struct interface *interface, char *filename, int line, char *parameter, char *value)
192 struct interface_port *ifport;
194 /* port in chain ? */
195 if (!interface->ifport)
197 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
200 /* goto end of chain */
201 ifport = interface->ifport;
203 ifport = ifport->next;
207 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects no value.\n", filename, line, parameter);
214 static int inter_tones(struct interface *interface, char *filename, int line, char *parameter, char *value)
216 if (!strcasecmp(value, "yes"))
218 interface->is_tones = IS_YES;
220 if (!strcasecmp(value, "no"))
222 interface->is_tones = IS_NO;
225 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
230 static int inter_earlyb(struct interface *interface, char *filename, int line, char *parameter, char *value)
232 if (!strcasecmp(value, "yes"))
234 interface->is_earlyb = IS_YES;
236 if (!strcasecmp(value, "no"))
238 interface->is_earlyb = IS_NO;
241 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
246 static int inter_hunt(struct interface *interface, char *filename, int line, char *parameter, char *value)
248 if (!strcasecmp(value, "linear"))
250 interface->hunt = HUNT_LINEAR;
252 if (!strcasecmp(value, "roundrobin"))
254 interface->hunt = HUNT_ROUNDROBIN;
257 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'linear' or 'roundrobin'.\n", filename, line, parameter);
262 static int inter_port(struct interface *interface, char *filename, int line, char *parameter, char *value)
264 struct interface_port *ifport, **ifportp;
265 struct interface *searchif;
268 val = get_number(value);
271 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one numeric value.\n", filename, line, parameter);
274 /* check for port already assigned */
275 searchif = interface_newlist;
278 ifport = searchif->ifport;
281 if (ifport->portnum == val)
283 SPRINT(interface_error, "Error in %s (line %d): port '%d' already used above.\n", filename, line, val);
286 ifport = ifport->next;
288 searchif = searchif->next;
290 /* alloc port substructure */
291 ifport = (struct interface_port *)MALLOC(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 selchannel->channel = val;
369 selchannelp = &ifport->out_channel;
371 selchannelp = &((*selchannelp)->next);
372 *selchannelp = selchannel;
377 static int inter_channel_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
379 struct interface_port *ifport;
380 struct select_channel *selchannel, **selchannelp;
384 /* port in chain ? */
385 if (!interface->ifport)
387 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
390 /* goto end of chain */
391 ifport = interface->ifport;
393 ifport = ifport->next;
398 p = get_seperated(p);
399 if (ifport->in_channel) if (ifport->in_channel->channel == CHANNEL_FREE)
401 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has values behind 'free' keyword. They has no effect.\n", filename, line, parameter);
404 if (!strcasecmp(el, "free"))
410 val = get_number(el);
413 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of channel numbers and 'free'.\n", filename, line, parameter);
417 if (val<1 || val==16 || val>126)
419 SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
423 /* add to select-channel list */
424 selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
427 selchannel->channel = val;
429 selchannelp = &ifport->in_channel;
431 selchannelp = &((*selchannelp)->next);
432 *selchannelp = selchannel;
437 static int inter_msn(struct interface *interface, char *filename, int line, char *parameter, char *value)
439 struct interface_msn *ifmsn, **ifmsnp;
444 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one MSN number or a list.\n", filename, line, parameter);
447 if (interface->ifscreen_in)
449 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'screen_in' parameter.\n", filename, line, parameter);
458 p = get_seperated(p);
459 /* add MSN to list */
460 ifmsn = (struct interface_msn *)MALLOC(sizeof(struct interface_msn));
463 SCPY(ifmsn->msn, el);
465 ifmsnp = &interface->ifmsn;
467 ifmsnp = &((*ifmsnp)->next);
472 static int inter_screen(struct interface_screen **ifscreenp, struct interface *interface, char *filename, int line, char *parameter, char *value)
474 struct interface_screen *ifscreen;
479 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID and new caller ID.\n", filename, line, parameter);
484 p = get_seperated(p);
485 /* add screen entry to list*/
486 ifscreen = (struct interface_screen *)MALLOC(sizeof(struct interface_screen));
488 ifscreen->match_type = -1; /* unchecked */
489 ifscreen->match_present = -1; /* unchecked */
490 ifscreen->result_type = -1; /* unchanged */
491 ifscreen->result_present = -1; /* unchanged */
494 ifscreenp = &((*ifscreenp)->next);
495 *ifscreenp = ifscreen;
500 p = get_seperated(p);
501 if (!strcasecmp(el, "unknown"))
503 if (ifscreen->match_type != -1)
506 SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
509 ifscreen->match_type = INFO_NTYPE_UNKNOWN;
511 if (!strcasecmp(el, "subscriber"))
513 if (ifscreen->match_type != -1)
515 ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
517 if (!strcasecmp(el, "national"))
519 if (ifscreen->match_type != -1)
521 ifscreen->match_type = INFO_NTYPE_NATIONAL;
523 if (!strcasecmp(el, "international"))
525 if (ifscreen->match_type != -1)
527 ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
529 if (!strcasecmp(el, "allowed"))
531 if (ifscreen->match_present != -1)
534 SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
537 ifscreen->match_present = INFO_PRESENT_ALLOWED;
539 if (!strcasecmp(el, "restricted"))
541 if (ifscreen->match_present != -1)
543 ifscreen->match_present = INFO_PRESENT_RESTRICTED;
545 SCPY(ifscreen->match, el);
546 /* check for % at the end */
549 if (strchr(el, '%') != el+strlen(el)-1)
551 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
558 if (ifscreen->match[0] == '\0')
560 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
567 p = get_seperated(p);
568 if (!strcasecmp(el, "unknown"))
570 if (ifscreen->result_type != -1)
572 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
574 if (!strcasecmp(el, "subscriber"))
576 if (ifscreen->result_type != -1)
578 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
580 if (!strcasecmp(el, "national"))
582 if (ifscreen->result_type != -1)
584 ifscreen->result_type = INFO_NTYPE_NATIONAL;
586 if (!strcasecmp(el, "international"))
588 if (ifscreen->result_type != -1)
590 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
592 if (!strcasecmp(el, "allowed"))
594 if (ifscreen->result_present != -1)
596 ifscreen->result_present = INFO_PRESENT_ALLOWED;
598 if (!strcasecmp(el, "restricted"))
600 if (ifscreen->result_present != -1)
602 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
604 SCPY(ifscreen->result, el);
605 /* check for % at the end */
608 if (strchr(el, '%') != el+strlen(el)-1)
610 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
617 if (ifscreen->result[0] == '\0')
619 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
624 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
626 if (interface->ifmsn)
628 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
632 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
634 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
636 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
638 static int inter_nodtmf(struct interface *interface, char *filename, int line, char *parameter, char *value)
640 struct interface_port *ifport;
642 /* port in chain ? */
643 if (!interface->ifport)
645 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
648 /* goto end of chain */
649 ifport = interface->ifport;
651 ifport = ifport->next;
655 #warning filter to be done
657 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
665 * structure of parameters
667 struct interface_param interface_param[] = {
668 { "extension", &inter_extension, "",
669 "If keyword is given, calls to interface are handled as internal extensions."},
670 {"tones", &inter_tones, "yes | no",
671 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
673 {"earlyb", &inter_earlyb, "yes | no",
674 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode ports receive tones."},
676 {"hunt", &inter_hunt, "linear | roundrobin",
677 "Select the algorithm for selecting port with free channel."},
679 {"port", &inter_port, "<number>",
680 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
682 {"block", &inter_block, "",
683 "If keyword is given, calls on this interface are blocked.\n"
684 "This parameter must follow a 'port' parameter."},
686 {"ptp", &inter_ptp, "",
687 "The given port above is opened as point-to-point.\n"
688 "This is required on NT-mode ports that are multipoint by default.\n"
689 "This parameter must follow a 'port' parameter."},
691 {"ptmp", &inter_ptmp, "",
692 "The given port above is opened as point-to-multipoint.\n"
693 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
694 "This parameter must follow a 'port' parameter."},
695 {"nt", &inter_nt, "",
696 "The given port above is opened in NT-mode.\n"
698 "This is required on interfaces that support both NT-mode and TE-mode.\n"
700 "This parameter is only required for socket based mISDN driver.\n"
702 "This parameter must follow a 'port' parameter."},
704 {"channel-out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
705 "Channel selection list for all outgoing calls to the interface.\n"
706 "A free channels is searched in order of appearance.\n"
707 "This parameter must follow a 'port' parameter.\n"
708 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
709 " <number>[,...] - List of channels to search.\n"
710 " free - Select any free channel\n"
711 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
712 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
714 {"channel-in", &inter_channel_in, "[<number>][,...][,free]",
715 "Channel selection list for all incomming calls from the interface.\n"
716 "A free channels is accepted if in the list.\n"
717 "If any channel was requested, the first free channel found is selected.\n"
718 "This parameter must follow a 'port' parameter.\n"
719 " <number>[,...] - List of channels to accept.\n"
720 " free - Accept any free channel"},
722 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
723 "Incomming caller ID is checked against given MSN numbers.\n"
724 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
726 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
727 "Adds an entry for incomming calls to the caller ID screen list.\n"
728 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
729 "If '%' is given after old caller ID, it matches even if caller ID has\n"
730 "additional digits.\n"
731 "If '%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
734 " unknown | subsciber | national | international - Change caller ID type.\n"
735 " present | restrict - Change presentation of caller ID."},
737 {"screen-out", &inter_screen_out, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
738 "Adds an entry for outgoing calls to the caller ID screen list.\n"
739 "See 'screen-in' for help."},
741 {"nodtmf", &inter_nodtmf, "",
742 "Disables DTMF detection for this interface.\n"
743 "This parameter must follow a 'port' parameter."},
746 #warning todo: filter, also in the PmISDN object
747 {"filter", &inter_filter, "<filter> [parameters]",
748 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
749 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
750 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
753 {NULL, NULL, NULL, NULL}
758 * read settings from interface.conf
760 char interface_error[256];
761 struct interface *read_interfaces(void)
766 unsigned int line, i;
768 struct interface *interface = NULL, /* in case no interface */
769 **interfacep = &interface_newlist;
772 int expecting = 1; /* expecting new interface */
773 struct interface_param *ifparam;
775 if (interface_newlist != NULL)
776 FATAL("list is not empty.\n");
777 interface_error[0] = '\0';
778 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
780 if (!(fp = fopen(filename,"r")))
782 SPRINT(interface_error, "Cannot open '%s'\n", filename);
787 while((fgets(buffer,sizeof(buffer),fp)))
789 buffer[sizeof(buffer)-1]=0;
790 if (buffer[0]) buffer[strlen(buffer)-1]=0;
794 while(*p <= 32) /* skip spaces */
800 if (*p==0 || *p=='#') /* ignore comments and empty line */
805 i=0; /* read parameter */
808 if (i+1 >= sizeof(parameter))
810 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
813 parameter[i+1] = '\0';
814 parameter[i++] = *p++;
817 while(*p <= 32) /* skip spaces */
824 if (*p!=0 && *p!='#') /* missing name */
826 i=0; /* read until end */
827 while(*p!=0 && *p!='#')
829 if (i+1 >= sizeof(value))
831 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
838 /* remove trailing spaces from value */
841 if (value[i-1]==0 || value[i-1]>32)
848 /* check for interface name as first statement */
849 if (expecting && parameter[0]!='[')
851 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
856 /* check for new interface */
857 if (parameter[0] == '[')
859 if (parameter[strlen(parameter)-1] != ']')
861 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
864 parameter[strlen(parameter)-1] = '\0';
866 /* check if interface name already exists */
867 interface = interface_newlist;
870 if (!strcasecmp(interface->name, parameter+1))
872 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
875 interface = interface->next;
878 /* append interface to new list */
879 interface = (struct interface *)MALLOC(sizeof(struct interface));
883 SCPY(interface->name, parameter+1);
886 *interfacep = interface;
887 interfacep = &interface->next;
892 ifparam = interface_param;
895 if (!strcasecmp(parameter, ifparam->name))
897 if (ifparam->func(interface, filename, line, parameter, value))
906 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
911 return(interface_newlist);
913 PERROR_RUNTIME("%s", interface_error);
915 free_interfaces(interface_newlist);
916 interface_newlist = NULL;
922 * freeing chain of interfaces
924 void free_interfaces(struct interface *interface)
927 struct interface_port *ifport;
928 struct select_channel *selchannel;
929 struct interface_msn *ifmsn;
930 struct interface_screen *ifscreen;
931 struct interface_filter *iffilter;
935 ifport = interface->ifport;
938 selchannel = ifport->in_channel;
942 selchannel = selchannel->next;
943 FREE(temp, sizeof(struct select_channel));
946 selchannel = ifport->out_channel;
950 selchannel = selchannel->next;
951 FREE(temp, sizeof(struct select_channel));
955 ifport = ifport->next;
956 FREE(temp, sizeof(struct interface_port));
959 ifmsn = interface->ifmsn;
964 FREE(temp, sizeof(struct interface_msn));
967 ifscreen = interface->ifscreen_in;
971 ifscreen = ifscreen->next;
972 FREE(temp, sizeof(struct interface_screen));
975 ifscreen = interface->ifscreen_out;
979 ifscreen = ifscreen->next;
980 FREE(temp, sizeof(struct interface_screen));
983 iffilter = interface->iffilter;
987 iffilter = iffilter->next;
988 FREE(temp, sizeof(struct interface_filter));
992 interface = interface->next;
993 FREE(temp, sizeof(struct interface));
999 * defaults of ports if not specified by config
1001 static void set_defaults(struct interface_port *ifport)
1003 /* default channel selection list */
1004 if (!ifport->out_channel)
1005 default_out_channel(ifport);
1006 if (!ifport->in_channel)
1007 default_in_channel(ifport);
1008 /* default is_tones */
1009 if (ifport->interface->is_tones)
1010 ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
1012 ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
1013 /* default is_earlyb */
1014 if (ifport->interface->is_earlyb)
1015 ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
1017 ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
1018 /* set locally flag */
1019 if (ifport->interface->extension)
1020 ifport->mISDNport->locally = 1;
1022 ifport->mISDNport->locally = 0;
1027 * all links between mISDNport and interface are made
1028 * unused mISDNports are closed, new mISDNports are opened
1029 * also set default select_channel lists
1031 void relink_interfaces(void)
1033 struct mISDNport *mISDNport;
1034 struct interface *interface;
1035 struct interface_port *ifport;
1037 /* unlink all mISDNports */
1038 mISDNport = mISDNport_first;
1041 mISDNport->ifport = NULL;
1042 mISDNport = mISDNport->next;
1045 /* relink existing mISDNports */
1046 interface = interface_newlist;
1049 ifport = interface->ifport;
1052 mISDNport = mISDNport_first;
1055 if (mISDNport->portnum == ifport->portnum)
1057 ifport->mISDNport = mISDNport;
1058 mISDNport->ifport = ifport;
1059 set_defaults(ifport);
1061 mISDNport = mISDNport->next;
1063 ifport = ifport->next;
1065 interface = interface->next;
1068 /* close unused mISDNports */
1070 mISDNport = mISDNport_first;
1073 if (mISDNport->ifport == NULL)
1075 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1076 /* remove all port objects and destroy port */
1077 mISDNport_close(mISDNport);
1080 mISDNport = mISDNport->next;
1083 /* open and link new mISDNports */
1084 interface = interface_newlist;
1087 ifport = interface->ifport;
1090 if (!ifport->mISDNport)
1094 ifport = ifport->next;
1096 interface = interface->next;
1105 void load_port(struct interface_port *ifport)
1107 struct mISDNport *mISDNport;
1110 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->nt, ifport->interface);
1114 ifport->mISDNport = mISDNport;
1115 mISDNport->ifport = ifport;
1116 set_defaults(ifport);
1119 ifport->block = 2; /* not available */
1124 * give summary of interface syntax
1126 void doc_interface(void)
1128 struct interface_param *ifparam;
1130 printf("Syntax overview\n");
1131 printf("---------------\n\n");
1133 printf("[<name>]\n");
1134 ifparam = interface_param;
1135 while(ifparam->name)
1137 printf("%s %s\n", ifparam->name, ifparam->usage);
1141 ifparam = interface_param;
1142 while(ifparam->name)
1144 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1145 printf("%s\n", ifparam->help);