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);
482 /* add screen entry to list*/
483 ifscreen = (struct interface_screen *)MALLOC(sizeof(struct interface_screen));
485 ifscreen->match_type = -1; /* unchecked */
486 ifscreen->match_present = -1; /* unchecked */
487 ifscreen->result_type = -1; /* unchanged */
488 ifscreen->result_present = -1; /* unchanged */
491 ifscreenp = &((*ifscreenp)->next);
492 *ifscreenp = ifscreen;
498 p = get_seperated(p);
499 if (!strcasecmp(el, "unknown"))
501 if (ifscreen->match_type != -1)
504 SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
507 ifscreen->match_type = INFO_NTYPE_UNKNOWN;
509 if (!strcasecmp(el, "subscriber"))
511 if (ifscreen->match_type != -1)
513 ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
515 if (!strcasecmp(el, "national"))
517 if (ifscreen->match_type != -1)
519 ifscreen->match_type = INFO_NTYPE_NATIONAL;
521 if (!strcasecmp(el, "international"))
523 if (ifscreen->match_type != -1)
525 ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
527 if (!strcasecmp(el, "allowed"))
529 if (ifscreen->match_present != -1)
532 SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
535 ifscreen->match_present = INFO_PRESENT_ALLOWED;
537 if (!strcasecmp(el, "restricted"))
539 if (ifscreen->match_present != -1)
541 ifscreen->match_present = INFO_PRESENT_RESTRICTED;
543 SCPY(ifscreen->match, el);
544 /* check for % at the end */
547 if (strchr(el, '%') != el+strlen(el)-1)
549 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
556 if (ifscreen->match[0] == '\0')
558 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
565 p = get_seperated(p);
566 if (!strcasecmp(el, "unknown"))
568 if (ifscreen->result_type != -1)
570 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
572 if (!strcasecmp(el, "subscriber"))
574 if (ifscreen->result_type != -1)
576 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
578 if (!strcasecmp(el, "national"))
580 if (ifscreen->result_type != -1)
582 ifscreen->result_type = INFO_NTYPE_NATIONAL;
584 if (!strcasecmp(el, "international"))
586 if (ifscreen->result_type != -1)
588 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
590 if (!strcasecmp(el, "allowed"))
592 if (ifscreen->result_present != -1)
594 ifscreen->result_present = INFO_PRESENT_ALLOWED;
596 if (!strcasecmp(el, "restricted"))
598 if (ifscreen->result_present != -1)
600 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
602 SCPY(ifscreen->result, el);
603 /* check for % at the end */
606 if (strchr(el, '%') != el+strlen(el)-1)
608 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
615 if (ifscreen->result[0] == '\0')
617 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
622 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
624 if (interface->ifmsn)
626 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
630 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
632 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
634 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
636 static int inter_nodtmf(struct interface *interface, char *filename, int line, char *parameter, char *value)
638 struct interface_port *ifport;
640 /* port in chain ? */
641 if (!interface->ifport)
643 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
646 /* goto end of chain */
647 ifport = interface->ifport;
649 ifport = ifport->next;
653 #warning filter to be done
655 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
663 * structure of parameters
665 struct interface_param interface_param[] = {
666 { "extension", &inter_extension, "",
667 "If keyword is given, calls to interface are handled as internal extensions."},
668 {"tones", &inter_tones, "yes | no",
669 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
671 {"earlyb", &inter_earlyb, "yes | no",
672 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode ports receive tones."},
674 {"hunt", &inter_hunt, "linear | roundrobin",
675 "Select the algorithm for selecting port with free channel."},
677 {"port", &inter_port, "<number>",
678 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
680 {"block", &inter_block, "",
681 "If keyword is given, calls on this interface are blocked.\n"
682 "This parameter must follow a 'port' parameter."},
684 {"ptp", &inter_ptp, "",
685 "The given port above is opened as point-to-point.\n"
686 "This is required on NT-mode ports that are multipoint by default.\n"
687 "This parameter must follow a 'port' parameter."},
689 {"ptmp", &inter_ptmp, "",
690 "The given port above is opened as point-to-multipoint.\n"
691 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
692 "This parameter must follow a 'port' parameter."},
693 {"nt", &inter_nt, "",
694 "The given port above is opened in NT-mode.\n"
696 "This is required on interfaces that support both NT-mode and TE-mode.\n"
698 "This parameter is only required for socket based mISDN driver.\n"
700 "This parameter must follow a 'port' parameter."},
702 {"channel-out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
703 "Channel selection list for all outgoing calls to the interface.\n"
704 "A free channels is searched in order of appearance.\n"
705 "This parameter must follow a 'port' parameter.\n"
706 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
707 " <number>[,...] - List of channels to search.\n"
708 " free - Select any free channel\n"
709 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
710 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
712 {"channel-in", &inter_channel_in, "[<number>][,...][,free]",
713 "Channel selection list for all incomming calls from the interface.\n"
714 "A free channels is accepted if in the list.\n"
715 "If any channel was requested, the first free channel found is selected.\n"
716 "This parameter must follow a 'port' parameter.\n"
717 " <number>[,...] - List of channels to accept.\n"
718 " free - Accept any free channel"},
720 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
721 "Incomming caller ID is checked against given MSN numbers.\n"
722 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
724 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
725 "Adds an entry for incomming calls to the caller ID screen list.\n"
726 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
727 "If '%' is given after old caller ID, it matches even if caller ID has\n"
728 "additional digits.\n"
729 "If '%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
732 " unknown | subsciber | national | international - Change caller ID type.\n"
733 " present | restrict - Change presentation of caller ID."},
735 {"screen-out", &inter_screen_out, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
736 "Adds an entry for outgoing calls to the caller ID screen list.\n"
737 "See 'screen-in' for help."},
739 {"nodtmf", &inter_nodtmf, "",
740 "Disables DTMF detection for this interface.\n"
741 "This parameter must follow a 'port' parameter."},
744 {"layer2keep", &inter_layer2keep, "yes | no",
745 "By default, layer 2 is establised and kept up on PTP interfaces.\n"
747 "This parameter must follow a 'port' parameter."},
751 #warning todo: filter, also in the PmISDN object
752 {"filter", &inter_filter, "<filter> [parameters]",
753 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
754 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
755 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
758 {NULL, NULL, NULL, NULL}
763 * read settings from interface.conf
765 char interface_error[256];
766 struct interface *read_interfaces(void)
771 unsigned int line, i;
773 struct interface *interface = NULL, /* in case no interface */
774 **interfacep = &interface_newlist;
777 int expecting = 1; /* expecting new interface */
778 struct interface_param *ifparam;
780 if (interface_newlist != NULL)
781 FATAL("list is not empty.\n");
782 interface_error[0] = '\0';
783 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
785 if (!(fp = fopen(filename,"r")))
787 SPRINT(interface_error, "Cannot open '%s'\n", filename);
792 while((fgets(buffer,sizeof(buffer),fp)))
794 buffer[sizeof(buffer)-1]=0;
795 if (buffer[0]) buffer[strlen(buffer)-1]=0;
799 while(*p <= 32) /* skip spaces */
805 if (*p==0 || *p=='#') /* ignore comments and empty line */
810 i=0; /* read parameter */
813 if (i+1 >= sizeof(parameter))
815 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
818 parameter[i+1] = '\0';
819 parameter[i++] = *p++;
822 while(*p <= 32) /* skip spaces */
829 if (*p!=0 && *p!='#') /* missing name */
831 i=0; /* read until end */
832 while(*p!=0 && *p!='#')
834 if (i+1 >= sizeof(value))
836 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
843 /* remove trailing spaces from value */
846 if (value[i-1]==0 || value[i-1]>32)
853 /* check for interface name as first statement */
854 if (expecting && parameter[0]!='[')
856 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
861 /* check for new interface */
862 if (parameter[0] == '[')
864 if (parameter[strlen(parameter)-1] != ']')
866 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
869 parameter[strlen(parameter)-1] = '\0';
871 /* check if interface name already exists */
872 interface = interface_newlist;
875 if (!strcasecmp(interface->name, parameter+1))
877 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
880 interface = interface->next;
883 /* append interface to new list */
884 interface = (struct interface *)MALLOC(sizeof(struct interface));
888 SCPY(interface->name, parameter+1);
891 *interfacep = interface;
892 interfacep = &interface->next;
897 ifparam = interface_param;
900 if (!strcasecmp(parameter, ifparam->name))
902 if (ifparam->func(interface, filename, line, parameter, value))
911 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
916 return(interface_newlist);
918 PERROR_RUNTIME("%s", interface_error);
920 free_interfaces(interface_newlist);
921 interface_newlist = NULL;
927 * freeing chain of interfaces
929 void free_interfaces(struct interface *interface)
932 struct interface_port *ifport;
933 struct select_channel *selchannel;
934 struct interface_msn *ifmsn;
935 struct interface_screen *ifscreen;
936 struct interface_filter *iffilter;
940 ifport = interface->ifport;
943 selchannel = ifport->in_channel;
947 selchannel = selchannel->next;
948 FREE(temp, sizeof(struct select_channel));
951 selchannel = ifport->out_channel;
955 selchannel = selchannel->next;
956 FREE(temp, sizeof(struct select_channel));
960 ifport = ifport->next;
961 FREE(temp, sizeof(struct interface_port));
964 ifmsn = interface->ifmsn;
969 FREE(temp, sizeof(struct interface_msn));
972 ifscreen = interface->ifscreen_in;
976 ifscreen = ifscreen->next;
977 FREE(temp, sizeof(struct interface_screen));
980 ifscreen = interface->ifscreen_out;
984 ifscreen = ifscreen->next;
985 FREE(temp, sizeof(struct interface_screen));
988 iffilter = interface->iffilter;
992 iffilter = iffilter->next;
993 FREE(temp, sizeof(struct interface_filter));
997 interface = interface->next;
998 FREE(temp, sizeof(struct interface));
1004 * defaults of ports if not specified by config
1006 static void set_defaults(struct interface_port *ifport)
1008 /* default channel selection list */
1009 if (!ifport->out_channel)
1010 default_out_channel(ifport);
1011 if (!ifport->in_channel)
1012 default_in_channel(ifport);
1013 /* default is_tones */
1014 if (ifport->interface->is_tones)
1015 ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
1017 ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
1018 /* default is_earlyb */
1019 if (ifport->interface->is_earlyb)
1020 ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
1022 ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
1023 /* set locally flag */
1024 if (ifport->interface->extension)
1025 ifport->mISDNport->locally = 1;
1027 ifport->mISDNport->locally = 0;
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;
1064 set_defaults(ifport);
1066 mISDNport = mISDNport->next;
1068 ifport = ifport->next;
1070 interface = interface->next;
1073 /* close unused mISDNports */
1075 mISDNport = mISDNport_first;
1078 if (mISDNport->ifport == NULL)
1080 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1081 /* remove all port objects and destroy port */
1082 mISDNport_close(mISDNport);
1085 mISDNport = mISDNport->next;
1088 /* open and link new mISDNports */
1089 interface = interface_newlist;
1092 ifport = interface->ifport;
1095 if (!ifport->mISDNport)
1099 ifport = ifport->next;
1101 interface = interface->next;
1110 void load_port(struct interface_port *ifport)
1112 struct mISDNport *mISDNport;
1115 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->nt, ifport->interface);
1119 ifport->mISDNport = mISDNport;
1120 mISDNport->ifport = ifport;
1121 set_defaults(ifport);
1124 ifport->block = 2; /* not available */
1129 * give summary of interface syntax
1131 void doc_interface(void)
1133 struct interface_param *ifparam;
1135 printf("Syntax overview\n");
1136 printf("---------------\n\n");
1138 printf("[<name>]\n");
1139 ifparam = interface_param;
1140 while(ifparam->name)
1142 printf("%s %s\n", ifparam->name, ifparam->usage);
1146 ifparam = interface_param;
1147 while(ifparam->name)
1149 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1150 printf("%s\n", ifparam->help);