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 {"layer2keep", &inter_layer2keep, "yes | no",
747 "By default, layer 2 is establised and kept up on PTP interfaces.\n"
749 "This parameter must follow a 'port' parameter."},
753 #warning todo: filter, also in the PmISDN object
754 {"filter", &inter_filter, "<filter> [parameters]",
755 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
756 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
757 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
760 {NULL, NULL, NULL, NULL}
765 * read settings from interface.conf
767 char interface_error[256];
768 struct interface *read_interfaces(void)
773 unsigned int line, i;
775 struct interface *interface = NULL, /* in case no interface */
776 **interfacep = &interface_newlist;
779 int expecting = 1; /* expecting new interface */
780 struct interface_param *ifparam;
782 if (interface_newlist != NULL)
783 FATAL("list is not empty.\n");
784 interface_error[0] = '\0';
785 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
787 if (!(fp = fopen(filename,"r")))
789 SPRINT(interface_error, "Cannot open '%s'\n", filename);
794 while((fgets(buffer,sizeof(buffer),fp)))
796 buffer[sizeof(buffer)-1]=0;
797 if (buffer[0]) buffer[strlen(buffer)-1]=0;
801 while(*p <= 32) /* skip spaces */
807 if (*p==0 || *p=='#') /* ignore comments and empty line */
812 i=0; /* read parameter */
815 if (i+1 >= sizeof(parameter))
817 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
820 parameter[i+1] = '\0';
821 parameter[i++] = *p++;
824 while(*p <= 32) /* skip spaces */
831 if (*p!=0 && *p!='#') /* missing name */
833 i=0; /* read until end */
834 while(*p!=0 && *p!='#')
836 if (i+1 >= sizeof(value))
838 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
845 /* remove trailing spaces from value */
848 if (value[i-1]==0 || value[i-1]>32)
855 /* check for interface name as first statement */
856 if (expecting && parameter[0]!='[')
858 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
863 /* check for new interface */
864 if (parameter[0] == '[')
866 if (parameter[strlen(parameter)-1] != ']')
868 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
871 parameter[strlen(parameter)-1] = '\0';
873 /* check if interface name already exists */
874 interface = interface_newlist;
877 if (!strcasecmp(interface->name, parameter+1))
879 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
882 interface = interface->next;
885 /* append interface to new list */
886 interface = (struct interface *)MALLOC(sizeof(struct interface));
890 SCPY(interface->name, parameter+1);
893 *interfacep = interface;
894 interfacep = &interface->next;
899 ifparam = interface_param;
902 if (!strcasecmp(parameter, ifparam->name))
904 if (ifparam->func(interface, filename, line, parameter, value))
913 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
918 return(interface_newlist);
920 PERROR_RUNTIME("%s", interface_error);
922 free_interfaces(interface_newlist);
923 interface_newlist = NULL;
929 * freeing chain of interfaces
931 void free_interfaces(struct interface *interface)
934 struct interface_port *ifport;
935 struct select_channel *selchannel;
936 struct interface_msn *ifmsn;
937 struct interface_screen *ifscreen;
938 struct interface_filter *iffilter;
942 ifport = interface->ifport;
945 selchannel = ifport->in_channel;
949 selchannel = selchannel->next;
950 FREE(temp, sizeof(struct select_channel));
953 selchannel = ifport->out_channel;
957 selchannel = selchannel->next;
958 FREE(temp, sizeof(struct select_channel));
962 ifport = ifport->next;
963 FREE(temp, sizeof(struct interface_port));
966 ifmsn = interface->ifmsn;
971 FREE(temp, sizeof(struct interface_msn));
974 ifscreen = interface->ifscreen_in;
978 ifscreen = ifscreen->next;
979 FREE(temp, sizeof(struct interface_screen));
982 ifscreen = interface->ifscreen_out;
986 ifscreen = ifscreen->next;
987 FREE(temp, sizeof(struct interface_screen));
990 iffilter = interface->iffilter;
994 iffilter = iffilter->next;
995 FREE(temp, sizeof(struct interface_filter));
999 interface = interface->next;
1000 FREE(temp, sizeof(struct interface));
1006 * defaults of ports if not specified by config
1008 static void set_defaults(struct interface_port *ifport)
1010 /* default channel selection list */
1011 if (!ifport->out_channel)
1012 default_out_channel(ifport);
1013 if (!ifport->in_channel)
1014 default_in_channel(ifport);
1015 /* default is_tones */
1016 if (ifport->interface->is_tones)
1017 ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
1019 ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
1020 /* default is_earlyb */
1021 if (ifport->interface->is_earlyb)
1022 ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
1024 ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
1025 /* set locally flag */
1026 if (ifport->interface->extension)
1027 ifport->mISDNport->locally = 1;
1029 ifport->mISDNport->locally = 0;
1034 * all links between mISDNport and interface are made
1035 * unused mISDNports are closed, new mISDNports are opened
1036 * also set default select_channel lists
1038 void relink_interfaces(void)
1040 struct mISDNport *mISDNport;
1041 struct interface *interface;
1042 struct interface_port *ifport;
1044 /* unlink all mISDNports */
1045 mISDNport = mISDNport_first;
1048 mISDNport->ifport = NULL;
1049 mISDNport = mISDNport->next;
1052 /* relink existing mISDNports */
1053 interface = interface_newlist;
1056 ifport = interface->ifport;
1059 mISDNport = mISDNport_first;
1062 if (mISDNport->portnum == ifport->portnum)
1064 ifport->mISDNport = mISDNport;
1065 mISDNport->ifport = ifport;
1066 set_defaults(ifport);
1068 mISDNport = mISDNport->next;
1070 ifport = ifport->next;
1072 interface = interface->next;
1075 /* close unused mISDNports */
1077 mISDNport = mISDNport_first;
1080 if (mISDNport->ifport == NULL)
1082 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1083 /* remove all port objects and destroy port */
1084 mISDNport_close(mISDNport);
1087 mISDNport = mISDNport->next;
1090 /* open and link new mISDNports */
1091 interface = interface_newlist;
1094 ifport = interface->ifport;
1097 if (!ifport->mISDNport)
1101 ifport = ifport->next;
1103 interface = interface->next;
1112 void load_port(struct interface_port *ifport)
1114 struct mISDNport *mISDNport;
1117 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->nt, ifport->interface);
1121 ifport->mISDNport = mISDNport;
1122 mISDNport->ifport = ifport;
1123 set_defaults(ifport);
1126 ifport->block = 2; /* not available */
1131 * give summary of interface syntax
1133 void doc_interface(void)
1135 struct interface_param *ifparam;
1137 printf("Syntax overview\n");
1138 printf("---------------\n\n");
1140 printf("[<name>]\n");
1141 ifparam = interface_param;
1142 while(ifparam->name)
1144 printf("%s %s\n", ifparam->name, ifparam->usage);
1148 ifparam = interface_param;
1149 while(ifparam->name)
1151 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1152 printf("%s\n", ifparam->help);