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_tones(struct interface *interface, char *filename, int line, char *parameter, char *value)
191 if (!strcasecmp(value, "yes"))
193 interface->is_tones = IS_YES;
195 if (!strcasecmp(value, "no"))
197 interface->is_tones = IS_NO;
200 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
205 static int inter_earlyb(struct interface *interface, char *filename, int line, char *parameter, char *value)
207 if (!strcasecmp(value, "yes"))
209 interface->is_earlyb = IS_YES;
211 if (!strcasecmp(value, "no"))
213 interface->is_earlyb = IS_NO;
216 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'yes' or 'no'.\n", filename, line, parameter);
221 static int inter_hunt(struct interface *interface, char *filename, int line, char *parameter, char *value)
223 if (!strcasecmp(value, "linear"))
225 interface->hunt = HUNT_LINEAR;
227 if (!strcasecmp(value, "roundrobin"))
229 interface->hunt = HUNT_ROUNDROBIN;
232 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects value 'linear' or 'roundrobin'.\n", filename, line, parameter);
237 static int inter_port(struct interface *interface, char *filename, int line, char *parameter, char *value)
239 struct interface_port *ifport, **ifportp;
240 struct interface *searchif;
243 val = get_number(value);
246 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one numeric value.\n", filename, line, parameter);
249 /* check for port already assigned */
250 searchif = interface_newlist;
253 ifport = searchif->ifport;
256 if (ifport->portnum == val)
258 SPRINT(interface_error, "Error in %s (line %d): port '%d' already used above.\n", filename, line, val);
261 ifport = ifport->next;
263 searchif = searchif->next;
265 /* alloc port substructure */
266 ifport = (struct interface_port *)MALLOC(sizeof(struct interface_port));
268 ifport->interface = interface;
270 ifport->portnum = val;
272 ifportp = &interface->ifport;
274 ifportp = &((*ifportp)->next);
278 static int inter_channel_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
280 struct interface_port *ifport;
281 struct select_channel *selchannel, **selchannelp;
285 /* port in chain ? */
286 if (!interface->ifport)
288 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
291 /* goto end of chain */
292 ifport = interface->ifport;
294 ifport = ifport->next;
299 p = get_seperated(p);
300 if (!strcasecmp(el, "force"))
302 ifport->channel_force = 1;
303 if (ifport->out_channel)
305 SPRINT(interface_error, "Error in %s (line %d): value 'force' may only appear as first element in list.\n", filename, line);
309 if (!strcasecmp(el, "any"))
314 if (!strcasecmp(el, "free"))
319 if (!strcasecmp(el, "no"))
325 val = get_number(el);
328 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);
332 if (val<1 || val==16 || val>126)
334 SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
338 /* add to select-channel list */
339 selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
342 selchannel->channel = val;
344 selchannelp = &ifport->out_channel;
346 selchannelp = &((*selchannelp)->next);
347 *selchannelp = selchannel;
352 static int inter_channel_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
354 struct interface_port *ifport;
355 struct select_channel *selchannel, **selchannelp;
359 /* port in chain ? */
360 if (!interface->ifport)
362 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
365 /* goto end of chain */
366 ifport = interface->ifport;
368 ifport = ifport->next;
373 p = get_seperated(p);
374 if (ifport->in_channel) if (ifport->in_channel->channel == CHANNEL_FREE)
376 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' has values behind 'free' keyword. They has no effect.\n", filename, line, parameter);
379 if (!strcasecmp(el, "free"))
385 val = get_number(el);
388 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects a comma seperated list of channel numbers and 'free'.\n", filename, line, parameter);
392 if (val<1 || val==16 || val>126)
394 SPRINT(interface_error, "Error in %s (line %d): channel '%d' out of range.\n", filename, line, val);
398 /* add to select-channel list */
399 selchannel = (struct select_channel *)MALLOC(sizeof(struct select_channel));
402 selchannel->channel = val;
404 selchannelp = &ifport->in_channel;
406 selchannelp = &((*selchannelp)->next);
407 *selchannelp = selchannel;
412 static int inter_msn(struct interface *interface, char *filename, int line, char *parameter, char *value)
414 struct interface_msn *ifmsn, **ifmsnp;
419 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects one MSN number or a list.\n", filename, line, parameter);
422 if (interface->ifscreen_in)
424 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'screen_in' parameter.\n", filename, line, parameter);
433 p = get_seperated(p);
434 /* add MSN to list */
435 ifmsn = (struct interface_msn *)MALLOC(sizeof(struct interface_msn));
438 SCPY(ifmsn->msn, el);
440 ifmsnp = &interface->ifmsn;
442 ifmsnp = &((*ifmsnp)->next);
447 static int inter_screen(struct interface_screen **ifscreenp, struct interface *interface, char *filename, int line, char *parameter, char *value)
449 struct interface_screen *ifscreen;
454 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID and new caller ID.\n", filename, line, parameter);
459 p = get_seperated(p);
460 /* add screen entry to list*/
461 ifscreen = (struct interface_screen *)MALLOC(sizeof(struct interface_screen));
463 ifscreen->match_type = -1; /* unchecked */
464 ifscreen->match_present = -1; /* unchecked */
465 ifscreen->result_type = -1; /* unchanged */
466 ifscreen->result_present = -1; /* unchanged */
469 ifscreenp = &((*ifscreenp)->next);
470 *ifscreenp = ifscreen;
475 p = get_seperated(p);
476 if (!strcasecmp(el, "unknown"))
478 if (ifscreen->match_type != -1)
481 SPRINT(interface_error, "Error in %s (line %d): number type already set earlier.\n", filename, line, parameter);
484 ifscreen->match_type = INFO_NTYPE_UNKNOWN;
486 if (!strcasecmp(el, "subscriber"))
488 if (ifscreen->match_type != -1)
490 ifscreen->match_type = INFO_NTYPE_SUBSCRIBER;
492 if (!strcasecmp(el, "national"))
494 if (ifscreen->match_type != -1)
496 ifscreen->match_type = INFO_NTYPE_NATIONAL;
498 if (!strcasecmp(el, "international"))
500 if (ifscreen->match_type != -1)
502 ifscreen->match_type = INFO_NTYPE_INTERNATIONAL;
504 if (!strcasecmp(el, "allowed"))
506 if (ifscreen->match_present != -1)
509 SPRINT(interface_error, "Error in %s (line %d): presentation type already set earlier.\n", filename, line);
512 ifscreen->match_present = INFO_PRESENT_ALLOWED;
514 if (!strcasecmp(el, "restricted"))
516 if (ifscreen->match_present != -1)
518 ifscreen->match_present = INFO_PRESENT_RESTRICTED;
520 SCPY(ifscreen->match, el);
521 /* check for % at the end */
524 if (strchr(el, '%') != el+strlen(el)-1)
526 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
533 if (ifscreen->match[0] == '\0')
535 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects old caller ID.\n", filename, line, parameter);
542 p = get_seperated(p);
543 if (!strcasecmp(el, "unknown"))
545 if (ifscreen->result_type != -1)
547 ifscreen->result_type = INFO_NTYPE_UNKNOWN;
549 if (!strcasecmp(el, "subscriber"))
551 if (ifscreen->result_type != -1)
553 ifscreen->result_type = INFO_NTYPE_SUBSCRIBER;
555 if (!strcasecmp(el, "national"))
557 if (ifscreen->result_type != -1)
559 ifscreen->result_type = INFO_NTYPE_NATIONAL;
561 if (!strcasecmp(el, "international"))
563 if (ifscreen->result_type != -1)
565 ifscreen->result_type = INFO_NTYPE_INTERNATIONAL;
567 if (!strcasecmp(el, "allowed"))
569 if (ifscreen->result_present != -1)
571 ifscreen->result_present = INFO_PRESENT_ALLOWED;
573 if (!strcasecmp(el, "restricted"))
575 if (ifscreen->result_present != -1)
577 ifscreen->result_present = INFO_PRESENT_RESTRICTED;
579 SCPY(ifscreen->result, el);
580 /* check for % at the end */
583 if (strchr(el, '%') != el+strlen(el)-1)
585 SPRINT(interface_error, "Error in %s (line %d): %% joker found, but must at the end.\n", filename, line, parameter);
592 if (ifscreen->result[0] == '\0')
594 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects new caller ID.\n", filename, line, parameter);
599 static int inter_screen_in(struct interface *interface, char *filename, int line, char *parameter, char *value)
601 if (interface->ifmsn)
603 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' not allowed with 'msn' parameter.\n", filename, line, parameter);
607 return(inter_screen(&interface->ifscreen_in, interface, filename, line, parameter, value));
609 static int inter_screen_out(struct interface *interface, char *filename, int line, char *parameter, char *value)
611 return(inter_screen(&interface->ifscreen_out, interface, filename, line, parameter, value));
613 static int inter_nodtmf(struct interface *interface, char *filename, int line, char *parameter, char *value)
615 struct interface_port *ifport;
617 /* port in chain ? */
618 if (!interface->ifport)
620 SPRINT(interface_error, "Error in %s (line %d): parameter '%s' expects previous 'port' definition.\n", filename, line, parameter);
623 /* goto end of chain */
624 ifport = interface->ifport;
626 ifport = ifport->next;
630 #warning filter to be done
632 static int inter_filter(struct interface *interface, char *filename, int line, char *parameter, char *value)
640 * structure of parameters
642 struct interface_param interface_param[] = {
643 { "extension", &inter_extension, "",
644 "If keyword is given, calls to interface are handled as internal extensions."},
645 {"tones", &inter_tones, "yes | no",
646 "Interface generates tones during call setup and release, or not.\nBy default only NT-mode ports generate tones."},
648 {"earlyb", &inter_earlyb, "yes | no",
649 "Interface receives and bridges tones during call setup and release, or not.\nBy default only TE-mode ports receive tones."},
651 {"hunt", &inter_hunt, "linear | roundrobin",
652 "Select the algorithm for selecting port with free channel."},
654 {"port", &inter_port, "<number>",
655 "Give exactly one port for this interface.\nTo give multiple ports, add more lines with port parameters."},
657 {"block", &inter_block, "",
658 "If keyword is given, calls on this interface are blocked.\n"
659 "This parameter must follow a 'port' parameter."},
661 {"ptp", &inter_ptp, "",
662 "The given port above is opened as point-to-point.\n"
663 "This is required on NT-mode ports that are multipoint by default.\n"
664 "This parameter must follow a 'port' parameter."},
666 {"ptmp", &inter_ptmp, "",
667 "The given port above is opened as point-to-multipoint.\n"
668 "This is required on PRI NT-mode ports that are point-to-point by default.\n"
669 "This parameter must follow a 'port' parameter."},
671 {"channel-out", &inter_channel_out, "[force,][<number>][,...][,free][,any][,no]",
672 "Channel selection list for all outgoing calls to the interface.\n"
673 "A free channels is searched in order of appearance.\n"
674 "This parameter must follow a 'port' parameter.\n"
675 " force - Forces the selected port with no acceptable alternative (see DSS1).\n"
676 " <number>[,...] - List of channels to search.\n"
677 " free - Select any free channel\n"
678 " any - On outgoing calls, signal 'any channel acceptable'. (see DSS1)\n"
679 " no - Signal 'no channel available' aka 'call waiting'. (see DSS1)"},
681 {"channel-in", &inter_channel_in, "[force,][<number>][,...][,free][,any][,no]",
682 "Channel selection list for all incomming calls from the interface.\n"
683 "A free channels is accepted if in the list.\n"
684 "If any channel was requested, the first free channel found is selected.\n"
685 "This parameter must follow a 'port' parameter.\n"
686 " <number>[,...] - List of channels to accept.\n"
687 " free - Accept any free channel"},
689 {"msn", &inter_msn, "<default MSN>,[<additional MSN>[,...]]",
690 "Incomming caller ID is checked against given MSN numbers.\n"
691 "If the caller ID is not found in this list, it is overwritten by the first MSN"},
693 {"screen-in", &inter_screen_in, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
694 "Adds an entry for incomming calls to the caller ID screen list.\n"
695 "If the given 'old caller ID' matches, it is replaced by the 'new caller ID'\n"
696 "If '%' is given after old caller ID, it matches even if caller ID has\n"
697 "additional digits.\n"
698 "If '%' is given after mew caller ID, additinal digits of the 'old caller ID'\n"
701 " unknown | subsciber | national | international - Change caller ID type.\n"
702 " present | restrict - Change presentation of caller ID."},
704 {"screen-out", &inter_screen_out, "[options] <old caller ID>[%] [options] <new caller ID>[%]",
705 "Adds an entry for outgoing calls to the caller ID screen list.\n"
706 "See 'screen-in' for help."},
708 {"nodtmf", &inter_nodtmf, "",
709 "Disables DTMF detection for this interface.\n"
710 "This parameter must follow a 'port' parameter."},
713 #warning todo: filter, also in the PmISDN object
714 {"filter", &inter_filter, "<filter> [parameters]",
715 "Adds/appends a filter. Filters are ordered in transmit direction.\n"
716 "gain <tx-volume> <rx-volume> - Changes volume (-8 .. 8)\n"
717 "blowfish <key> - Adds encryption. Key must be 4-56 bytes (8-112 hex characters."},
720 {NULL, NULL, NULL, NULL}
725 * read settings from interface.conf
727 char interface_error[256];
728 struct interface *read_interfaces(void)
733 unsigned int line, i;
735 struct interface *interface = NULL, /* in case no interface */
736 **interfacep = &interface_newlist;
739 int expecting = 1; /* expecting new interface */
740 struct interface_param *ifparam;
742 if (interface_newlist != NULL)
743 FATAL("list is not empty.\n");
744 interface_error[0] = '\0';
745 SPRINT(filename, "%s/interface.conf", INSTALL_DATA);
747 if (!(fp = fopen(filename,"r")))
749 SPRINT(interface_error, "Cannot open '%s'\n", filename);
754 while((fgets(buffer,sizeof(buffer),fp)))
756 buffer[sizeof(buffer)-1]=0;
757 if (buffer[0]) buffer[strlen(buffer)-1]=0;
761 while(*p <= 32) /* skip spaces */
767 if (*p==0 || *p=='#') /* ignore comments and empty line */
772 i=0; /* read parameter */
775 if (i+1 >= sizeof(parameter))
777 SPRINT(interface_error, "Error in %s (line %d): parameter name too long.\n",filename,line);
780 parameter[i+1] = '\0';
781 parameter[i++] = *p++;
784 while(*p <= 32) /* skip spaces */
791 if (*p!=0 && *p!='#') /* missing name */
793 i=0; /* read until end */
794 while(*p!=0 && *p!='#')
796 if (i+1 >= sizeof(value))
798 SPRINT(interface_error, "Error in %s (line %d): value too long.\n", filename, line);
805 /* remove trailing spaces from value */
808 if (value[i-1]==0 || value[i-1]>32)
815 /* check for interface name as first statement */
816 if (expecting && parameter[0]!='[')
818 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
823 /* check for new interface */
824 if (parameter[0] == '[')
826 if (parameter[strlen(parameter)-1] != ']')
828 SPRINT(interface_error, "Error in %s (line %d): expecting interface name inside [ and ], but got: '%s'.\n", filename, line, parameter);
831 parameter[strlen(parameter)-1] = '\0';
833 /* check if interface name already exists */
834 interface = interface_newlist;
837 if (!strcasecmp(interface->name, parameter+1))
839 SPRINT(interface_error, "Error in %s (line %d): interface name '%s' already defined above.\n", filename, line, parameter+1);
842 interface = interface->next;
845 /* append interface to new list */
846 interface = (struct interface *)MALLOC(sizeof(struct interface));
850 SCPY(interface->name, parameter+1);
853 *interfacep = interface;
854 interfacep = &interface->next;
859 ifparam = interface_param;
862 if (!strcasecmp(parameter, ifparam->name))
864 if (ifparam->func(interface, filename, line, parameter, value))
873 SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter);
878 return(interface_newlist);
880 PERROR_RUNTIME("%s", interface_error);
882 free_interfaces(interface_newlist);
883 interface_newlist = NULL;
889 * freeing chain of interfaces
891 void free_interfaces(struct interface *interface)
894 struct interface_port *ifport;
895 struct select_channel *selchannel;
896 struct interface_msn *ifmsn;
897 struct interface_screen *ifscreen;
898 struct interface_filter *iffilter;
902 ifport = interface->ifport;
905 selchannel = ifport->in_channel;
909 selchannel = selchannel->next;
910 FREE(temp, sizeof(struct select_channel));
913 selchannel = ifport->out_channel;
917 selchannel = selchannel->next;
918 FREE(temp, sizeof(struct select_channel));
922 ifport = ifport->next;
923 FREE(temp, sizeof(struct interface_port));
926 ifmsn = interface->ifmsn;
931 FREE(temp, sizeof(struct interface_msn));
934 ifscreen = interface->ifscreen_in;
938 ifscreen = ifscreen->next;
939 FREE(temp, sizeof(struct interface_screen));
942 ifscreen = interface->ifscreen_out;
946 ifscreen = ifscreen->next;
947 FREE(temp, sizeof(struct interface_screen));
950 iffilter = interface->iffilter;
954 iffilter = iffilter->next;
955 FREE(temp, sizeof(struct interface_filter));
959 interface = interface->next;
960 FREE(temp, sizeof(struct interface));
966 * defaults of ports if not specified by config
968 static void set_defaults(struct interface_port *ifport)
970 /* default channel selection list */
971 if (!ifport->out_channel)
972 default_out_channel(ifport);
973 if (!ifport->in_channel)
974 default_in_channel(ifport);
975 /* default is_tones */
976 if (ifport->interface->is_tones)
977 ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES);
979 ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0;
980 /* default is_earlyb */
981 if (ifport->interface->is_earlyb)
982 ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES);
984 ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1;
985 /* set locally flag */
986 if (ifport->interface->extension)
987 ifport->mISDNport->locally = 1;
989 ifport->mISDNport->locally = 0;
994 * all links between mISDNport and interface are made
995 * unused mISDNports are closed, new mISDNports are opened
996 * also set default select_channel lists
998 void relink_interfaces(void)
1000 struct mISDNport *mISDNport;
1001 struct interface *interface;
1002 struct interface_port *ifport;
1004 /* unlink all mISDNports */
1005 mISDNport = mISDNport_first;
1008 mISDNport->ifport = NULL;
1009 mISDNport = mISDNport->next;
1012 /* relink existing mISDNports */
1013 interface = interface_newlist;
1016 ifport = interface->ifport;
1019 mISDNport = mISDNport_first;
1022 if (mISDNport->portnum == ifport->portnum)
1024 ifport->mISDNport = mISDNport;
1025 mISDNport->ifport = ifport;
1026 set_defaults(ifport);
1028 mISDNport = mISDNport->next;
1030 ifport = ifport->next;
1032 interface = interface->next;
1035 /* close unused mISDNports */
1037 mISDNport = mISDNport_first;
1040 if (mISDNport->ifport == NULL)
1042 PDEBUG(DEBUG_ISDN, "Port %d is not used anymore and will be closed\n", mISDNport->portnum);
1043 /* remove all port objects and destroy port */
1044 mISDNport_close(mISDNport);
1047 mISDNport = mISDNport->next;
1050 /* open and link new mISDNports */
1051 interface = interface_newlist;
1054 ifport = interface->ifport;
1057 if (!ifport->mISDNport)
1061 ifport = ifport->next;
1063 interface = interface->next;
1072 void load_port(struct interface_port *ifport)
1074 struct mISDNport *mISDNport;
1077 mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->interface);
1081 ifport->mISDNport = mISDNport;
1082 mISDNport->ifport = ifport;
1083 set_defaults(ifport);
1086 ifport->block = 2; /* not available */
1091 * give summary of interface syntax
1093 void doc_interface(void)
1095 struct interface_param *ifparam;
1097 printf("Syntax overview\n");
1098 printf("---------------\n\n");
1100 printf("[<name>]\n");
1101 ifparam = interface_param;
1102 while(ifparam->name)
1104 printf("%s %s\n", ifparam->name, ifparam->usage);
1108 ifparam = interface_param;
1109 while(ifparam->name)
1111 printf("\nParameter: %s %s\n", ifparam->name, ifparam->usage);
1112 printf("%s\n", ifparam->help);