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;
493 // printf("interface=%s\n", interface->name);
499 p = get_seperated(p);
500 if (!strcasecmp(el, "unknown"))
502 if (ifscreen->match_type != -1)
505 SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
508 ifscreen->match_type = INFO_NTYPE_UNKNOWN;
510 if (!strcasecmp(el, "subscriber"))
512 if (ifscreen->match_type != -1)
514 ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
516 if (!strcasecmp(el, "national"))
518 if (ifscreen->match_type != -1)
520 ifscreen->match_type = INFO_NTYPE_NATIONAL;
522 if (!strcasecmp(el, "international"))
524 if (ifscreen->match_type != -1)
526 ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
528 if (!strcasecmp(el, "allowed"))
530 if (ifscreen->match_present != -1)
533 SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
536 ifscreen->match_present = INFO_PRESENT_ALLOWED;
538 if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted"))
540 if (ifscreen->match_present != -1)
542 ifscreen->match_present = INFO_PRESENT_RESTRICTED;
544 SCPY(ifscreen->match, el);
545 /* check for % at the end */
548 if (strchr(el, '%') != el+strlen(el)-1)
550 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
557 if (ifscreen->match[0] == '\0')
559 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
566 p = get_seperated(p);
567 if (!strcasecmp(el, "unknown"))
569 if (ifscreen->result_type != -1)
571 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
573 if (!strcasecmp(el, "subscriber"))
575 if (ifscreen->result_type != -1)
577 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
579 if (!strcasecmp(el, "national"))
581 if (ifscreen->result_type != -1)
583 ifscreen->result_type = INFO_NTYPE_NATIONAL;
585 if (!strcasecmp(el, "international"))
587 if (ifscreen->result_type != -1)
589 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
591 if (!strcasecmp(el, "allowed"))
593 if (ifscreen->result_present != -1)
595 ifscreen->result_present = INFO_PRESENT_ALLOWED;
597 if (!strcasecmp(el, "restrict") || !strcasecmp(el, "restricted"))
599 if (ifscreen->result_present != -1)
601 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
603 SCPY(ifscreen->result, el);
604 /* check for % at the end */
607 if (strchr(el, '%') != el+strlen(el)-1)
609 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
616 if (ifscreen->result[0] == '\0')
618 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
623 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
625 if (interface->ifmsn)
627 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
631 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
633 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
635 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
637 static int inter_nodtmf(struct interface *interface, char *filename, int line, char *parameter, char *value)
639 struct interface_port *ifport;
641 /* port in chain ? */
642 if (!interface->ifport)
644 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
647 /* goto end of chain */
648 ifport = interface->ifport;
650 ifport = ifport->next;
654 #warning filter to be done
656 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
664 * structure of parameters
666 struct interface_param interface_param[] = {
667 { "extension", &inter_extension, "",
668 "If keyword is given, calls to interface are handled as internal extensions."},
669 {"tones", &inter_tones, "yes | no",
670 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
672 {"earlyb", &inter_earlyb, "yes | no",
673 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode ports receive tones."},
675 {"hunt", &inter_hunt, "linear | roundrobin",
676 "Select the algorithm for selecting port with free channel."},
678 {"port", &inter_port, "<number>",
679 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
681 {"block", &inter_block, "",
682 "If keyword is given, calls on this interface are blocked.\n"
683 "This parameter must follow a 'port' parameter."},
685 {"ptp", &inter_ptp, "",
686 "The given port above is opened as point-to-point.\n"
687 "This is required on NT-mode ports that are multipoint by default.\n"
688 "This parameter must follow a 'port' parameter."},
690 {"ptmp", &inter_ptmp, "",
691 "The given port above is opened as point-to-multipoint.\n"
692 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
693 "This parameter must follow a 'port' parameter."},
694 {"nt", &inter_nt, "",
695 "The given port above is opened in NT-mode.\n"
697 "This is required on interfaces that support both NT-mode and TE-mode.\n"
699 "This parameter is only required for socket based mISDN driver.\n"
701 "This parameter must follow a 'port' parameter."},
703 {"channel-out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
704 "Channel selection list for all outgoing calls to the interface.\n"
705 "A free channels is searched in order of appearance.\n"
706 "This parameter must follow a 'port' parameter.\n"
707 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
708 " <number>[,...] - List of channels to search.\n"
709 " free - Select any free channel\n"
710 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
711 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
713 {"channel-in", &inter_channel_in, "[<number>][,...][,free]",
714 "Channel selection list for all incomming calls from the interface.\n"
715 "A free channels is accepted if in the list.\n"
716 "If any channel was requested, the first free channel found is selected.\n"
717 "This parameter must follow a 'port' parameter.\n"
718 " <number>[,...] - List of channels to accept.\n"
719 " free - Accept any free channel"},
721 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
722 "Incomming caller ID is checked against given MSN numbers.\n"
723 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
725 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
726 "Adds an entry for incomming calls to the caller ID screen list.\n"
727 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
728 "If '%' is given after old caller ID, it matches even if caller ID has\n"
729 "additional digits.\n"
730 "If '%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
733 " unknown | subsciber | national | international - Change caller ID type.\n"
734 " present | restrict - Change presentation of caller ID."},
736 {"screen-out", &inter_screen_out, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
737 "Adds an entry for outgoing calls to the caller ID screen list.\n"
738 "See 'screen-in' for help."},
740 {"nodtmf", &inter_nodtmf, "",
741 "Disables DTMF detection for this interface.\n"
742 "This parameter must follow a 'port' parameter."},
745 {"layer2keep", &inter_layer2keep, "yes | no",
746 "By default, layer 2 is establised and kept up on PTP interfaces.\n"
748 "This parameter must follow a 'port' parameter."},
752 #warning todo: filter, also in the PmISDN object
753 {"filter", &inter_filter, "<filter> [parameters]",
754 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
755 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
756 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
759 {NULL, NULL, NULL, NULL}
764 * read settings from interface.conf
766 char interface_error[256];
767 struct interface *read_interfaces(void)
772 unsigned int line, i;
774 struct interface *interface = NULL, /* in case no interface */
775 **interfacep = &interface_newlist;
778 int expecting = 1; /* expecting new interface */
779 struct interface_param *ifparam;
781 if (interface_newlist != NULL)
782 FATAL("list is not empty.\n");
783 interface_error[0] = '\0';
784 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
786 if (!(fp = fopen(filename,"r")))
788 SPRINT(interface_error, "Cannot open '%s'\n", filename);
793 while((fgets(buffer,sizeof(buffer),fp)))
795 buffer[sizeof(buffer)-1]=0;
796 if (buffer[0]) buffer[strlen(buffer)-1]=0;
800 while(*p <= 32) /* skip spaces */
806 if (*p==0 || *p=='#') /* ignore comments and empty line */
811 i=0; /* read parameter */
814 if (i+1 >= sizeof(parameter))
816 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
819 parameter[i+1] = '\0';
820 parameter[i++] = *p++;
823 while(*p <= 32) /* skip spaces */
830 if (*p!=0 && *p!='#') /* missing name */
832 i=0; /* read until end */
833 while(*p!=0 && *p!='#')
835 if (i+1 >= sizeof(value))
837 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
844 /* remove trailing spaces from value */
847 if (value[i-1]==0 || value[i-1]>32)
854 /* check for interface name as first statement */
855 if (expecting && parameter[0]!='[')
857 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
862 /* check for new interface */
863 if (parameter[0] == '[')
865 if (parameter[strlen(parameter)-1] != ']')
867 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
870 parameter[strlen(parameter)-1] = '\0';
872 /* check if interface name already exists */
873 interface = interface_newlist;
876 if (!strcasecmp(interface->name, parameter+1))
878 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
881 interface = interface->next;
884 /* append interface to new list */
885 interface = (struct interface *)MALLOC(sizeof(struct interface));
889 SCPY(interface->name, parameter+1);
892 *interfacep = interface;
893 interfacep = &interface->next;
898 ifparam = interface_param;
901 if (!strcasecmp(parameter, ifparam->name))
903 if (ifparam->func(interface, filename, line, parameter, value))
912 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
917 return(interface_newlist);
919 PERROR_RUNTIME("%s", interface_error);
921 free_interfaces(interface_newlist);
922 interface_newlist = NULL;
928 * freeing chain of interfaces
930 void free_interfaces(struct interface *interface)
933 struct interface_port *ifport;
934 struct select_channel *selchannel;
935 struct interface_msn *ifmsn;
936 struct interface_screen *ifscreen;
937 struct interface_filter *iffilter;
941 ifport = interface->ifport;
944 selchannel = ifport->in_channel;
948 selchannel = selchannel->next;
949 FREE(temp, sizeof(struct select_channel));
952 selchannel = ifport->out_channel;
956 selchannel = selchannel->next;
957 FREE(temp, sizeof(struct select_channel));
961 ifport = ifport->next;
962 FREE(temp, sizeof(struct interface_port));
965 ifmsn = interface->ifmsn;
970 FREE(temp, sizeof(struct interface_msn));
973 ifscreen = interface->ifscreen_in;
977 ifscreen = ifscreen->next;
978 FREE(temp, sizeof(struct interface_screen));
981 ifscreen = interface->ifscreen_out;
985 ifscreen = ifscreen->next;
986 FREE(temp, sizeof(struct interface_screen));
989 iffilter = interface->iffilter;
993 iffilter = iffilter->next;
994 FREE(temp, sizeof(struct interface_filter));
998 interface = interface->next;
999 FREE(temp, sizeof(struct interface));
1005 * defaults of ports if not specified by config
1007 static void set_defaults(struct interface_port *ifport)
1009 /* default channel selection list */
1010 if (!ifport->out_channel)
1011 default_out_channel(ifport);
1012 if (!ifport->in_channel)
1013 default_in_channel(ifport);
1014 /* default is_tones */
1015 if (ifport->interface->is_tones)
1016 ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
1018 ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
1019 /* default is_earlyb */
1020 if (ifport->interface->is_earlyb)
1021 ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
1023 ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
1024 /* set locally flag */
1025 if (ifport->interface->extension)
1026 ifport->mISDNport->locally = 1;
1028 ifport->mISDNport->locally = 0;
1033 * all links between mISDNport and interface are made
1034 * unused mISDNports are closed, new mISDNports are opened
1035 * also set default select_channel lists
1037 void relink_interfaces(void)
1039 struct mISDNport *mISDNport;
1040 struct interface *interface;
1041 struct interface_port *ifport;
1043 /* unlink all mISDNports */
1044 mISDNport = mISDNport_first;
1047 mISDNport->ifport = NULL;
1048 mISDNport = mISDNport->next;
1051 /* relink existing mISDNports */
1052 interface = interface_newlist;
1055 ifport = interface->ifport;
1058 mISDNport = mISDNport_first;
1061 if (mISDNport->portnum == ifport->portnum)
1063 ifport->mISDNport = mISDNport;
1064 mISDNport->ifport = ifport;
1065 set_defaults(ifport);
1067 mISDNport = mISDNport->next;
1069 ifport = ifport->next;
1071 interface = interface->next;
1074 /* close unused mISDNports */
1076 mISDNport = mISDNport_first;
1079 if (mISDNport->ifport == NULL)
1081 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1082 /* remove all port objects and destroy port */
1083 mISDNport_close(mISDNport);
1086 mISDNport = mISDNport->next;
1089 /* open and link new mISDNports */
1090 interface = interface_newlist;
1093 ifport = interface->ifport;
1096 if (!ifport->mISDNport)
1100 ifport = ifport->next;
1102 interface = interface->next;
1111 void load_port(struct interface_port *ifport)
1113 struct mISDNport *mISDNport;
1116 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->nt, ifport->interface);
1120 ifport->mISDNport = mISDNport;
1121 mISDNport->ifport = ifport;
1122 set_defaults(ifport);
1125 ifport->block = 2; /* not available */
1130 * give summary of interface syntax
1132 void doc_interface(void)
1134 struct interface_param *ifparam;
1136 printf("Syntax overview\n");
1137 printf("---------------\n\n");
1139 printf("[<name>]\n");
1140 ifparam = interface_param;
1141 while(ifparam->name)
1143 printf("%s %s\n", ifparam->name, ifparam->usage);
1147 ifparam = interface_param;
1148 while(ifparam->name)
1150 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1151 printf("%s\n", ifparam->help);
1158 * out==0: incomming caller id, out==1: outgoing caller id
1160 void do_screen(int out, char *id, int idsize, int *type, int *present, struct interface *interface)
1163 struct interface_msn *ifmsn;
1164 struct interface_screen *ifscreen;
1167 /* screen incoming caller id */
1170 /* check for MSN numbers, use first MSN if no match */
1172 ifmsn = interface->ifmsn;
1177 if (!strcmp(ifmsn->msn, id))
1181 ifmsn = ifmsn->next;
1185 start_trace(0, interface, numberrize_callerinfo(id, *type), NULL, DIRECTION_IN, 0, 0, "SCREEN (fount in MSN list)");
1186 add_trace("msn", NULL, "%s", id);
1189 if (!ifmsn && msn1) // not in list, first msn given
1191 start_trace(0, interface, numberrize_callerinfo(id, *type), NULL, DIRECTION_IN, 0, 0, "SCREEN (not fount in MSN list)");
1192 add_trace("msn", "given", "%s", id);
1193 add_trace("msn", "used", "%s", msn1);
1195 UNCPY(id, msn1, idsize);
1196 id[idsize-1] = '\0';
1200 /* check screen list */
1202 ifscreen = interface->ifscreen_out;
1204 ifscreen = interface->ifscreen_in;
1207 if (ifscreen->match_type==-1 || ifscreen->match_type==*type)
1208 if (ifscreen->match_present==-1 || ifscreen->match_present==*present)
1210 if (strchr(ifscreen->match,'%'))
1212 if (!strncmp(ifscreen->match, id, strchr(ifscreen->match,'%')-ifscreen->match))
1216 if (!strcmp(ifscreen->match, id))
1220 ifscreen = ifscreen->next;
1222 if (ifscreen) // match
1224 start_trace(0, interface, numberrize_callerinfo(id, *type), NULL, out?DIRECTION_OUT:DIRECTION_IN, 0, 0, "SCREEN (fount in screen list)");
1227 case INFO_NTYPE_UNKNOWN:
1228 add_trace("given", "type", "unknown");
1230 case INFO_NTYPE_SUBSCRIBER:
1231 add_trace("given", "type", "subscriber");
1233 case INFO_NTYPE_NATIONAL:
1234 add_trace("given", "type", "national");
1236 case INFO_NTYPE_INTERNATIONAL:
1237 add_trace("given", "type", "international");
1242 case INFO_PRESENT_ALLOWED:
1243 add_trace("given", "present", "allowed");
1245 case INFO_PRESENT_RESTRICTED:
1246 add_trace("given", "present", "restricted");
1248 case INFO_PRESENT_NOTAVAIL:
1249 add_trace("given", "present", "not available");
1252 add_trace("given", "id", "%s", id[0]?id:"<empty>");
1253 if (ifscreen->result_type != -1)
1255 *type = ifscreen->result_type;
1258 case INFO_NTYPE_UNKNOWN:
1259 add_trace("used", "type", "unknown");
1261 case INFO_NTYPE_SUBSCRIBER:
1262 add_trace("used", "type", "subscriber");
1264 case INFO_NTYPE_NATIONAL:
1265 add_trace("used", "type", "national");
1267 case INFO_NTYPE_INTERNATIONAL:
1268 add_trace("used", "type", "international");
1272 if (ifscreen->result_present != -1)
1274 *present = ifscreen->result_present;
1277 case INFO_PRESENT_ALLOWED:
1278 add_trace("used", "present", "allowed");
1280 case INFO_PRESENT_RESTRICTED:
1281 add_trace("used", "present", "restricted");
1283 case INFO_PRESENT_NOTAVAIL:
1284 add_trace("used", "present", "not available");
1288 if (strchr(ifscreen->match,'%'))
1290 SCPY(suffix, strchr(ifscreen->match,'%') - ifscreen->match + id);
1291 UNCPY(id, ifscreen->result, idsize);
1292 id[idsize-1] = '\0';
1295 *strchr(id,'%') = '\0';
1296 UNCAT(id, suffix, idsize);
1297 id[idsize-1] = '\0';
1301 UNCPY(id, ifscreen->result, idsize);
1302 id[idsize-1] = '\0';
1304 add_trace("used", "id", "%s", id[0]?id:"<empty>");