From: Super User Date: Sat, 7 Jul 2007 15:13:20 +0000 (+0200) Subject: backup X-Git-Url: http://git.eversberg.eu/gitweb.cgi?p=lcr.git;a=commitdiff_plain;h=3754d8f73ff7cb55e204f7ede6569028407a00e5 backup compiles, runs, but not enough debugged --- diff --git a/Makefile b/Makefile index bf0d7c2..420653d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ #*****************************************************************************\ #* ** -#* PBX4Linux ** +#* Linux Call Router ** #* ** #*---------------------------------------------------------------------------** #* Copyright: Andreas Eversberg ** @@ -14,13 +14,13 @@ WITH-CRYPTO = 42 # comment this out, if no libcrypto should be used # select location to install INSTALL_BIN = /usr/local/bin -INSTALL_DATA = /usr/local/pbx +INSTALL_DATA = /usr/local/lcr # give locations for the libraries LINUX_INCLUDE = -I/usr/src/linux/include # give location of the mISDN libraries -MISDNUSER_INCLUDE = -I../mISDNuser/include +MISDNUSER_INCLUDE = -I../mISDNuser/include -I../mISDNuser/i4lnet MISDNUSER_LIB = -L../mISDNuser/lib -L../mISDNuser/i4lnet LIBS += -lisdnnet -lmISDN -lpthread @@ -30,9 +30,9 @@ CURSES = -lncurses CC = g++ LD = $(CC) WIZZARD = ./wizzard -PBX = ./pbx -PBXADMIN = ./pbxadmin -PBXWATCH = ./pbxwatch +LCR = ./lcr +LCRADMIN = ./lcradmin +LCRWATCH = ./lcrwatch GEN = ./gentones GENW = ./genwave GENRC = ./genrc @@ -55,14 +55,14 @@ endif # @echo Please report any bug. To compile use \"make beta\". # @exit -all: $(PBXADMIN) $(PBX) $(GEN) $(GENW) $(GENRC) $(GENEXT) +all: $(LCR) $(LCRADMIN) $(GEN) $(GENW) $(GENRC) $(GENEXT) @sh -c 'grep -n strcpy *.c* ; if test $$''? = 0 ; then echo "dont use strcpy, use makro instead." ; exit -1 ; fi' @sh -c 'grep -n strncpy *.c* ; if test $$''? = 0 ; then echo "dont use strncpy, use makro instead." ; exit -1 ; fi' @sh -c 'grep -n strcat *.c* ; if test $$''? = 0 ; then echo "dont use strcat, use makro instead." ; exit -1 ; fi' @sh -c 'grep -n strncat *.c* ; if test $$''? = 0 ; then echo "dont use strncat, use makro instead." ; exit -1 ; fi' @sh -c 'grep -n sprintf *.c* ; if test $$''? = 0 ; then echo "dont use sprintf, use makro instead." ; exit -1 ; fi' @sh -c 'grep -n snprintf *.c* ; if test $$''? = 0 ; then echo "dont use snprintf, use makro instead." ; exit -1 ; fi' - @echo "All PBX binaries done" + @echo "All LCR binaries done" @sync @exit @@ -93,21 +93,6 @@ mISDN.o: mISDN.cpp *.h Makefile dss1.o: dss1.cpp ie.cpp *.h Makefile $(CC) -c $(CFLAGS) dss1.cpp -o dss1.o -opal.o: opal.cpp *.h Makefile - $(CC) -c $(CFLAGS) opal.cpp -o opal.o - -opal_mgr.o: opal_mgr.cpp *.h Makefile - $(CC) -c $(CFLAGS) opal_mgr.cpp -o opal_mgr.o - -opal_pbxep.o: opal_pbxep.cpp *.h Makefile - $(CC) -c $(CFLAGS) opal_pbxep.cpp -o opal_pbxep.o - -opal_pbxcon.o: opal_pbxcon.cpp *.h Makefile - $(CC) -c $(CFLAGS) opal_pbxcon.cpp -o opal_pbxcon.o - -opal_pbxms.o: opal_pbxms.cpp *.h Makefile - $(CC) -c $(CFLAGS) opal_pbxms.cpp -o opal_pbxms.o - #knock.o: knock.cpp *.h Makefile # $(CC) -c $(CFLAGS) knock.cpp -o knock.o # @@ -173,7 +158,7 @@ trace.o: trace.c *.h Makefile # $(CC) $(LIBDIR) $(CFLAGS) -lm wizzard.c \ # -o $(WIZZARD) -$(PBX): main.o \ +$(LCR): main.o \ options.o \ interface.o \ extension.o \ @@ -226,15 +211,15 @@ $(PBX): main.o \ callchan.o \ admin_server.o \ trace.o \ - $(LIBS) -o $(PBX) + $(LIBS) -o $(LCR) -$(PBXADMIN): admin_client.c cause.c *.h Makefile +$(LCRADMIN): admin_client.c cause.c *.h Makefile $(CC) $(LIBDIR) $(CFLAGS) $(CURSES) -lm admin_client.c cause.c \ - -o $(PBXADMIN) + -o $(LCRADMIN) -$(PBXWATCH): watch.c *.h Makefile +$(LCRWATCH): watch.c *.h Makefile $(CC) $(LIBDIR) $(CFLAGS) -lm watch.c \ - -o $(PBXWATCH) + -o $(LCRWATCH) $(GEN): gentones.c *.h Makefile $(CC) $(LIBDIR) $(CFLAGS) -lm gentones.c \ @@ -257,10 +242,10 @@ $(GENEXT): options.o extension.o genext.o # @exit install: - -killall -9 -w -q pbx # the following error must be ignored - cp $(PBX) $(INSTALL_BIN) - cp $(PBXADMIN) $(INSTALL_BIN) -# cp $(PBXWATCH) $(INSTALL_BIN) + -killall -9 -w -q lcr # the following error must be ignored + cp $(LCR) $(INSTALL_BIN) + cp $(LCRADMIN) $(INSTALL_BIN) +# cp $(LCRWATCH) $(INSTALL_BIN) cp $(GEN) $(INSTALL_BIN) cp $(GENW) $(INSTALL_BIN) cp $(GENRC) $(INSTALL_BIN) @@ -291,7 +276,7 @@ install: clean: touch * - rm -f $(PBX) $(PBXADMIN) $(PBXWATCH) $(GEN) $(GENW) $(GENRC) $(GENEXT) + rm -f $(LCR) $(LCRADMIN) $(LCRWATCH) $(GEN) $(GENW) $(GENRC) $(GENEXT) rm -f *.o rm -f .*.c.sw* .*.cpp.sw* .*.h.sw* rm -f bla nohup.out @@ -299,22 +284,22 @@ clean: tar: make clean - cd .. && tar -cvzf pbx4linux_`date +%Y%m%d`.tar.gz pbx4linux + cd .. && tar -cvzf lcr_`date +%Y%m%d`.tar.gz lcr -start: $(PBX) +start: $(LCR) sync - -killall -9 -w -q pbx # the following error must be ignored - $(PBX) start + -killall -9 -w -q lcr # the following error must be ignored + $(LCR) start -s: $(PBX) +s: $(LCR) sync - -killall -9 -w -q pbx # the following error must be ignored - $(PBX) start + -killall -9 -w -q lcr # the following error must be ignored + $(LCR) start -fork: $(PBX) +fork: $(LCR) sync - -killall -9 -w -q pbx # the following error must be ignored - $(PBX) fork + -killall -9 -w -q lcr # the following error must be ignored + $(LCR) fork diff --git a/action.cpp b/action.cpp index 20a8c54..b77d937 100644 --- a/action.cpp +++ b/action.cpp @@ -133,12 +133,12 @@ void EndpointAppPBX::action_dialing_internal(void) memcpy(&callerinfo, &e_callerinfo, sizeof(callerinfo)); memcpy(&redirinfo, &e_redirinfo, sizeof(redirinfo)); memset(&dialinginfo, 0, sizeof(dialinginfo)); - dialinginfo.itype = INFO_ITYPE_INTERN; - SCPY(dialinginfo.number, e_dialinginfo.number); + dialinginfo.itype = INFO_ITYPE_ISDN_EXTENSION; + SCPY(dialinginfo.id, e_dialinginfo.id); /* process extension */ if ((rparam = routeparam(e_action, PARAM_EXTENSION))) - SCPY(dialinginfo.number, rparam->string_value); + SCPY(dialinginfo.id, rparam->string_value); /* process number type */ if ((rparam = routeparam(e_action, PARAM_TYPE))) @@ -179,10 +179,10 @@ void EndpointAppPBX::action_dialing_internal(void) } /* check if extension exists AND only if not multiple extensions */ - if (!read_extension(&ext, dialinginfo.number) && !strchr(dialinginfo.number,',')) + if (!read_extension(&ext, dialinginfo.id) && !strchr(dialinginfo.id,',')) { trace_header("ACTION extension (extension doesn't exist)", DIRECTION_NONE); - add_trace("extension", NULL, dialinginfo.number); + add_trace("extension", NULL, dialinginfo.id); end_trace(); new_state(EPOINT_STATE_OUT_DISCONNECT); message_disconnect_port(portlist, CAUSE_UNALLOCATED, LOCATION_PRIVATE_LOCAL, ""); @@ -193,7 +193,7 @@ void EndpointAppPBX::action_dialing_internal(void) if (e_ext.rights < 1) { trace_header("ACTION extension (dialing to extension denied)", DIRECTION_NONE); - add_trace("extension", NULL, dialinginfo.number); + add_trace("extension", NULL, dialinginfo.id); end_trace(); new_state(EPOINT_STATE_OUT_DISCONNECT); message_disconnect_port(portlist, CAUSE_REJECTED, LOCATION_PRIVATE_LOCAL, ""); @@ -203,7 +203,7 @@ void EndpointAppPBX::action_dialing_internal(void) /* add or update internal call */ trace_header("ACTION extension (calling)", DIRECTION_NONE); - add_trace("extension", NULL, dialinginfo.number); + add_trace("extension", NULL, dialinginfo.id); end_trace(); message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_call_id, EPOINT_TO_CALL, MESSAGE_SETUP); memcpy(&message->param.setup.dialinginfo, &dialinginfo, sizeof(struct dialing_info)); @@ -258,18 +258,18 @@ void EndpointAppPBX::action_dialing_external(void) memcpy(&callerinfo, &e_callerinfo, sizeof(callerinfo)); memcpy(&redirinfo, &e_redirinfo, sizeof(redirinfo)); memset(&dialinginfo, 0, sizeof(dialinginfo)); - dialinginfo.itype = INFO_ITYPE_EXTERN; + dialinginfo.itype = INFO_ITYPE_ISDN; dialinginfo.sending_complete = 0; - SCPY(dialinginfo.number, e_extdialing); + SCPY(dialinginfo.id, e_extdialing); /* process prefix */ if ((rparam = routeparam(e_action, PARAM_PREFIX))) - SPRINT(dialinginfo.number, "%s%s", rparam->string_value, e_extdialing); + SPRINT(dialinginfo.id, "%s%s", rparam->string_value, e_extdialing); /* process number complete */ if ((rparam = routeparam(e_action, PARAM_COMPLETE))) if ((rparam = routeparam(e_action, PARAM_PREFIX))) - SCPY(dialinginfo.number, rparam->string_value); + SCPY(dialinginfo.id, rparam->string_value); dialinginfo.sending_complete = 1; /* process number type */ @@ -338,7 +338,7 @@ void EndpointAppPBX::action_dialing_external(void) return; } - if (!strncmp(dialinginfo.number, options.national, strlen(options.national)) + if (!strncmp(dialinginfo.id, options.national, strlen(options.national)) || dialinginfo.ntype == INFO_NTYPE_NATIONAL || dialinginfo.ntype == INFO_NTYPE_INTERNATIONAL) { @@ -353,7 +353,7 @@ void EndpointAppPBX::action_dialing_external(void) } } - if (!strncmp(dialinginfo.number, options.international, strlen(options.international)) + if (!strncmp(dialinginfo.id, options.international, strlen(options.international)) || dialinginfo.ntype == INFO_NTYPE_INTERNATIONAL) { /* check if international calls are denied */ @@ -369,7 +369,7 @@ void EndpointAppPBX::action_dialing_external(void) /* add or update outgoing call */ trace_header("ACTION extern (calling)", DIRECTION_NONE); - add_trace("number", NULL, dialinginfo.number); + add_trace("number", NULL, dialinginfo.id); if (dialinginfo.interfaces[0]) add_trace("interfaces", NULL, dialinginfo.interfaces); end_trace(); @@ -451,19 +451,19 @@ void EndpointAppPBX::action_dialing_vbox_record(void) memset(&dialinginfo, 0, sizeof(dialinginfo)); dialinginfo.itype = INFO_ITYPE_VBOX; dialinginfo.sending_complete = 1; - SCPY(dialinginfo.number, rparam->string_value); + SCPY(dialinginfo.id, rparam->string_value); /* append special announcement (if given) */ if ((rparam = routeparam(e_action, PARAM_ANNOUNCEMENT))) if (rparam->string_value[0]) { - SCAT(dialinginfo.number, ","); - SCAT(dialinginfo.number, rparam->string_value); + SCAT(dialinginfo.id, ","); + SCAT(dialinginfo.id, rparam->string_value); } /* add or update internal call */ trace_header("ACTION vbox-record (calling)", DIRECTION_NONE); - add_trace("extension", NULL, "%s", dailinginfo.number); + add_trace("extension", NULL, "%s", dialinginfo.id); end_trace(); message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_call_id, EPOINT_TO_CALL, MESSAGE_SETUP); memcpy(&message->param.setup.dialinginfo, &dialinginfo, sizeof(struct dialing_info)); @@ -557,7 +557,7 @@ void EndpointAppPBX::action_init_partyline(void) /* send setup to call */ trace_header("ACTION partyline (calling)", DIRECTION_NONE); - add_trace("room", NULL, "%d", partylind); + add_trace("room", NULL, "%d", partyline); end_trace(); message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_call_id, EPOINT_TO_CALL, MESSAGE_SETUP); message->param.setup.partyline = partyline; @@ -581,34 +581,34 @@ void EndpointAppPBX::action_hangup_call(void) /* check */ if (e_ext.number[0] == '\0') { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: cannot store last dialed number '%s' because caller is unknown (not internal).\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: cannot store last dialed number '%s' because caller is unknown (not internal).\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id); return; } if (!(read_extension(&e_ext, e_ext.number))) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: cannot store last dialed number '%s' because cannot read settings.\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: cannot store last dialed number '%s' because cannot read settings.\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id); return; } - if (e_dialinginfo.number[0] == '\0') + if (e_dialinginfo.id[0] == '\0') { PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: cannot store last dialed number because nothing was dialed.\n", ea_endpoint->ep_serial, e_ext.number); return; } - if (!strcmp(e_dialinginfo.number, e_ext.last_out[0])) + if (!strcmp(e_dialinginfo.id, e_ext.last_out[0])) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: cannot store last dialed number '%s' because it is identical with the last one.\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: cannot store last dialed number '%s' because it is identical with the last one.\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id); return; } /* insert */ - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: storing last number '%s'.\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s: storing last number '%s'.\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id); i = MAX_REMEMBER-1; while(i) { UCPY(e_ext.last_out[i], e_ext.last_out[i-1]); i--; } - SCPY(e_ext.last_out[0], e_dialinginfo.number); + SCPY(e_ext.last_out[0], e_dialinginfo.id); /* write extension */ write_extension(&e_ext, e_ext.number); @@ -672,9 +672,9 @@ void EndpointAppPBX::action_dialing_login(void) message->param.connectinfo.present = INFO_PRESENT_RESTRICTED; else message->param.connectinfo.present = e_ext.callerid_present; /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, portlist->port_type, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name); + apply_callerid_restriction(e_ext.anon_ignore, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name); /* display callerid if desired for extension */ - SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name)); + SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name)); message->param.connectinfo.ntype = e_ext.callerid_type; message_put(message); logmessage(message); @@ -700,8 +700,8 @@ void EndpointAppPBX::action_dialing_login(void) e_action = &action_password; e_match_timeout = 0; e_match_to_action = NULL; - e_dialinginfo.number[0] = '\0'; - e_extdialing = strchr(e_dialinginfo.number, '\0'); + e_dialinginfo.id[0] = '\0'; + e_extdialing = strchr(e_dialinginfo.id, '\0'); /* set timeout */ e_password_timeout = now+20; @@ -716,8 +716,8 @@ void EndpointAppPBX::action_dialing_login(void) if (e_ruleset) e_rule = e_ruleset->rule_first; e_action = NULL; - e_dialinginfo.number[0] = '\0'; - e_extdialing = e_dialinginfo.number; + e_dialinginfo.id[0] = '\0'; + e_extdialing = e_dialinginfo.id; set_tone(portlist, "dialpbx"); } } @@ -1016,8 +1016,8 @@ void EndpointAppPBX::_action_redial_reply(int in) add_trace("number", NULL, "%s", last); add_trace("last but", NULL, "%d", e_select); end_trace(); - SCPY(e_dialinginfo.number, last); - e_extdialing = e_dialinginfo.number; + SCPY(e_dialinginfo.id, last); + e_extdialing = e_dialinginfo.id; e_action = NULL; process_dialing(); return; @@ -1117,7 +1117,7 @@ void EndpointAppPBX::action_dialing_powerdial(void) logmessage(message); /* do dialing */ - SCPY(e_dialinginfo.number, e_ext.last_out[0]); + SCPY(e_dialinginfo.id, e_ext.last_out[0]); e_powerdialing = -1; /* indicates the existence of powerdialing but no redial time given */ e_powercount = 0; e_action = NULL; @@ -1281,8 +1281,8 @@ void EndpointAppPBX::action_dialing_abbrev(void) if (name) if (name[0]) add_trace("name", NULL, "%s", name); end_trace(); - SCPY(e_dialinginfo.number, phone); - e_extdialing = e_dialinginfo.number; + SCPY(e_dialinginfo.id, phone); + e_extdialing = e_dialinginfo.id; e_action = NULL; process_dialing(); } @@ -1339,8 +1339,7 @@ void EndpointAppPBX::action_dialing_test(void) set_tone(portlist, NULL); memset(&e_connectinfo, 0, sizeof(e_connectinfo)); SCPY(e_connectinfo.id, e_callerinfo.id); - SCPY(e_connectinfo.intern, e_callerinfo.intern); - SCPY(e_connectinfo.voip, e_callerinfo.voip); + SCPY(e_connectinfo.extension, e_callerinfo.extension); e_connectinfo.itype = e_callerinfo.itype; e_connectinfo.ntype = e_callerinfo.ntype; e_connectinfo.present = e_callerinfo.present; @@ -1348,9 +1347,9 @@ void EndpointAppPBX::action_dialing_test(void) message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_CONNECT); memcpy(&message->param.connectinfo, &e_connectinfo, sizeof(struct connect_info)); /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, portlist->port_type, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name); + apply_callerid_restriction(e_ext.anon_ignore, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name); /* display callerid if desired for extension */ - SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name)); + SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name)); message_put(message); logmessage(message); @@ -1680,19 +1679,19 @@ void EndpointAppPBX::action_dialing_calculator(void) switch(mode) { case 0: /* multiply */ - UNPRINT(e_extdialing, sizeof(e_dialinginfo.number)-strlen(e_dialinginfo.number), "%.8f", sign1*value1*value2); + UNPRINT(e_extdialing, sizeof(e_dialinginfo.id)-strlen(e_dialinginfo.id), "%.8f", sign1*value1*value2); break; case 1: /* divide */ - UNPRINT(e_extdialing, sizeof(e_dialinginfo.number)-strlen(e_dialinginfo.number), "%.8f", sign1*value1/value2); + UNPRINT(e_extdialing, sizeof(e_dialinginfo.id)-strlen(e_dialinginfo.id), "%.8f", sign1*value1/value2); break; case 2: /* add */ - UNPRINT(e_extdialing, sizeof(e_dialinginfo.number)-strlen(e_dialinginfo.number), "%.8f", sign1*value1+value2); + UNPRINT(e_extdialing, sizeof(e_dialinginfo.id)-strlen(e_dialinginfo.id), "%.8f", sign1*value1+value2); break; case 3: /* substract */ - UNPRINT(e_extdialing, sizeof(e_dialinginfo.number)-strlen(e_dialinginfo.number), "%.8f", sign1*value1-value2); + UNPRINT(e_extdialing, sizeof(e_dialinginfo.id)-strlen(e_dialinginfo.id), "%.8f", sign1*value1-value2); break; } - e_dialinginfo.number[sizeof(e_dialinginfo.number)-1] = '\0'; + e_dialinginfo.id[sizeof(e_dialinginfo.id)-1] = '\0'; if (strchr(e_extdialing, '.')) /* remove zeroes */ { while (e_extdialing[strlen(e_extdialing)-1] == '0') @@ -1787,7 +1786,7 @@ void EndpointAppPBX::_action_goto_menu(int mode) if (!e_ruleset) { trace_header("ACTION goto/menu (ruleset not found)", DIRECTION_NONE); - add_trace("ruleset", "NULL", "%s", praram->string_value); + add_trace("ruleset", NULL, "%s", rparam->string_value); end_trace(); goto disconnect; } @@ -1795,27 +1794,27 @@ void EndpointAppPBX::_action_goto_menu(int mode) /* if the 'menu' was selected, we will flush all digits */ if (mode) { - e_dialinginfo.number[0] = 0; - e_extdialing = e_dialinginfo.number; + e_dialinginfo.id[0] = 0; + e_extdialing = e_dialinginfo.id; } else { /* remove digits that are required to match the rule */ if (!(rparam = routeparam(e_action, PARAM_STRIP))) { if (e_extdialing) - SCPY(e_dialinginfo.number, e_extdialing); - e_extdialing = e_dialinginfo.number; + SCPY(e_dialinginfo.id, e_extdialing); + e_extdialing = e_dialinginfo.id; } } /* play sample */ trace_header("ACTION goto/menu (change to)", DIRECTION_NONE); - add_trace("ruleset", "NULL", "%s", e_ruleset->name); - if (e_dialinginfo.number[0]) - add_trace("dialing", "NULL", "%s", e_dialinginfo.number); + add_trace("ruleset", NULL, "%s", e_ruleset->name); + if (e_dialinginfo.id[0]) + add_trace("dialing", NULL, "%s", e_dialinginfo.id); if ((rparam = routeparam(e_action, PARAM_SAMPLE))) { - add_trace("sample", "NULL", "%s", praram->string_value); + add_trace("sample", NULL, "%s", rparam->string_value); set_tone(ea_endpoint->ep_portlist, rparam->string_value); } end_trace(); @@ -1915,7 +1914,7 @@ void EndpointAppPBX::action_dialing_help(void) /* show all things that would match */ #if 0 struct numbering *numbering = numbering_int; - char dialing[sizeof(e_dialinginfo.number)]; + char dialing[sizeof(e_dialinginfo.id)]; int i; struct message *message; struct route_param *rparam; @@ -1925,15 +1924,15 @@ void EndpointAppPBX::action_dialing_help(void) return; /* scroll menu */ - if (strchr(e_dialinginfo.number,'*')) + if (strchr(e_dialinginfo.id,'*')) { e_menu--; - e_dialinginfo.number[0] = '\0'; + e_dialinginfo.id[0] = '\0'; } - if (strchr(e_dialinginfo.number,'#')) + if (strchr(e_dialinginfo.id,'#')) { e_menu++; - e_dialinginfo.number[0] = '\0'; + e_dialinginfo.id[0] = '\0'; } /* get position in menu */ @@ -1964,15 +1963,15 @@ void EndpointAppPBX::action_dialing_help(void) } /* if we dial something else we need to add the prefix and change the action */ - if (e_dialinginfo.number[0]) + if (e_dialinginfo.id[0]) { e_action = NUMB_ACTION_NONE; SCPY(dialing, numbering->prefix); //we ignore the first digit after selecting - //SCAT(dialing, e_dialinginfo.number); - SCPY(e_dialinginfo.number, dialing); - e_extdialing = e_dialinginfo.number+strlen(numbering->prefix); - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s selected a new menu '%s' dialing: %s\n", ea_endpoint->ep_serial, e_ext.number, numb_actions[numbering->action], e_dialinginfo.number); + //SCAT(dialing, e_dialinginfo.id); + SCPY(e_dialinginfo.id, dialing); + e_extdialing = e_dialinginfo.id+strlen(numbering->prefix); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal %s selected a new menu '%s' dialing: %s\n", ea_endpoint->ep_serial, e_ext.number, numb_actions[numbering->action], e_dialinginfo.id); nesting?: process_dialing(); return; @@ -2011,7 +2010,7 @@ void EndpointAppPBX::action_hangup_execute(void) { struct route_param *rparam; char *command = "", isdn_port[10]; - char *argv[8+1]; /* check also number of args below */ + char *argv[7+1]; /* check also number of args below */ int i = 0; /* get script / command */ @@ -2037,12 +2036,11 @@ void EndpointAppPBX::action_hangup_execute(void) } argv[1+i] = e_extdialing; argv[2+i] = numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype); - argv[3+i] = e_callerinfo.intern; - argv[4+i] = e_callerinfo.voip; - argv[5+i] = e_callerinfo.name; + argv[3+i] = e_callerinfo.extension; + argv[4+i] = e_callerinfo.name; SPRINT(isdn_port, "%d", e_callerinfo.isdn_port); - argv[6+i] = isdn_port; - argv[7+i] = NULL; /* check also number of args above */ + argv[5+i] = isdn_port; + argv[6+i] = NULL; /* check also number of args above */ execve("/bin/sh", argv, environ); } @@ -2106,7 +2104,7 @@ void EndpointAppPBX::action_init_pick(void) trace_header("ACTION pick", DIRECTION_NONE); if (extensions) if (extensions[0]) - add_trace("extensions", NULL, "%s", file); + add_trace("extensions", NULL, "%s", extensions); end_trace(); pick_call(extensions); } @@ -2165,8 +2163,8 @@ void EndpointAppPBX::action_dialing_password(void) if (e_ruleset) e_rule = e_ruleset->rule_first; e_action = NULL; - e_dialinginfo.number[0] = '\0'; - e_extdialing = e_dialinginfo.number; + e_dialinginfo.id[0] = '\0'; + e_extdialing = e_dialinginfo.id; set_tone(portlist, "dialpbx"); } @@ -2259,13 +2257,13 @@ void EndpointAppPBX::process_dialing(void) #if 0 /* check if we do menu selection */ - if (e_action==NUMB_ACTION_NONE && (e_dialinginfo.number[0]=='*' || e_dialinginfo.number[0]=='#')) + if (e_action==NUMB_ACTION_NONE && (e_dialinginfo.id[0]=='*' || e_dialinginfo.id[0]=='#')) /* do menu selection */ if (e_ext.display_menu) { if (portlist->port_type==PORT_TYPE_DSS1_NT_IN || portlist->port_type==PORT_TYPE_DSS1_NT_OUT) /* only if the dialing terminal is an isdn telephone connected to an internal port */ { - e_dialinginfo.number[0] = '\0'; + e_dialinginfo.id[0] = '\0'; e_action = NUMB_ACTION_MENU; e_menu = 0; process_dialing(); @@ -2300,30 +2298,30 @@ void EndpointAppPBX::process_dialing(void) e_select = 0; /* check for external call */ - if (!strncmp(e_dialinginfo.number, "extern:", 7)) + if (!strncmp(e_dialinginfo.id, "extern:", 7)) { - e_extdialing = e_dialinginfo.number+7; + e_extdialing = e_dialinginfo.id+7; e_action = &action_external; goto process_action; } /* check for internal call */ - if (!strncmp(e_dialinginfo.number, "intern:", 7)) + if (!strncmp(e_dialinginfo.id, "intern:", 7)) { - e_extdialing = e_dialinginfo.number+7; + e_extdialing = e_dialinginfo.id+7; e_action = &action_internal; goto process_action; } /* check for chan call */ - if (!strncmp(e_dialinginfo.number, "chan:", 5)) + if (!strncmp(e_dialinginfo.id, "chan:", 5)) { - e_extdialing = e_dialinginfo.number+4; + e_extdialing = e_dialinginfo.id+4; e_action = &action_chan; goto process_action; } /* check for vbox call */ - if (!strncmp(e_dialinginfo.number, "vbox:", 5)) + if (!strncmp(e_dialinginfo.id, "vbox:", 5)) { - e_extdialing = e_dialinginfo.number+5; + e_extdialing = e_dialinginfo.id+5; e_action = &action_vbox; goto process_action; } @@ -2331,7 +2329,7 @@ void EndpointAppPBX::process_dialing(void) if (e_match_timeout && now_d>=e_match_timeout) { /* return timeout rule */ - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal '%s' dialing: '%s', timeout in ruleset '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.number, e_ruleset->name); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal '%s' dialing: '%s', timeout in ruleset '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id, e_ruleset->name); e_match_timeout = 0; e_action = e_match_to_action; e_extdialing = e_match_to_extdialing; @@ -2343,7 +2341,7 @@ void EndpointAppPBX::process_dialing(void) { //PDEBUG(~0, "HANG-BUG-DEBUGGING: before routing\n"); /* check for matching rule */ - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal '%s' dialing: '%s', checking matching rule of ruleset '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.number, e_ruleset->name); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): terminal '%s' dialing: '%s', checking matching rule of ruleset '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_dialinginfo.id, e_ruleset->name); if (e_ruleset) { e_action = route(e_ruleset); @@ -2456,7 +2454,7 @@ void EndpointAppPBX::process_dialing(void) if (!e_action) { - SPRINT(message->param.notifyinfo.display, "> %s", e_dialinginfo.number); + SPRINT(message->param.notifyinfo.display, "> %s", e_dialinginfo.id); } else { SPRINT(message->param.notifyinfo.display, "%s%s%s", action_defs[e_action->index].name, (e_extdialing[0])?" ":"", e_extdialing); @@ -2492,20 +2490,20 @@ void EndpointAppPBX::process_hangup(int cause, int location) } else if (!e_stop) time(&e_stop); - PDEBUG(DEBUG_EPOINT, "EPOINT(%d): writing connect from %s to %s into logfile of %s\n", ea_endpoint->ep_serial, e_callerinfo.id, e_dialinginfo.number, e_ext.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d): writing connect from %s to %s into logfile of %s\n", ea_endpoint->ep_serial, e_callerinfo.id, e_dialinginfo.id, e_ext.number); switch(e_dialinginfo.itype) { case INFO_ITYPE_CHAN: - SPRINT(dialingtext, "chan:%s", e_dialinginfo.number); + SPRINT(dialingtext, "chan:%s", e_dialinginfo.id); break; - case INFO_ITYPE_INTERN: - SPRINT(dialingtext, "intern:%s", e_dialinginfo.number); + case INFO_ITYPE_ISDN_EXTENSION: + SPRINT(dialingtext, "intern:%s", e_dialinginfo.id); break; case INFO_ITYPE_VBOX: - SPRINT(dialingtext, "vbox:%s", e_dialinginfo.number); + SPRINT(dialingtext, "vbox:%s", e_dialinginfo.id); break; default: - SPRINT(dialingtext, "%s", e_dialinginfo.number); + SPRINT(dialingtext, "%s", e_dialinginfo.id); } if (e_callerinfo.id[0]) @@ -2515,18 +2513,16 @@ void EndpointAppPBX::process_hangup(int cause, int location) /* allpy restriction */ if (!e_ext.anon_ignore && e_callerinfo.present==INFO_PRESENT_RESTRICTED) SPRINT(callertext, "anonymous"); - if (e_callerinfo.intern[0]) /* add intern if present */ - UNPRINT(strchr(callertext,'\0'), sizeof(callertext)-1+strlen(callertext), " (intern %s)", e_callerinfo.intern); - if (e_callerinfo.voip[0]) /* add voip if present */ - UNPRINT(strchr(callertext,'\0'), sizeof(callertext)-1+strlen(callertext), " (voip %s)", e_callerinfo.voip); + if (e_callerinfo.extension[0]) /* add intern if present */ + UNPRINT(strchr(callertext,'\0'), sizeof(callertext)-1+strlen(callertext), " (intern %s)", e_callerinfo.extension); write_log(e_ext.number, callertext, dialingtext, e_start, e_stop, 0, cause, location); /* store last received call for reply-list */ - if (e_callerinfo.id[0] || e_callerinfo.intern[0]) + if (e_callerinfo.id[0] || e_callerinfo.extension[0]) if (e_ext.anon_ignore || e_callerinfo.present!=INFO_PRESENT_RESTRICTED) { - if (e_callerinfo.intern[0]) - SPRINT(callertext, "intern:%s", e_callerinfo.intern); + if (e_callerinfo.extension[0]) + SPRINT(callertext, "intern:%s", e_callerinfo.extension); else SPRINT(callertext, "extern:%s", numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype)); if (!!strcmp(callertext, e_ext.last_in[0])) diff --git a/action_vbox.cpp b/action_vbox.cpp index b2f06d9..650bf9a 100644 --- a/action_vbox.cpp +++ b/action_vbox.cpp @@ -609,8 +609,8 @@ void EndpointAppPBX::action_dialing_vbox_play(void) if (e_vbox_index_callerid[0]!='\0' && !!strcmp(e_vbox_index_callerid,"anonymous") && !!strcmp(e_vbox_index_callerid,"unknown")) { set_tone(portlist, "dialing"); - SPRINT(e_dialinginfo.number, "extern:%s", e_vbox_index_callerid); - e_extdialing = e_dialinginfo.number; + SPRINT(e_dialinginfo.id, "extern:%s", e_vbox_index_callerid); + e_extdialing = e_dialinginfo.id; e_action = NULL; process_dialing(); return; diff --git a/admin.h b/admin.h index f86036f..40a0cb8 100644 --- a/admin.h +++ b/admin.h @@ -9,7 +9,7 @@ ** ** \*****************************************************************************/ -#define SOCKET_NAME "/var/run/PBX4Linux.socket" +#define SOCKET_NAME "/var/run/LCR.socket" /* structures that define message between admin-tool and pbx */ @@ -22,6 +22,8 @@ enum { /* messages */ ADMIN_RESPONSE_CMD_DIAL, ADMIN_REQUEST_CMD_RELEASE, ADMIN_RESPONSE_CMD_RELEASE, + ADMIN_REQUEST_CMD_BLOCK, + ADMIN_RESPONSE_CMD_BLOCK, ADMIN_REQUEST_STATE, ADMIN_RESPONSE_STATE, ADMIN_RESPONSE_S_INTERFACE, @@ -44,6 +46,8 @@ enum { /* messages */ struct admin_response_cmd { int error; /* error code 0 = ok*/ char message[256]; /* info / response text */ + int block; + int portnum; }; struct admin_response_state { @@ -57,12 +61,13 @@ struct admin_response_state { }; struct admin_response_interface { - int portnum; char interface_name[32]; + int portnum; + int block; int ntmode; int ptp; int pri; - int iftype; + int extension; int use; /* number of ports that use this interface */ int l1link; /* down(0) or up(1) */ int l2link; /* down(0) or up(1) */ diff --git a/admin_client.c b/admin_client.c index 82b21e9..982b836 100644 --- a/admin_client.c +++ b/admin_client.c @@ -1,6 +1,6 @@ /*****************************************************************************\ ** ** -** PBX4Linux ** +** LCR ** ** ** **---------------------------------------------------------------------------** ** Copyright: Andreas Eversberg ** @@ -26,9 +26,9 @@ #include "admin.h" #include "cause.h" -#define LTEE {addch(/*ACS_LTEE*/'t');addch(/*ACS_HLINE*/'q');addch(/*ACS_HLINE*/'q');} -#define LLCORNER {addch(/*ACS_LLCORNER*/'m');addch(/*ACS_HLINE*/'q');addch(/*ACS_HLINE*/'q');} -#define VLINE {addch(/*ACS_VLINE*/'x');addstr(" ");} +#define LTEE {addch(ACS_LTEE);addch(ACS_HLINE);addch(ACS_HLINE);} +#define LLCORNER {addch(ACS_LLCORNER);addch(ACS_HLINE);addch(ACS_HLINE);} +#define VLINE {addch(ACS_VLINE);addstr(" ");} #define EMPTY {addstr(" ");} //char rotator[] = {'-', '\\', '|', '/'}; int lastlines, lastcols; @@ -42,6 +42,9 @@ enum { MODE_ROUTE, MODE_DIAL, MODE_RELEASE, + MODE_UNBLOCK, + MODE_BLOCK, + MODE_UNLOAD, MODE_TESTCALL, MODE_TRACE, }; @@ -459,7 +462,7 @@ char *admin_state(int sock) /* send reload command */ memset(&msg, 0, sizeof(msg)); msg.message = ADMIN_REQUEST_STATE; -// printf("sizeof=%d\n",sizeof(msg)); +// printf("sizeof=%d\n",sizeof(msg));fflush(stdout); if (write(sock, &msg, sizeof(msg)) != sizeof(msg)) { cleanup_curses(); @@ -472,6 +475,7 @@ char *admin_state(int sock) cleanup_curses(); return("Broken pipe while receiving response."); } + if (msg.message != ADMIN_RESPONSE_STATE) { cleanup_curses(); @@ -484,19 +488,22 @@ char *admin_state(int sock) return("Not enough memory for messages."); } off=0; -readagain: - if ((len = read(sock, ((unsigned char *)(m))+off, num*sizeof(struct admin_message)-off)) != num*(int)sizeof(struct admin_message)-off) + if (num) { - if (len <= 0) { - free(m); -// fprintf(stderr, "got=%d expected=%d\n", i, num*sizeof(struct admin_message)); - cleanup_curses(); - return("Broken pipe while receiving state infos."); - } - if (len < num*(int)sizeof(struct admin_message)) + readagain: + if ((len = read(sock, ((unsigned char *)(m))+off, num*sizeof(struct admin_message)-off)) != num*(int)sizeof(struct admin_message)-off) { - off+=len; - goto readagain; + if (len <= 0) { + free(m); + // fprintf(stderr, "got=%d expected=%d\n", i, num*sizeof(struct admin_message)); + cleanup_curses(); + return("Broken pipe while receiving state infos."); + } + if (len < num*(int)sizeof(struct admin_message)) + { + off+=len; + goto readagain; + } } } j = 0; @@ -633,112 +640,125 @@ readagain: /* show interface summary */ move(++line>1?line:1, 0); color(white); - - SPRINT(buffer, "%s(%d) '%s' %s use:%d ", (m[i].u.i.ntmode)?"NT":"TE", m[i].u.i.portnum, m[i].u.i.interface_name, (m[i].u.i.ptp)?"ptp ":"ptmp", m[i].u.i.use); - addstr(buffer); - if (m[i].u.i.ptp || !m[i].u.i.ntmode) + if (m[i].u.i.block >= 2) { - color((m[i].u.i.l2link)?green:red); - addstr((m[i].u.i.l2link)?" L2 UP":" L2 down"); - } - color((m[i].u.i.l1link)?green:blue); - addstr((m[i].u.i.l1link)?" L1 ACTIVE":" L1 inactive"); - if (line+2 >= LINES) goto end; - /* show channels */ - if (show_interfaces > 1) + SPRINT(buffer, "%s (%d)%s", m[i].u.i.interface_name, m[i].u.i.portnum, (m[i].u.i.extension)?" (extension)":""); + addstr(buffer); + color(red); + addstr(" not loaded"); + } else { - ltee = 0; - j = k =0; - jj = m[i].u.i.channels; - while(j < jj) + SPRINT(buffer, "%s (%d) %s %s%s use:%d", m[i].u.i.interface_name, m[i].u.i.portnum, (m[i].u.i.ntmode)?"NT-mode":"TE-mode", (m[i].u.i.ptp)?"ptp ":"ptmp", (m[i].u.i.extension)?" extension":"", m[i].u.i.use); + addstr(buffer); + if (m[i].u.i.ptp || !m[i].u.i.ntmode) + { + color((m[i].u.i.l2link)?green:red); + addstr((m[i].u.i.l2link)?" L2 UP":" L2 down"); + } + color((m[i].u.i.l1link)?green:blue); + addstr((m[i].u.i.l1link)?" L1 ACTIVE":" L1 inactive"); + if (m[i].u.i.block) { - /* show all channels */ - if (show_interfaces>2 || m[i].u.i.busy[j]>0) + color(red); + addstr(" blocked"); + } + if (line+2 >= LINES) goto end; + /* show channels */ + if (show_interfaces > 1) + { + ltee = 0; + j = k =0; + jj = m[i].u.i.channels; + while(j < jj) { - color(cyan); - /* show left side / right side */ - if ((k & 1) && (COLS > 70)) + /* show all channels */ + if (show_interfaces>2 || m[i].u.i.busy[j]>0) { - move(line>1?line:1,4+((COLS-4)/2)); - } else - { - move(++line>1?line:1, 1); - LTEE - ltee = 1; - } - k++; - color(white); - if (m[i].u.i.pri) - SPRINT(buffer,"S%2d: ", j+1+(j>=15)); - else - SPRINT(buffer,"B%2d: ", j+1); - addstr(buffer); - if (!m[i].u.i.ptp) - goto ptmp; - if (m[i].u.i.l2link) - { - ptmp: - color((m[i].u.i.busy[j])?yellow:blue); - addstr((m[i].u.i.busy[j])?"busy":"idle"); - } else - { - color(red); - addstr("blk "); - } - if (m[i].u.i.port[j]) - { - /* search for port */ - l = msg.u.s.interfaces+msg.u.s.calls+msg.u.s.epoints; - ll = l+msg.u.s.ports; - while(l < ll) + color(cyan); + /* show left side / right side */ + if ((k & 1) && (COLS > 70)) { - if (m[l].u.p.serial == m[i].u.i.port[j]) + move(line>1?line:1,4+((COLS-4)/2)); + } else + { + move(++line>1?line:1, 1); + LTEE + ltee = 1; + } + k++; + color(white); + if (m[i].u.i.pri) + SPRINT(buffer,"S%2d: ", j+1+(j>=15)); + else + SPRINT(buffer,"B%2d: ", j+1); + addstr(buffer); + if (!m[i].u.i.ptp) + goto ptmp; + if (m[i].u.i.l2link && m[i].u.i.block==0) + { + ptmp: + color((m[i].u.i.busy[j])?yellow:blue); + addstr((m[i].u.i.busy[j])?"busy":"idle"); + } else + { + color(red); + addstr("blk "); + } + if (m[i].u.i.port[j]) + { + /* search for port */ + l = msg.u.s.interfaces+msg.u.s.calls+msg.u.s.epoints; + ll = l+msg.u.s.ports; + while(l < ll) { - SPRINT(buffer, " %s(%ld)", m[l].u.p.name, m[l].u.p.serial); - addstr(buffer); + if (m[l].u.p.serial == m[i].u.i.port[j]) + { + SPRINT(buffer, " %s(%ld)", m[l].u.p.name, m[l].u.p.serial); + addstr(buffer); + } + l++; } - l++; } - } - if (line+2 >= LINES) - { - if (ltee) + if (line+2 >= LINES) { - color(cyan); - move(line>1?line:1, 1); - LLCORNER + if (ltee) + { + color(cyan); + move(line>1?line:1, 1); + LLCORNER + } + goto end; } - goto end; } + j++; } - j++; - } - if (ltee) - { - color(cyan); - move(line>1?line:1, 1); - LLCORNER - } - if (line+2 >= LINES) goto end; - /* show summary if no channels were shown */ - if (show_interfaces<2 && ltee==0) - { - color(cyan); - move(++line>1?line:1, 1); - LLCORNER - - if (m[i].u.i.l2link) + if (ltee) { - color(green); - SPRINT(buffer,"all %d channels free", m[i].u.i.channels); - } else + color(cyan); + move(line>1?line:1, 1); + LLCORNER + } + if (line+2 >= LINES) goto end; + /* show summary if no channels were shown */ + if (show_interfaces<2 && ltee==0) { - color(red); - SPRINT(buffer,"all %d channels blocked", m[i].u.i.channels); + color(cyan); + move(++line>1?line:1, 1); + LLCORNER + + if (m[i].u.i.l2link && m[i].u.i.block==0) + { + color(green); + SPRINT(buffer,"all %d channels free", m[i].u.i.channels); + } else + { + color(red); + SPRINT(buffer,"all %d channels blocked", m[i].u.i.channels); + } + addstr(buffer); } - addstr(buffer); + if (line+2 >= LINES) goto end; } - if (line+2 >= LINES) goto end; } i++; anything = 1; @@ -905,7 +925,7 @@ readagain: { move(line++>1?line-1:1, 0); color(blue); - hline(/*ACS_HLINE*/'q', COLS); + hline(ACS_HLINE, COLS); color(white); l = logcur-(LINES-line-2); @@ -933,7 +953,7 @@ readagain: move(0, 0); color(white); msg.u.s.version_string[sizeof(msg.u.s.version_string)-1] = '\0'; - SPRINT(buffer, "PBX4Linux %s", msg.u.s.version_string); + SPRINT(buffer, "LCR %s", msg.u.s.version_string); addstr(buffer); if (COLS>50) { @@ -946,7 +966,7 @@ readagain: /* displeay head line */ move(1, 0); color(blue); - hline(/*ACS_HLINE*/'q', COLS); + hline(ACS_HLINE, COLS); if (offset) { move(1, 1); @@ -957,7 +977,7 @@ readagain: /* display end */ move(LINES-2, 0); color(white); - hline(/*ACS_HLINE*/'q', COLS); + hline(ACS_HLINE, COLS); move(LINES-1, 0); color(white); SPRINT(buffer, "i = interfaces '%s' c = calls '%s' l = log q = quit +/- = scroll", text_interfaces[show_interfaces], text_calls[show_calls]); @@ -1052,6 +1072,21 @@ char *admin_cmd(int sock, int mode, char *extension, char *number) msg.message = ADMIN_REQUEST_CMD_RELEASE; SCPY(msg.u.x.message, number); break; + case MODE_UNBLOCK: + msg.message = ADMIN_REQUEST_CMD_BLOCK; + msg.u.x.portnum = atoi(number); + msg.u.x.block = 0; + break; + case MODE_BLOCK: + msg.message = ADMIN_REQUEST_CMD_BLOCK; + msg.u.x.portnum = atoi(number); + msg.u.x.block = 1; + break; + case MODE_UNLOAD: + msg.message = ADMIN_REQUEST_CMD_BLOCK; + msg.u.x.portnum = atoi(number); + msg.u.x.block = 2; + break; } if (write(sock, &msg, sizeof(msg)) != sizeof(msg)) @@ -1078,6 +1113,12 @@ char *admin_cmd(int sock, int mode, char *extension, char *number) if (msg.message != ADMIN_RESPONSE_CMD_RELEASE) return("Response not valid."); break; + case MODE_UNBLOCK: + case MODE_BLOCK: + case MODE_UNLOAD: + if (msg.message != ADMIN_RESPONSE_CMD_BLOCK) + return("Response not valid."); + break; } /* process response */ @@ -1293,10 +1334,13 @@ int main(int argc, char *argv[]) printf("\n"); printf("Usage: %s state | interface | route | dial ...\n", argv[0]); printf("state - View current states using graphical console output.\n"); - printf("interface - Tell PBX to reload \"interface.conf\".\n"); - printf("route - Tell PBX to reload \"route.conf\".\n"); - printf("dial - Tell PBX the next number to dial for extension.\n"); - printf("release - Tell PBX to release endpoint with given number.\n"); + printf("interface - Tell LCR to reload \"interface.conf\".\n"); + printf("route - Tell LCR to reload \"route.conf\".\n"); + printf("dial - Tell LCR the next number to dial for extension.\n"); + printf("release - Tell LCR to release endpoint with given number.\n"); + printf("block - Block given port.\n"); + printf("unblock - Unblock given port.\n"); + printf("unload - Unload port. To load port use 'block' or 'unblock'.\n"); printf("testcall [present|restrict []] - Testcall\n"); printf(" -> capability = (Values must be numbers, -1 to omit.)\n"); printf("trace [brief|short] [ [...]] - Shows call trace. Use filter to reduce output.\n"); @@ -1330,6 +1374,24 @@ int main(int argc, char *argv[]) goto usage; mode = MODE_RELEASE; } else + if (!(strcasecmp(argv[1],"unblock"))) + { + if (argc <= 2) + goto usage; + mode = MODE_UNBLOCK; + } else + if (!(strcasecmp(argv[1],"block"))) + { + if (argc <= 2) + goto usage; + mode = MODE_BLOCK; + } else + if (!(strcasecmp(argv[1],"unload"))) + { + if (argc <= 2) + goto usage; + mode = MODE_UNLOAD; + } else if (!(strcasecmp(argv[1],"testcall"))) { if (argc <= 4) @@ -1357,7 +1419,7 @@ int main(int argc, char *argv[]) if ((conn = connect(sock, (struct sockaddr *)&sock_address, SUN_LEN(&sock_address))) < 0) { close(sock); - fprintf(stderr, "Failed to connect to socket \"%s\".\nIs PBX4Linux running?\n", sock_address.sun_path); + fprintf(stderr, "Failed to connect to socket \"%s\".\nIs LCR running?\n", sock_address.sun_path); exit(EXIT_FAILURE); } @@ -1378,6 +1440,9 @@ int main(int argc, char *argv[]) break; case MODE_RELEASE: + case MODE_UNBLOCK: + case MODE_BLOCK: + case MODE_UNLOAD: ret = admin_cmd(sock, mode, NULL, argv[2]); break; diff --git a/admin_server.c b/admin_server.c index 756376f..ad40516 100644 --- a/admin_server.c +++ b/admin_server.c @@ -164,7 +164,7 @@ int admin_interface(struct admin_queue **responsep) if (!response) return(-1); memuse++; - memset(response, 0, sizeof(admin_queue)); + memset(response, 0, sizeof(admin_queue)+sizeof(admin_message)); response->num = 1; /* message */ response->am[0].message = ADMIN_RESPONSE_CMD_INTERFACE; @@ -256,11 +256,11 @@ int admin_route(struct admin_queue **responsep) apppbx->release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); start_trace(0, NULL, - nationalize(apppbx->e_callerinfo.id, apppbx->e_callerinfo.ntype), - apppbx->e_dialinginfo.number, + numberrize_callerinfo(apppbx->e_callerinfo.id, apppbx->e_callerinfo.ntype), + apppbx->e_dialinginfo.id, DIRECTION_NONE, CATEGORY_EP, - apppbx->e_serial, + apppbx->ea_endpoint->ep_serial, "KICK (reload routing)"); } @@ -277,7 +277,7 @@ int admin_route(struct admin_queue **responsep) if (!response) return(-1); memuse++; - memset(response, 0, sizeof(admin_queue)); + memset(response, 0, sizeof(admin_queue)+sizeof(admin_message)); response->num = 1; /* message */ response->am[0].message = ADMIN_RESPONSE_CMD_ROUTE; @@ -307,7 +307,7 @@ int admin_dial(struct admin_queue **responsep, char *message) if (!response) return(-1); memuse++; - memset(response, 0, sizeof(admin_queue)); + memset(response, 0, sizeof(admin_queue)+sizeof(admin_message)); response->num = 1; /* message */ response->am[0].message = ADMIN_RESPONSE_CMD_DIAL; @@ -340,6 +340,107 @@ int admin_dial(struct admin_queue **responsep, char *message) /* + * do blocking + * + * 0 = make port available + * 1 = make port administratively blocked + * 2 = unload port + * the result is returned: + * 0 = port is now available + * 1 = port is now blocked + * 2 = port cannot be loaded or has been unloaded + * -1 = port doesn't exist + */ +int admin_block(struct admin_queue **responsep, int portnum, int block) +{ + struct admin_queue *response; /* response pointer */ + struct interface *interface; + struct interface_port *ifport; + + /* create block response */ + response = (struct admin_queue *)malloc(sizeof(struct admin_queue)+sizeof(admin_message)); + if (!response) + return(-1); + memuse++; + memset(response, 0, sizeof(admin_queue)+sizeof(admin_message)); + response->num = 1; + /* message */ + response->am[0].message = ADMIN_RESPONSE_CMD_BLOCK; + response->am[0].u.x.portnum = portnum; + + /* search for port */ + interface = interface_first; + while(interface) + { + ifport = interface->ifport; + while(ifport) + { + if (ifport->portnum == portnum) + break; + ifport = ifport->next; + } + if (ifport) + break; + interface = interface->next; + } + /* not found, we return -1 */ + if (!ifport) + { + response->am[0].u.x.block = -1; + response->am[0].u.x.error = 1; + SPRINT(response->am[0].u.x.message, "Port %d does not exist.", portnum); + goto out; + } + + /* no interface */ + if (!ifport->mISDNport) + { + /* not loaded anyway */ + if (block >= 2) + { + response->am[0].u.x.block = 2; + goto out; + } + + /* try loading interface */ + ifport->block = block; + load_port(ifport); + + /* port cannot load */ + if (ifport->block >= 2) + { + response->am[0].u.x.block = 2; + response->am[0].u.x.error = 1; + SPRINT(response->am[0].u.x.message, "Port %d will not load.", portnum); + goto out; + } + + /* port loaded */ + response->am[0].u.x.block = ifport->block; + goto out; + } + + /* if we shall unload interface */ + if (block >= 2) + { + mISDNport_close(ifport->mISDNport); + ifport->mISDNport = 0; + ifport->block = 2; + goto out; + } + + /* port new blocking state */ + ifport->block = response->am[0].u.x.block = block; + + out: + /* attach to response chain */ + *responsep = response; + responsep = &response->next; + return(0); +} + + +/* * do release */ int admin_release(struct admin_queue **responsep, char *message) @@ -353,7 +454,7 @@ int admin_release(struct admin_queue **responsep, char *message) if (!response) return(-1); memuse++; - memset(response, 0, sizeof(admin_queue)); + memset(response, 0, sizeof(admin_queue)+sizeof(admin_message)); response->num = 1; /* message */ response->am[0].message = ADMIN_RESPONSE_CMD_RELEASE; @@ -416,7 +517,7 @@ int admin_call(struct admin_list *admin, struct admin_message *msg) apppbx->e_capainfo.bearer_info1 = msg->u.call.bc_info1; apppbx->e_capainfo.hlc = msg->u.call.hlc; apppbx->e_capainfo.exthlc = msg->u.call.exthlc; - SCPY(apppbx->e_dialinginfo.number, msg->u.call.dialing); + SCPY(apppbx->e_dialinginfo.id, msg->u.call.dialing); SCPY(apppbx->e_dialinginfo.interfaces, msg->u.call.interface); apppbx->e_dialinginfo.sending_complete = 1; @@ -461,7 +562,7 @@ void admin_call_response(int adminid, int message, char *connected, int cause, i if (!response) return; memuse++; - memset(response, 0, sizeof(admin_queue)); + memset(response, 0, sizeof(admin_queue)+sizeof(admin_message)); response->num = 1; /* message */ response->am[0].message = message; @@ -488,6 +589,8 @@ int admin_state(struct admin_queue **responsep) class EndpointAppPBX *apppbx; class Call *call; class Pdss1 *pdss1; + struct interface *interface; + struct interface_port *ifport; struct mISDNport *mISDNport; int i; int num; @@ -499,7 +602,7 @@ int admin_state(struct admin_queue **responsep) if (!response) return(-1); memuse++; - memset(response, 0, sizeof(admin_queue)); + memset(response, 0, sizeof(admin_queue)+sizeof(admin_message)); response->num = 1; /* message */ response->am[0].message = ADMIN_RESPONSE_STATE; @@ -510,12 +613,17 @@ int admin_state(struct admin_queue **responsep) /* log file */ SCPY(response->am[0].u.s.logfile, options.log); /* interface count */ - mISDNport = mISDNport_first; i = 0; - while(mISDNport) + interface = interface_first; + while(interface) { - i++; - mISDNport = mISDNport->next; + ifport = interface->ifport; + while(ifport) + { + i++; + ifport = ifport->next; + } + interface = interface->next; } response->am[0].u.s.interfaces = i; /* call count */ @@ -537,8 +645,8 @@ int admin_state(struct admin_queue **responsep) } response->am[0].u.s.epoints = i; /* port count */ - port = port_first; i = 0; + port = port_first; while(port) { i++; @@ -551,52 +659,67 @@ int admin_state(struct admin_queue **responsep) /* create response for all interfaces */ num = (response->am[0].u.s.interfaces)+(response->am[0].u.s.calls)+(response->am[0].u.s.epoints)+(response->am[0].u.s.ports); + if (num == 0) + return(0); response = (struct admin_queue *)malloc(sizeof(admin_queue)+(num*sizeof(admin_message))); if (!response) return(-1); memuse++; - memset(response, 0, sizeof(admin_queue)+(num*sizeof(admin_queue))); + memset(response, 0, sizeof(admin_queue)+(num*sizeof(admin_message))); response->num = num; *responsep = response; responsep = &response->next; - mISDNport = mISDNport_first; + interface = interface_first; num = 0; - while(mISDNport) + while(interface) { - /* message */ - response->am[num].message = ADMIN_RESPONSE_S_INTERFACE; - /* portnum */ - response->am[num].u.i.portnum = mISDNport->portnum; - /* interface */ - SCPY(response->am[num].u.i.interface_name, mISDNport->interface_name); - /* iftype */ - response->am[num].u.i.iftype = mISDNport->iftype; - /* ptp */ - response->am[num].u.i.ptp = mISDNport->ptp; - /* ntmode */ - response->am[num].u.i.ntmode = mISDNport->ntmode; - /* pri */ - response->am[num].u.i.pri = mISDNport->pri; - /* use */ - response->am[num].u.i.use = mISDNport->use; - /* l1link */ - response->am[num].u.i.l1link = mISDNport->l1link; - /* l2link */ - response->am[num].u.i.l2link = mISDNport->l2link; - /* channels */ - response->am[num].u.i.channels = mISDNport->b_num; - /* channel info */ - i = 0; - anybusy = 0; - while(i < mISDNport->b_num) + ifport = interface->ifport; + while(ifport) { - response->am[num].u.i.busy[i] = mISDNport->b_state[i]; - if (mISDNport->b_port[i]) - response->am[num].u.i.port[i] = mISDNport->b_port[i]->p_serial; - i++; + /* message */ + response->am[num].message = ADMIN_RESPONSE_S_INTERFACE; + /* interface */ + SCPY(response->am[num].u.i.interface_name, interface->name); + /* portnum */ + response->am[num].u.i.portnum = ifport->portnum; + /* iftype */ + response->am[num].u.i.extension = interface->extension; + /* block */ + response->am[num].u.i.block = ifport->block; + if (ifport->mISDNport) + { + mISDNport = ifport->mISDNport; + + /* ptp */ + response->am[num].u.i.ptp = mISDNport->ptp; + /* ntmode */ + response->am[num].u.i.ntmode = mISDNport->ntmode; + /* pri */ + response->am[num].u.i.pri = mISDNport->pri; + /* use */ + response->am[num].u.i.use = mISDNport->use; + /* l1link */ + response->am[num].u.i.l1link = mISDNport->l1link; + /* l2link */ + response->am[num].u.i.l2link = mISDNport->l2link; + /* channels */ + response->am[num].u.i.channels = mISDNport->b_num; + /* channel info */ + i = 0; + anybusy = 0; + while(i < mISDNport->b_num) + { + response->am[num].u.i.busy[i] = mISDNport->b_state[i]; + if (mISDNport->b_port[i]) + response->am[num].u.i.port[i] = mISDNport->b_port[i]->p_serial; + i++; + } + } + num++; + + ifport = ifport->next; } - mISDNport = mISDNport->next; - num++; + interface = interface->next; } /* create response for all calls */ @@ -673,7 +796,7 @@ int admin_state(struct admin_queue **responsep) /* callerid */ SCPY(response->am[num].u.e.callerid, apppbx->e_callerinfo.id); /* dialing */ - SCPY(response->am[num].u.e.dialing, apppbx->e_dialinginfo.number); + SCPY(response->am[num].u.e.dialing, apppbx->e_dialinginfo.id); /* action string */ if (apppbx->e_action) SCPY(response->am[num].u.e.action, action_defs[apppbx->e_action->index].name); @@ -918,16 +1041,25 @@ int admin_handle(void) PERROR("Failed to create state response for socket %d.\n", admin->sock); goto response_error; } - case ADMIN_REQUEST_MESSAGE: + break; + + case ADMIN_REQUEST_CMD_BLOCK: + if (admin_block(&admin->response, msg.u.x.portnum, msg.u.x.block) < 0) + { + PERROR("Failed to create block response for socket %d.\n", admin->sock); + goto response_error; + } + break; + +#warning interface tbd +#if 0 + case ADMIN_MESSAGE: if (admin_message(&admin->response) < 0) { PERROR("Failed to create message response for socket %d.\n", admin->sock); - response_error: - *adminp = admin->next; - free_connection(admin); - admin = *adminp; - continue; + goto response_error; } +#endif #if 0 #warning DEBUGGING { @@ -948,7 +1080,11 @@ int admin_handle(void) if (admin_call(admin, &msg)) { PERROR("Failed to create call for socket %d.\n", admin->sock); - goto response_error; + response_error: + *adminp = admin->next; + free_connection(admin); + admin = *adminp; + continue; } break; diff --git a/apppbx.cpp b/apppbx.cpp index d28ae87..dda9da3 100644 --- a/apppbx.cpp +++ b/apppbx.cpp @@ -60,7 +60,7 @@ EndpointAppPBX::EndpointAppPBX(class Endpoint *epoint) : EndpointApp(epoint) e_match_timeout = 0; e_match_to_action = NULL; e_select = 0; - e_extdialing = e_dialinginfo.number; + e_extdialing = e_dialinginfo.id; // e_knocking = 0; // e_knocktime = 0; e_hold = 0; @@ -150,7 +150,7 @@ void EndpointAppPBX::trace_header(char *name, int direction) start_trace(ea_endpoint->ep_serial, NULL, numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype), - e_dialinginfo.number, + e_dialinginfo.id, direction, CATEGORY_EP, ea_endpoint->ep_serial, @@ -409,7 +409,7 @@ void EndpointAppPBX::release(int release, int calllocation, int callcause, int p e_match_timeout = 0; e_match_to_action = NULL; //e_select = 0; - e_extdialing = e_dialinginfo.number; + e_extdialing = e_dialinginfo.id; e_connectedmode = 0; e_dtmf = 0; e_dtmf_time = 0; @@ -438,7 +438,7 @@ void EndpointAppPBX::release(int release, int calllocation, int callcause, int p { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) preparing callback to internal: %s interface %s\n", ea_endpoint->ep_serial, e_ext.number, e_extension_interface); /* create callback to the current terminal */ - SCPY(e_dialinginfo.number, e_ext.number); + SCPY(e_dialinginfo.id, e_ext.number); SCPY(e_dialinginfo.interfaces, e_extension_interface); e_dialinginfo.itype = INFO_ITYPE_ISDN_EXTENSION; e_dialinginfo.ntype = INFO_NTYPE_UNKNOWN; @@ -446,15 +446,15 @@ void EndpointAppPBX::release(int release, int calllocation, int callcause, int p { if (e_cbto[0]) { - SCPY(e_dialinginfo.number, e_cbto); + SCPY(e_dialinginfo.id, e_cbto); } else { /* numberrize caller id and use it to dial to the callback */ - SCPY(e_dialinginfo.number, numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype)); + SCPY(e_dialinginfo.id, numberrize_callerinfo(e_callerinfo.id,e_callerinfo.ntype)); } e_dialinginfo.itype = INFO_ITYPE_ISDN; e_dialinginfo.ntype = INFO_NTYPE_UNKNOWN; - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) preparing callback to external: %s\n", ea_endpoint->ep_serial, e_dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) preparing callback to external: %s\n", ea_endpoint->ep_serial, e_dialinginfo.id); } return; } @@ -467,9 +467,9 @@ void EndpointAppPBX::release(int release, int calllocation, int callcause, int p /* cancel callerid if restricted, unless anon-ignore is enabled at extension or port is of type external (so called police gets caller id :)*/ -void apply_callerid_restriction(int anon_ignore, int port_type, char *id, int *ntype, int *present, int *screen, char *voip, char *extension, char *name) +void apply_callerid_restriction(int anon_ignore, char *id, int *ntype, int *present, int *screen, char *extension, char *name) { - PDEBUG(DEBUG_EPOINT, "id='%s' ntype=%d present=%d screen=%d voip='%s' extension='%s' name='%s'\n", (id)?id:"NULL", (ntype)?*ntype:-1, (present)?*present:-1, (screen)?*screen:-1, (voip)?voip:"NULL", (extension)?extension:"NULL", (name)?name:"NULL"); + PDEBUG(DEBUG_EPOINT, "id='%s' ntype=%d present=%d screen=%d extension='%s' name='%s'\n", (id)?id:"NULL", (ntype)?*ntype:-1, (present)?*present:-1, (screen)?*screen:-1, (extension)?extension:"NULL", (name)?name:"NULL"); /* caller id is not restricted, so we do nothing */ if (*present != INFO_PRESENT_RESTRICTED) @@ -503,19 +503,17 @@ void apply_callerid_restriction(int anon_ignore, int port_type, char *id, int *n } /* used display message to display callerid as available */ -char *EndpointAppPBX::apply_callerid_display(char *id, int itype, int ntype, int present, int screen, char *voip, char *extension, char *name) +char *EndpointAppPBX::apply_callerid_display(char *id, int itype, int ntype, int present, int screen, char *extension, char *name) { static char display[81]; display[0] = '\0'; char *cid = numberrize_callerinfo(id, ntype); - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) id='%s' itype=%d ntype=%d present=%d screen=%d voip='%s' extension='%s' name='%s'\n", ea_endpoint->ep_serial, (id)?id:"NULL", itype, ntype, present, screen, (voip)?voip:"NULL", (extension)?extension:"NULL", (name)?name:"NULL"); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) id='%s' itype=%d ntype=%d present=%d screen=%d extension='%s' name='%s'\n", ea_endpoint->ep_serial, (id)?id:"NULL", itype, ntype, present, screen, (extension)?extension:"NULL", (name)?name:"NULL"); if (!id) id = ""; - if (!voip) - voip = ""; if (!extension) extension = ""; if (!name) @@ -537,7 +535,7 @@ char *EndpointAppPBX::apply_callerid_display(char *id, int itype, int ntype, int } /* external caller id */ - if (!extension[0] && !voip[0] && e_ext.display_ext) + if (!extension[0] && e_ext.display_ext) { if (!display[0]) { @@ -553,16 +551,6 @@ char *EndpointAppPBX::apply_callerid_display(char *id, int itype, int ntype, int } } - /* voip caller id */ - if (voip[0] && e_ext.display_voip) - { - if (!display[0] && cid[0]) - SCAT(display, cid); - if (display[0]) - SCAT(display, " "); - SCAT(display, voip); - } - /* display if callerid is anonymouse but available due anon-ignore */ if (e_ext.display_anon && present==INFO_PRESENT_RESTRICTED) { @@ -769,7 +757,9 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) { struct interface *interface; struct interface_port *ifport, *ifport_start; + struct select_channel *selchannel; struct mISDNport *mISDNport; + int index, i; interface = interface_first; @@ -787,7 +777,7 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) trace_header("CHANNEL SELECTION (found interface)", DIRECTION_NONE); add_trace("interface", NULL, "%s", ifname); end_trace(); - goto found; + goto foundif; } } else @@ -798,12 +788,13 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) trace_header("CHANNEL SELECTION (found non extension interface)", DIRECTION_NONE); add_trace("interface", NULL, "%s", interface->name); end_trace(); - goto found; + goto foundif; } } interface = interface->next; goto checknext; +foundif: /* see if interface has ports */ if (!interface->ifport) @@ -817,14 +808,14 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) } /* select port by algorithm */ - ifport_start = interface->port; + ifport_start = interface->ifport; index = 0; if (interface->hunt == HUNT_ROUNDROBIN) { while(ifport_start->next && indexhunt_next) { ifport_start = ifport_start->next; - i++; + index++; } trace_header("CHANNEL SELECTION (starting round-robin)", DIRECTION_NONE); add_trace("port", NULL, "%d", ifport_start->portnum); @@ -847,8 +838,6 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) } mISDNport = ifport->mISDNport; -#warning admin block auch bei incomming calls -#warning calls releasen, wenn port entfernt wird, geblockt wird /* see if port is administratively blocked */ if (ifport->block) { @@ -871,13 +860,13 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) /* check for channel form selection list */ *channel = 0; - selchannel = ifport->selchannel; + selchannel = ifport->out_channel; while(selchannel) { switch(selchannel->channel) { case CHANNEL_FREE: /* free channel */ - if (mISDNport->b_inuse >= mISDNport->b_num) + if (mISDNport->b_reserved >= mISDNport->b_num) break; /* all channel in use or reserverd */ /* find channel */ i = 0; @@ -898,7 +887,7 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) break; case CHANNEL_ANY: /* don't ask for channel */ - if (mISDNport->b_inuse >= mISDNport->b_num) + if (mISDNport->b_reserved >= mISDNport->b_num) { break; /* all channel in use or reserverd */ } @@ -906,7 +895,7 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) add_trace("port", NULL, "%d", ifport->portnum); add_trace("position", NULL, "%d", index); end_trace(); - *channel = SEL_CHANNEL_ANY; + *channel = CHANNEL_ANY; break; case CHANNEL_NO: /* call waiting */ @@ -914,7 +903,7 @@ struct mISDNport *EndpointAppPBX::hunt_port(char *ifname, int *channel) add_trace("port", NULL, "%d", ifport->portnum); add_trace("position", NULL, "%d", index); end_trace(); - *channel = SEL_CHANNEL_NO; + *channel = CHANNEL_NO; break; default: @@ -996,12 +985,11 @@ void EndpointAppPBX::out_setup(void) class EndpointAppPBX *atemp; // char allowed_ports[256]; // char exten[256]; - int i, ii; - int use; char ifname[sizeof(e_ext.interfaces)], number[256]; struct port_settings port_settings; int channel = 0; + int earlyb; /* create settings for creating port */ memset(&port_settings, 0, sizeof(port_settings)); @@ -1046,13 +1034,13 @@ void EndpointAppPBX::out_setup(void) /* FALL THROUGH !!!! */ case INFO_ITYPE_VBOX: /* get dialed extension's info */ -// SCPY(exten, e_dialinginfo.number); +// SCPY(exten, e_dialinginfo.id); // if (strchr(exten, ',')) // *strchr(exten, ',') = '\0'; // if (!read_extension(&e_ext, exten)) - if (!read_extension(&e_ext, e_dialinginfo.number)) + if (!read_extension(&e_ext, e_dialinginfo.id)) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) extension %s not configured\n", ea_endpoint->ep_serial, e_dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) extension %s not configured\n", ea_endpoint->ep_serial, e_dialinginfo.id); release(RELEASE_ALL, LOCATION_PRIVATE_LOCAL, CAUSE_OUTOFORDER, LOCATION_PRIVATE_LOCAL, CAUSE_NORMAL); /* RELEASE_TYPE, call, port */ return; /* must exit here */ } @@ -1125,7 +1113,7 @@ void EndpointAppPBX::out_setup(void) /* call to all internal interfaces */ p = e_ext.interfaces; - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) generating multiple calls for extension %s to interfaces %s\n", ea_endpoint->ep_serial, e_dialinginfo.number, p); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) generating multiple calls for extension %s to interfaces %s\n", ea_endpoint->ep_serial, e_dialinginfo.id, p); while(*p) { ifname[0] = '\0'; @@ -1146,20 +1134,20 @@ void EndpointAppPBX::out_setup(void) continue; } /* creating INTERNAL port */ - SPRINT(portname, "%s-%d-out", mISDNport->interface_name, mISDNport->portnum); - port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport.channel_force); + SPRINT(portname, "%s-%d-out", mISDNport->ifport->interface->name, mISDNport->portnum); + port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force); if (!port) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) port '%s' failed to create\n", ea_endpoint->ep_serial, mISDNport->interface_name); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) port '%s' failed to create\n", ea_endpoint->ep_serial, mISDNport->ifport->interface->name); goto check_anycall_intern; } PDEBUG(DEBUG_EPOINT, "EPOINT(%d) got port %s\n", ea_endpoint->ep_serial, port->p_name); memset(&dialinginfo, 0, sizeof(dialinginfo)); - SCPY(dialinginfo.number, e_dialinginfo.number); + SCPY(dialinginfo.id, e_dialinginfo.id); dialinginfo.itype = INFO_ITYPE_ISDN_EXTENSION; dialinginfo.ntype = e_dialinginfo.ntype; /* create port_list relation */ - portlist = ea_endpoint->portlist_new(port->p_serial, port->p_type, mISDNport->is_earlyb); + portlist = ea_endpoint->portlist_new(port->p_serial, port->p_type, mISDNport->earlyb); if (!portlist) { PERROR("EPOINT(%d) cannot allocate port_list relation\n", ea_endpoint->ep_serial); @@ -1175,20 +1163,20 @@ void EndpointAppPBX::out_setup(void) } // dss1 = (class Pdss1 *)port; /* message */ -//printf("INTERNAL caller=%s,id=%s,dial=%s\n", param.setup.networkid, param.setup.callerinfo.id, param.setup.dialinginfo.number); +//printf("INTERNAL caller=%s,id=%s,dial=%s\n", param.setup.networkid, param.setup.callerinfo.id, param.setup.dialinginfo.id); message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_SETUP); memcpy(&message->param.setup.dialinginfo, &dialinginfo, sizeof(struct dialing_info)); memcpy(&message->param.setup.redirinfo, &e_redirinfo, sizeof(struct redir_info)); memcpy(&message->param.setup.callerinfo, &e_callerinfo, sizeof(struct caller_info)); memcpy(&message->param.setup.capainfo, &e_capainfo, sizeof(struct capa_info)); //terminal SCPY(message->param.setup.from_terminal, e_ext.number); -//terminal if (e_dialinginfo.number) -//terminal SCPY(message->param.setup.to_terminal, e_dialinginfo.number); +//terminal if (e_dialinginfo.id) +//terminal SCPY(message->param.setup.to_terminal, e_dialinginfo.id); /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, port->p_type, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.voip, message->param.setup.callerinfo.intern, message->param.setup.callerinfo.name); - apply_callerid_restriction(e_ext.anon_ignore, port->p_type, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, NULL, message->param.setup.redirinfo.voip, message->param.setup.redirinfo.intern, 0); + apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name); + apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL); /* display callerid if desired for extension */ - SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.voip, message->param.setup.callerinfo.intern, message->param.setup.callerinfo.name)); + SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name)); //printf("\n\ndisplay = %s\n\n\n",message->param.setup.callerinfo.display); /* use cnip, if enabld */ if (!e_ext.centrex) @@ -1201,9 +1189,9 @@ void EndpointAppPBX::out_setup(void) message->param.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN; } /* use internal caller id */ - if (e_callerinfo.intern[0] && (message->param.setup.callerinfo.present!=INFO_PRESENT_RESTRICTED || e_ext.anon_ignore)) + if (e_callerinfo.extension[0] && (message->param.setup.callerinfo.present!=INFO_PRESENT_RESTRICTED || e_ext.anon_ignore)) { - SCPY(message->param.setup.callerinfo.id, e_callerinfo.intern); + SCPY(message->param.setup.callerinfo.id, e_callerinfo.extension); message->param.setup.callerinfo.ntype = INFO_NTYPE_UNKNOWN; } message_put(message); @@ -1225,12 +1213,12 @@ void EndpointAppPBX::out_setup(void) cfu_only: /* entry point for cfu */ cfb_only: /* entry point for cfb */ cfnr_only: /* entry point for cfnr */ - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) call extension %s for external destiantion(s) '%s'\n", ea_endpoint->ep_serial, e_dialinginfo.number, p); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) call extension %s for external destiantion(s) '%s'\n", ea_endpoint->ep_serial, e_dialinginfo.id, p); // i=0; while(*p) { - /* only if vbox should be dialed, and terminal is given */ earlyb = 0; + /* only if vbox should be dialed, and terminal is given */ if (!strcmp(p, "vbox") && e_ext.number[0]) { /* go to the end of p */ @@ -1253,63 +1241,16 @@ void EndpointAppPBX::out_setup(void) SCCAT(cfp, *p++); if (*p == ',') p++; - hier auch wie oben /* external call */ PDEBUG(DEBUG_EPOINT, "EPOINT(%d) cfp external %s\n", ea_endpoint->ep_serial, cfp); /* hunt for mISDNport and create Port */ - mISDNport = mISDNport_first; - port = NULL; - while(mISDNport) - { - /* check for external or given interface */ - if (((!e_dialinginfo.interfaces[0])&&mISDNport->iftype==IF_EXTERN) || !strcmp(mISDNport->interface_name, e_dialinginfo.interfaces)) - { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) interface '%s' found\n", ea_endpoint->ep_serial, mISDNport->interface_name); - cause = CAUSE_NOCHANNEL; /* when failing: out of channels */ - /* if PTP, skip all down links */ - if (mISDNport->ptp && !mISDNport->l2link) - { - trace_header("INTERFACE (layer 2 is down)", DIRECTION_NONE); - add_trace("interface", NULL, "%s", mISDNport->interface_name); - end_trace(); - mISDNport = mISDNport->next; - continue; - } - /* if no channel is available */ - if (mISDNport->multilink || !mISDNport->ntmode || mISDNport->ptp) - { - use = 0; - i = 0; - ii = mISDNport->b_num; - while(i < ii) - { - if (mISDNport->b_state[i]) - use++; - i++; - } - if (use >= mISDNport->b_num) - { - trace_header("INTERFACE (no free channel)", DIRECTION_NONE); - add_trace("interface", NULL, "%s", mISDNport->interface_name); - end_trace(); - mISDNport = mISDNport->next; - continue; - } - } - /* found interface */ - trace_header("INTERFACE (found)", DIRECTION_NONE); - add_trace("interface", NULL, "%s", mISDNport->interface_name); - end_trace(); - break; - } - mISDNport = mISDNport->next; - } + mISDNport = hunt_port(e_dialinginfo.interfaces[0]?e_dialinginfo.interfaces:NULL, &channel); if (mISDNport) { /* creating EXTERNAL port*/ - SPRINT(portname, "%s-%d-out", mISDNport->interface_name, mISDNport->portnum); - port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings); - earlyb = mISDNport->is_earlyb; + SPRINT(portname, "%s-%d-out", mISDNport->ifport->interface->name, mISDNport->portnum); + port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force); + earlyb = mISDNport->earlyb; } else { port = NULL; @@ -1325,8 +1266,8 @@ void EndpointAppPBX::out_setup(void) } PDEBUG(DEBUG_EPOINT, "EPOINT(%d) found or created port %s\n", ea_endpoint->ep_serial, port->p_name); memset(&dialinginfo, 0, sizeof(dialinginfo)); - SCPY(dialinginfo.number, cfp); - dialinginfo.itype = INFO_ITYPE_EXTERN; + SCPY(dialinginfo.id, cfp); + dialinginfo.itype = INFO_ITYPE_ISDN; dialinginfo.ntype = e_dialinginfo.ntype; portlist = ea_endpoint->portlist_new(port->p_serial, port->p_type, earlyb); if (!portlist) @@ -1335,7 +1276,7 @@ void EndpointAppPBX::out_setup(void) delete port; goto check_anycall_intern; } -//printf("EXTERNAL caller=%s,id=%s,dial=%s\n", param.setup.networkid, param.setup.callerinfo.id, param.setup.dialinginfo.number); +//printf("EXTERNAL caller=%s,id=%s,dial=%s\n", param.setup.networkid, param.setup.callerinfo.id, param.setup.dialinginfo.id); message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_SETUP); memcpy(&message->param.setup.dialinginfo, &dialinginfo, sizeof(struct dialing_info)); memcpy(&message->param.setup.redirinfo, &e_redirinfo, sizeof(struct redir_info)); @@ -1344,19 +1285,19 @@ void EndpointAppPBX::out_setup(void) if (e_ext.clip==CLIP_HIDE && port->p_type!=PORT_TYPE_VBOX_OUT) { SCPY(message->param.setup.callerinfo.id, e_ext.callerid); - SCPY(message->param.setup.callerinfo.intern, e_ext.number); + SCPY(message->param.setup.callerinfo.extension, e_ext.number); message->param.setup.callerinfo.ntype = e_ext.callerid_type; message->param.setup.callerinfo.present = e_ext.callerid_present; } memcpy(&message->param.setup.capainfo, &e_capainfo, sizeof(struct capa_info)); //terminal SCPY(message->param.setup.from_terminal, e_ext.number); -//terminal if (e_dialinginfo.number) -//terminal SCPY(message->param.setup.to_terminal, e_dialinginfo.number); +//terminal if (e_dialinginfo.id) +//terminal SCPY(message->param.setup.to_terminal, e_dialinginfo.id); /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, port->p_type, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.voip, message->param.setup.callerinfo.intern, message->param.setup.callerinfo.name); - apply_callerid_restriction(e_ext.anon_ignore, port->p_type, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, NULL, message->param.setup.redirinfo.voip, message->param.setup.redirinfo.intern, 0); + apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name); + apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL); /* display callerid if desired for extension */ - SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.voip, message->param.setup.callerinfo.intern, message->param.setup.callerinfo.name)); + SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name)); message_put(message); logmessage(message); anycall = 1; @@ -1377,9 +1318,9 @@ void EndpointAppPBX::out_setup(void) /* *********************** external call */ default: - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) dialing external: '%s'\n", ea_endpoint->ep_serial, e_dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) dialing external: '%s'\n", ea_endpoint->ep_serial, e_dialinginfo.id); /* call to extenal interfaces */ - p = e_dialinginfo.number; + p = e_dialinginfo.id; do { number[0] = '\0'; @@ -1390,63 +1331,21 @@ void EndpointAppPBX::out_setup(void) /* found number */ PDEBUG(DEBUG_EPOINT, "EPOINT(%d) calling to number '%s' interface '%s'\n", ea_endpoint->ep_serial, number, e_dialinginfo.interfaces[0]?e_dialinginfo.interfaces:"any interface"); /* hunt for mISDNport and create Port */ - mISDNport = mISDNport_first; - port = NULL; - while(mISDNport) + /* hunt for mISDNport and create Port */ + mISDNport = hunt_port(e_dialinginfo.interfaces[0]?e_dialinginfo.interfaces:NULL, &channel); + if (mISDNport) { - /* check for external or given interface */ - if ((!e_dialinginfo.interfaces[0]&&mISDNport->iftype==IF_EXTERN) || !strcmp(mISDNport->interface_name, e_dialinginfo.interfaces)) - { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) interface '%s' found\n", ea_endpoint->ep_serial, mISDNport->interface_name); - cause = CAUSE_NOCHANNEL; /* when failing: out of channels */ - /* if PTP, skip all down links */ - if (mISDNport->ptp && !mISDNport->l2link) - { - trace_header("INTERFACE (layer 2 is down)", DIRECTION_NONE); - add_trace("interface", NULL, "%s", mISDNport->interface_name); - end_trace(); - mISDNport = mISDNport->next; - continue; - } - /* if no channel is available */ - if (mISDNport->multilink || !mISDNport->ntmode || mISDNport->ptp) - { - use = 0; - i = 0; - ii = mISDNport->b_num; - while(i < ii) - { - if (mISDNport->b_state[i]) - use++; - i++; - } - if (use >= mISDNport->b_num) - { - trace_header("INTERFACE (no free channel)", DIRECTION_NONE); - add_trace("interface", NULL, "%s", mISDNport->interface_name); - end_trace(); - mISDNport = mISDNport->next; - continue; - } - } - /* found interface */ - trace_header("INTERFACE (found)", DIRECTION_NONE); - add_trace("interface", NULL, "%s", mISDNport->interface_name); - end_trace(); - break; - } - mISDNport = mISDNport->next; - } - if (!mISDNport) + /* creating EXTERNAL port*/ + SPRINT(portname, "%s-%d-out", mISDNport->ifport->interface->name, mISDNport->portnum); + port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings, channel, mISDNport->ifport->channel_force); + earlyb = mISDNport->earlyb; + } else { trace_header("INTERFACE (too busy)", DIRECTION_NONE); add_trace("interface", NULL, "%s", e_dialinginfo.interfaces[0]?e_dialinginfo.interfaces:"any interface"); end_trace(); goto check_anycall_extern; } - /* creating EXTERNAL port*/ - SPRINT(portname, "%s-%d-out", mISDNport->interface_name, mISDNport->portnum); - port = new Pdss1((mISDNport->ntmode)?PORT_TYPE_DSS1_NT_OUT:PORT_TYPE_DSS1_TE_OUT, mISDNport, portname, &port_settings); if (!port) { PERROR("EPOINT(%d) no memory for external port, exitting\n", ea_endpoint->ep_serial); @@ -1454,10 +1353,10 @@ void EndpointAppPBX::out_setup(void) } PDEBUG(DEBUG_EPOINT, "EPOINT(%d) created port %s\n", ea_endpoint->ep_serial, port->p_name); memset(&dialinginfo, 0, sizeof(dialinginfo)); - SCPY(dialinginfo.number, number); - dialinginfo.itype = INFO_ITYPE_EXTERN; + SCPY(dialinginfo.id, number); + dialinginfo.itype = INFO_ITYPE_ISDN; dialinginfo.ntype = e_dialinginfo.ntype; - portlist = ea_endpoint->portlist_new(port->p_serial, port->p_type, mISDNport->is_earlyb); + portlist = ea_endpoint->portlist_new(port->p_serial, port->p_type, mISDNport->earlyb); if (!portlist) { PERROR("EPOINT(%d) cannot allocate port_list relation\n", ea_endpoint->ep_serial); @@ -1465,21 +1364,21 @@ void EndpointAppPBX::out_setup(void) goto check_anycall_extern; } // dss1 = (class Pdss1 *)port; -//printf("EXTERNAL caller=%s,id=%s,dial=%s\n", param.setup.networkid, param.setup.callerinfo.id, param.setup.dialinginfo.number); +//printf("EXTERNAL caller=%s,id=%s,dial=%s\n", param.setup.networkid, param.setup.callerinfo.id, param.setup.dialinginfo.id); message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_SETUP); memcpy(&message->param.setup.dialinginfo, &dialinginfo, sizeof(struct dialing_info)); - SCPY(message->param.setup.dialinginfo.number, number); + SCPY(message->param.setup.dialinginfo.id, number); memcpy(&message->param.setup.redirinfo, &e_redirinfo, sizeof(struct redir_info)); memcpy(&message->param.setup.callerinfo, &e_callerinfo, sizeof(struct caller_info)); memcpy(&message->param.setup.capainfo, &e_capainfo, sizeof(struct capa_info)); //terminal SCPY(message->param.setup.from_terminal, e_ext.number); -//terminal if (e_dialinginfo.number) -//terminal SCPY(message->param.setup.to_terminal, e_dialinginfo.number); +//terminal if (e_dialinginfo.id) +//terminal SCPY(message->param.setup.to_terminal, e_dialinginfo.id); /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, port->p_type, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.voip, message->param.setup.callerinfo.intern, message->param.setup.callerinfo.name); - apply_callerid_restriction(e_ext.anon_ignore, port->p_type, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, NULL, message->param.setup.redirinfo.voip, message->param.setup.redirinfo.intern, 0); + apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.callerinfo.id, &message->param.setup.callerinfo.ntype, &message->param.setup.callerinfo.present, &message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name); + apply_callerid_restriction(e_ext.anon_ignore, message->param.setup.redirinfo.id, &message->param.setup.redirinfo.ntype, &message->param.setup.redirinfo.present, 0, message->param.setup.redirinfo.extension, NULL); /* display callerid if desired for extension */ - SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.voip, message->param.setup.callerinfo.intern, message->param.setup.callerinfo.name)); + SCPY(message->param.setup.callerinfo.display, apply_callerid_display(message->param.setup.callerinfo.id, message->param.setup.callerinfo.itype, message->param.setup.callerinfo.ntype, message->param.setup.callerinfo.present, message->param.setup.callerinfo.screen, message->param.setup.callerinfo.extension, message->param.setup.callerinfo.name)); message_put(message); logmessage(message); anycall = 1; @@ -1708,10 +1607,10 @@ void EndpointAppPBX::hookflash(void) e_action = NULL; new_state(EPOINT_STATE_IN_OVERLAP); e_connectedmode = 1; - SCPY(e_dialinginfo.number, e_ext.prefix); - e_extdialing = e_dialinginfo.number; + SCPY(e_dialinginfo.id, e_ext.prefix); + e_extdialing = e_dialinginfo.id; e_call_pattern = 0; - if (e_dialinginfo.number[0]) + if (e_dialinginfo.id[0]) { set_tone(ea_endpoint->ep_portlist, "dialing"); process_dialing(); @@ -1731,9 +1630,6 @@ void EndpointAppPBX::port_setup(struct port_list *portlist, int message_type, un { struct message *message; char buffer[256]; - char extension[32]; - char extension1[32]; - char *p; int writeext; /* flags need to write extension after modification */ class Port *port; @@ -1746,23 +1642,22 @@ void EndpointAppPBX::port_setup(struct port_list *portlist, int message_type, un /* screen incoming caller id */ screen(0, e_callerinfo.id, sizeof(e_callerinfo.id), &e_callerinfo.ntype, &e_callerinfo.present); -colp, outclip, outcolp /* process extension */ - if (e_callerinfo.itype == INFO_ITYPE_INTERN) + if (e_callerinfo.itype == INFO_ITYPE_ISDN_EXTENSION) { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) incoming call is extension\n", ea_endpoint->ep_serial); /* port makes call from extension */ - SCPY(e_callerinfo.intern, e_callerinfo.id); - SCPY(e_ext.number, e_callerinfo.intern); + SCPY(e_callerinfo.extension, e_callerinfo.id); + SCPY(e_ext.number, e_callerinfo.extension); SCPY(e_extension_interface, e_callerinfo.interface); } else { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) incoming call is external or voip\n", ea_endpoint->ep_serial); } trace_header("SETUP", DIRECTION_IN); - if (e_callerinfo.intern[0]) - add_trace("extension", NULL, "%s", e_callerinfo.intern); + if (e_callerinfo.extension[0]) + add_trace("extension", NULL, "%s", e_callerinfo.extension); add_trace("caller id", "number", "%s", numberrize_callerinfo(e_callerinfo.id, e_callerinfo.ntype)); if (e_callerinfo.present == INFO_PRESENT_RESTRICTED) add_trace("caller id", "present", "restricted"); @@ -1772,11 +1667,11 @@ colp, outclip, outcolp if (e_redirinfo.present == INFO_PRESENT_RESTRICTED) add_trace("redir'ing", "present", "restricted"); } - if (e_dialinginfo.number) - add_trace("dialing", "number", "%s", e_dialinginfo.number)); + if (e_dialinginfo.id) + add_trace("dialing", "number", "%s", e_dialinginfo.id); end_trace(); - if (e_callerinfo.itype == INFO_ITYPE_INTERN) + if (e_callerinfo.itype == INFO_ITYPE_ISDN_EXTENSION) { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) call from extension '%s'\n", ea_endpoint->ep_serial, e_ext.number); @@ -1795,20 +1690,20 @@ colp, outclip, outcolp } writeext = 0; - /* put prefix (next) in front of e_dialinginfo.number */ + /* put prefix (next) in front of e_dialinginfo.id */ if (e_ext.next[0]) { - SPRINT(buffer, "%s%s", e_ext.next, e_dialinginfo.number); - SCPY(e_dialinginfo.number, buffer); + SPRINT(buffer, "%s%s", e_ext.next, e_dialinginfo.id); + SCPY(e_dialinginfo.id, buffer); e_ext.next[0] = '\0'; writeext = 1; } else if (e_ext.prefix[0]) { - SPRINT(buffer, "%s%s", e_ext.prefix, e_dialinginfo.number); - SCPY(e_dialinginfo.number, buffer); + SPRINT(buffer, "%s%s", e_ext.prefix, e_dialinginfo.id); + SCPY(e_dialinginfo.id, buffer); } - /* screen caller id */ + /* screen caller id by extension's config */ e_callerinfo.screen = INFO_SCREEN_NETWORK; if (e_ext.name[0]) SCPY(e_callerinfo.name, e_ext.name); @@ -1838,7 +1733,7 @@ colp, outclip, outcolp write_extension(&e_ext, e_ext.number); /* set volume of rx and tx */ - if (param->setup.callerinfo.itype == INFO_ITYPE_INTERN) + if (param->setup.callerinfo.itype == INFO_ITYPE_ISDN_EXTENSION) if (e_ext.txvol!=256 || e_ext.rxvol!=256) { message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_mISDNSIGNAL); @@ -1876,9 +1771,9 @@ colp, outclip, outcolp if (e_ruleset) e_rule = e_ruleset->rule_first; e_action = NULL; - e_extdialing = e_dialinginfo.number; + e_extdialing = e_dialinginfo.id; new_state(EPOINT_STATE_IN_SETUP); - if (e_dialinginfo.number[0]) + if (e_dialinginfo.id[0]) { set_tone(portlist, "dialing"); } else @@ -1903,7 +1798,7 @@ colp, outclip, outcolp void EndpointAppPBX::port_information(struct port_list *portlist, int message_type, union parameter *param) { trace_header("INFORMATION", DIRECTION_IN); - add_trace("dialing", NULL, "%s", param->information.number); + add_trace("dialing", NULL, "%s", param->information.id); if (param->information.sending_complete) add_trace("complete", NULL, NULL); end_trace(); @@ -1912,7 +1807,7 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty /* turn off dtmf detection, in case dtmf is sent with keypad information */ if (e_dtmf) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) received dialing information, so dtmf is now disabled, to prevent double detection by keypad+dtmf.\n", ea_endpoint->ep_serial, param->information.number, e_ext.number, e_callerinfo.id); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) received dialing information, so dtmf is now disabled, to prevent double detection by keypad+dtmf.\n", ea_endpoint->ep_serial, param->information.id, e_ext.number, e_callerinfo.id); e_dtmf = 0; } @@ -1921,7 +1816,7 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty if (e_action->index == ACTION_VBOX_PLAY) { /* concat dialing string */ - SCAT(e_dialinginfo.number, param->information.number); + SCAT(e_dialinginfo.id, param->information.id); process_dialing(); return; } @@ -1929,9 +1824,9 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty /* keypad when disconnect but in connected mode */ if (e_state==EPOINT_STATE_OUT_DISCONNECT && e_connectedmode) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) keypad information received after disconnect: %s.\n", ea_endpoint->ep_serial, param->information.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) keypad information received after disconnect: %s.\n", ea_endpoint->ep_serial, param->information.id); /* processing keypad function */ - if (param->information.number[0] == '0') + if (param->information.id[0] == '0') { hookflash(); } @@ -1941,14 +1836,14 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty /* keypad when connected */ if (e_state == EPOINT_STATE_CONNECT && e_ext.keypad) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) keypad information received during connect: %s.\n", ea_endpoint->ep_serial, param->information.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) keypad information received during connect: %s.\n", ea_endpoint->ep_serial, param->information.id); /* processing keypad function */ - if (param->information.number[0] == '0') + if (param->information.id[0] == '0') { hookflash(); } - if (param->information.number[0]) - keypad_function(param->information.number[0]); + if (param->information.id[0]) + keypad_function(param->information.id[0]); return; } if (e_state != EPOINT_STATE_IN_OVERLAP) @@ -1956,9 +1851,9 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty PDEBUG(DEBUG_EPOINT, "EPOINT(%d) ignored because we are not in overlap, or connect state.\n", ea_endpoint->ep_serial); return; } - if (!param->information.number[0]) + if (!param->information.id[0]) return; - if (e_dialinginfo.number[0]=='\0' && !e_action) + if (e_dialinginfo.id[0]=='\0' && !e_action) { set_tone(portlist, "dialing"); } @@ -1972,7 +1867,7 @@ void EndpointAppPBX::port_information(struct port_list *portlist, int message_ty set_tone(portlist, "dialing"); } /* concat dialing string */ - SCAT(e_dialinginfo.number, param->information.number); + SCAT(e_dialinginfo.id, param->information.id); process_dialing(); } @@ -1996,10 +1891,10 @@ NOTE: vbox is now handled due to overlap state if (e_action->index == ACTION_VBOX_PLAY) { /* concat dialing string */ - if (strlen(e_dialinginfo.number)+1 < sizeof(e_dialinginfo.number)) + if (strlen(e_dialinginfo.id)+1 < sizeof(e_dialinginfo.id)) { - e_dialinginfo.number[strlen(e_dialinginfo.number)+1] = '\0'; - e_dialinginfo.number[strlen(e_dialinginfo.number)] = param->dtmf; + e_dialinginfo.id[strlen(e_dialinginfo.id)+1] = '\0'; + e_dialinginfo.id[strlen(e_dialinginfo.id)] = param->dtmf; process_dialing(); } /* continue to process *X# sequences */ @@ -2079,15 +1974,15 @@ NOTE: vbox is now handled due to overlap state /* dialing using dtmf digit */ if (e_state==EPOINT_STATE_IN_OVERLAP)// && e_state==e_connectedmode) { - if (e_dialinginfo.number[0]=='\0' && !e_action) + if (e_dialinginfo.id[0]=='\0' && !e_action) { set_tone(portlist, "dialing"); } /* concat dialing string */ - if (strlen(e_dialinginfo.number)+1 < sizeof(e_dialinginfo.number)) + if (strlen(e_dialinginfo.id)+1 < sizeof(e_dialinginfo.id)) { - e_dialinginfo.number[strlen(e_dialinginfo.number)+1] = '\0'; - e_dialinginfo.number[strlen(e_dialinginfo.number)] = param->dtmf; + e_dialinginfo.id[strlen(e_dialinginfo.id)+1] = '\0'; + e_dialinginfo.id[strlen(e_dialinginfo.id)] = param->dtmf; process_dialing(); } } @@ -2118,14 +2013,14 @@ void EndpointAppPBX::port_overlap(struct port_list *portlist, int message_type, /* send what we have not dialed yet, because we had no setup complete */ PDEBUG(DEBUG_EPOINT, "EPOINT(%d) dialing pending digits: '%s'\n", ea_endpoint->ep_serial, e_dialing_queue); message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_INFORMATION); - SCPY(message->param.information.number, e_dialing_queue); + SCPY(message->param.information.id, e_dialing_queue); message->param.information.ntype = INFO_NTYPE_UNKNOWN; message_put(message); logmessage(message); e_dialing_queue[0] = '\0'; } /* check if pattern is available */ - if (!ea_endpoint->ep_portlist->next && portlist->earlyb) /* one port_list relation and tones available */ + if (!ea_endpoint->ep_portlist->next && portlist->early_b) /* one port_list relation and tones available */ { /* indicate patterns */ message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_call_id, EPOINT_TO_CALL, MESSAGE_PATTERN); @@ -2168,7 +2063,7 @@ void EndpointAppPBX::port_proceeding(struct port_list *portlist, int message_typ end_trace(); e_state = EPOINT_STATE_OUT_PROCEEDING; /* check if pattern is availatle */ - if (!ea_endpoint->ep_portlist->next && (portlist->earlyb || portlist->port_type==PORT_TYPE_VBOX_OUT)) /* one port_list relation and tones available */ + if (!ea_endpoint->ep_portlist->next && (portlist->early_b || portlist->port_type==PORT_TYPE_VBOX_OUT)) /* one port_list relation and tones available */ { /* indicate patterns */ message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_call_id, EPOINT_TO_CALL, MESSAGE_PATTERN); @@ -2210,7 +2105,7 @@ void EndpointAppPBX::port_alerting(struct port_list *portlist, int message_type, end_trace(); new_state(EPOINT_STATE_OUT_ALERTING); /* check if pattern is available */ - if (!ea_endpoint->ep_portlist->next && (portlist->earlyb || portlist->port_type==PORT_TYPE_VBOX_OUT)) /* one port_list relation and tones available */ + if (!ea_endpoint->ep_portlist->next && (portlist->early_b || portlist->port_type==PORT_TYPE_VBOX_OUT)) /* one port_list relation and tones available */ { /* indicate patterns */ message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_call_id, EPOINT_TO_CALL, MESSAGE_PATTERN); @@ -2254,8 +2149,8 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, memcpy(&e_connectinfo, ¶m->connectinfo, sizeof(e_connectinfo)); trace_header("CONNECT", DIRECTION_IN); - if (e_connectinfo.intern[0]) - add_trace("extension", NULL, "%s", e_connectinfo.intern); + if (e_connectinfo.extension[0]) + add_trace("extension", NULL, "%s", e_connectinfo.extension); add_trace("connect id", "number", "%s", numberrize_callerinfo(e_connectinfo.id, e_connectinfo.ntype)); if (e_connectinfo.present == INFO_PRESENT_RESTRICTED) add_trace("connect id", "present", "restricted"); @@ -2282,7 +2177,7 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, e_start = now; - /* screen incoming caller id */ + /* screen incoming connected id */ screen(0, e_connectinfo.id, sizeof(e_connectinfo.id), &e_connectinfo.ntype, &e_connectinfo.present); /* screen connected name */ @@ -2290,7 +2185,7 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, SCPY(e_connectinfo.name, e_ext.name); /* add internal id to colp */ - SCPY(e_connectinfo.intern, e_ext.number); + SCPY(e_connectinfo.extension, e_ext.number); /* we store the connected port number */ SCPY(e_extension_interface, e_connectinfo.interfaces); @@ -2299,8 +2194,8 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, if (portlist->port_type==PORT_TYPE_VBOX_OUT || e_ext.colp==COLP_HIDE) { SCPY(e_connectinfo.id, e_ext.callerid); - SCPY(e_connectinfo.intern, e_ext.number); - e_connectinfo.itype = INFO_ITYPE_INTERN; + SCPY(e_connectinfo.extension, e_ext.number); + e_connectinfo.itype = INFO_ITYPE_ISDN_EXTENSION; e_connectinfo.ntype = e_ext.callerid_type; e_connectinfo.present = e_ext.callerid_present; } @@ -2337,7 +2232,7 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, port = find_port_id(portlist->port_id); if (port) { - SCPY(e_connectinfo.id, nationalize_callerinfo(port->p_dialinginfo.number, &e_connectinfo.ntype)); + SCPY(e_connectinfo.id, nationalize_callerinfo(port->p_dialinginfo.id, &e_connectinfo.ntype)); e_connectinfo.present = INFO_PRESENT_ALLOWED; } } @@ -2372,13 +2267,13 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, /* put prefix in front of e_cbdialing */ SPRINT(buffer, "%s%s", e_ext.prefix, e_cbdialing); - SCPY(e_dialinginfo.number, buffer); - e_dialinginfo.itype = INFO_ITYPE_EXTERN; + SCPY(e_dialinginfo.id, buffer); + e_dialinginfo.itype = INFO_ITYPE_ISDN; e_dialinginfo.ntype = INFO_NTYPE_UNKNOWN; /* use caller id (or if exist: id_next_call) for this call */ e_callerinfo.screen = INFO_SCREEN_NETWORK; - SCPY(e_callerinfo.intern, e_ext.number); + SCPY(e_callerinfo.extension, e_ext.number); if (e_ext.id_next_call_present >= 0) { SCPY(e_callerinfo.id, e_ext.id_next_call); @@ -2405,8 +2300,8 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, e_action = &action_password_write; e_match_timeout = 0; e_match_to_action = NULL; - e_dialinginfo.number[0] = '\0'; - e_extdialing = strchr(e_dialinginfo.number, '\0'); + e_dialinginfo.id[0] = '\0'; + e_extdialing = strchr(e_dialinginfo.id, '\0'); e_password_timeout = now+20; process_dialing(); } else @@ -2416,8 +2311,8 @@ void EndpointAppPBX::port_connect(struct port_list *portlist, int message_type, if (e_ruleset) e_rule = e_ruleset->rule_first; e_action = NULL; - e_extdialing = e_dialinginfo.number; - if (e_dialinginfo.number[0]) + e_extdialing = e_dialinginfo.id; + if (e_dialinginfo.id[0]) { set_tone(portlist, "dialing"); process_dialing(); @@ -2458,7 +2353,7 @@ void EndpointAppPBX::port_disconnect_release(struct port_list *portlist, int mes /* signal to call tool */ admin_call_response(e_adminid, (message_type==MESSAGE_DISCONNECT)?ADMIN_CALL_DISCONNECT:ADMIN_CALL_RELEASE, "", param->disconnectinfo.cause, param->disconnectinfo.location, 0); - trace_header((message_type==MESSAGE_DISCONNECT)?"DISCONNECT":"RELEASE", DIRECTION_IN); + trace_header((message_type==MESSAGE_DISCONNECT)?(char *)"DISCONNECT":(char *)"RELEASE", DIRECTION_IN); add_trace("cause", "value", "%d", param->disconnectinfo.cause); add_trace("cause", "location", "%d", param->disconnectinfo.location); end_trace(); @@ -2554,9 +2449,8 @@ void EndpointAppPBX::port_disconnect_release(struct port_list *portlist, int mes int haspatterns = 0; /* check if pattern is available */ if (ea_endpoint->ep_portlist) - if (!ea_endpoint->ep_portlist->next && ea_endpoint->ep_portlist->earlyb) -#warning wie ist das bei einem asterisk, gibts auch tones? - if (callpbx_countrelations(ea_endpoint->ep_call_id)==2 // we must count relations, in order not to disturb the conference ; NOTE: + if (!ea_endpoint->ep_portlist->next && ea_endpoint->ep_portlist->early_b) + if (callpbx_countrelations(ea_endpoint->ep_call_id)==2 // we must count relations, in order not to disturb the conference ; NOTE: asterisk always counts two, since it is a point to point call && message_type != MESSAGE_RELEASE) // if we release, we are done haspatterns = 1; if (haspatterns) @@ -2697,7 +2591,7 @@ void EndpointAppPBX::port_notify(struct port_list *portlist, int message_type, u case INFO_NOTIFY_REMOTE_RETRIEVAL: case INFO_NOTIFY_USER_RESUMED: /* set volume of rx and tx */ - if (param->setup.callerinfo.itype == INFO_ITYPE_INTERN) + if (param->setup.callerinfo.itype == INFO_ITYPE_ISDN_EXTENSION) if (e_ext.txvol!=256 || e_ext.rxvol!=256) if (portlist) { @@ -2869,7 +2763,6 @@ void EndpointAppPBX::ea_message_port(unsigned long port_id, int message_type, un { struct port_list *portlist; struct message *message; - class Port *port; portlist = ea_endpoint->ep_portlist; while(portlist) @@ -2935,7 +2828,7 @@ void EndpointAppPBX::ea_message_port(unsigned long port_id, int message_type, un /* PORT sends SETUP message */ case MESSAGE_SETUP: - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) incoming call from callerid=%s, dialing=%s\n", ea_endpoint->ep_serial, param->setup.callerinfo.id, param->setup.dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) incoming call from callerid=%s, dialing=%s\n", ea_endpoint->ep_serial, param->setup.callerinfo.id, param->setup.dialinginfo.id); if (e_state!=EPOINT_STATE_IDLE) { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) ignored because we are not in idle state.\n", ea_endpoint->ep_serial); @@ -2946,7 +2839,7 @@ void EndpointAppPBX::ea_message_port(unsigned long port_id, int message_type, un /* PORT sends INFORMATION message */ case MESSAGE_INFORMATION: /* additional digits received */ - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) incoming call dialing more=%s (terminal '%s', caller id '%s')\n", ea_endpoint->ep_serial, param->information.number, e_ext.number, e_callerinfo.id); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) incoming call dialing more=%s (terminal '%s', caller id '%s')\n", ea_endpoint->ep_serial, param->information.id, e_ext.number, e_callerinfo.id); port_information(portlist, message_type, param); break; @@ -3237,7 +3130,7 @@ void EndpointAppPBX::call_connect(struct port_list *portlist, int message_type, memcpy(&message->param, param, sizeof(union parameter)); /* screen incoming caller id */ screen(1, e_connectinfo.id, sizeof(e_connectinfo.id), &e_connectinfo.ntype, &e_connectinfo.present); - memcpy(&message->param.connnectinfo, e_connectinfo); + memcpy(&message->param.connectinfo, &e_connectinfo, sizeof(e_connectinfo)); /* screen clip if prefix is required */ if (e_ext.number[0] && message->param.connectinfo.id[0] && e_ext.clip_prefix[0]) @@ -3248,16 +3141,16 @@ void EndpointAppPBX::call_connect(struct port_list *portlist, int message_type, } /* use internal caller id */ - if (e_ext.number[0] && e_connectinfo.intern[0] && (message->param.connectinfo.present!=INFO_PRESENT_RESTRICTED || e_ext.anon_ignore)) + if (e_ext.number[0] && e_connectinfo.extension[0] && (message->param.connectinfo.present!=INFO_PRESENT_RESTRICTED || e_ext.anon_ignore)) { - SCPY(message->param.connectinfo.id, e_connectinfo.intern); + SCPY(message->param.connectinfo.id, e_connectinfo.extension); message->param.connectinfo.ntype = INFO_NTYPE_UNKNOWN; } /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, portlist->port_type, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name); + apply_callerid_restriction(e_ext.anon_ignore, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name); /* display callerid if desired for extension */ - SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name)); + SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name)); /* use conp, if enabld */ if (!e_ext.centrex) @@ -3398,7 +3291,7 @@ void EndpointAppPBX::call_setup(struct port_list *portlist, int message_type, un { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) we are in setup state, so we do overlap dialing.\n", ea_endpoint->ep_serial); /* if digits changed, what we have already dialed */ - if (!!strncmp(e_dialinginfo.number,param->setup.dialinginfo.number,strlen(e_dialinginfo.number))) + if (!!strncmp(e_dialinginfo.id,param->setup.dialinginfo.id,strlen(e_dialinginfo.id))) { PDEBUG(DEBUG_EPOINT, "EPOINT(%d) we have dialed digits which have been changed or we have a new multidial, so we must redial.\n", ea_endpoint->ep_serial); /* release all ports */ @@ -3431,7 +3324,7 @@ void EndpointAppPBX::call_setup(struct port_list *portlist, int message_type, un /* if we have a pending redial, so we just adjust the dialing number */ if (e_redial) { - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) redial in progress, so we update the dialing number to %s.\n", ea_endpoint->ep_serial, param->setup.dialinginfo.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) redial in progress, so we update the dialing number to %s.\n", ea_endpoint->ep_serial, param->setup.dialinginfo.id); memcpy(&e_dialinginfo, ¶m->setup.dialinginfo, sizeof(e_dialinginfo)); return; } @@ -3446,15 +3339,15 @@ void EndpointAppPBX::call_setup(struct port_list *portlist, int message_type, un if (e_state == EPOINT_STATE_OUT_SETUP) { /* queue digits */ - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) digits '%s' are queued because we didn't receive a setup acknowledge.\n", ea_endpoint->ep_serial, param->setup.dialinginfo.number); - SCAT(e_dialing_queue, param->setup.dialinginfo.number + strlen(e_dialinginfo.number)); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) digits '%s' are queued because we didn't receive a setup acknowledge.\n", ea_endpoint->ep_serial, param->setup.dialinginfo.id); + SCAT(e_dialing_queue, param->setup.dialinginfo.id + strlen(e_dialinginfo.id)); } else { /* get what we have not dialed yet */ - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) we have already dialed '%s', we received '%s', what's left '%s'.\n", ea_endpoint->ep_serial, e_dialinginfo.number, param->setup.dialinginfo.number, param->setup.dialinginfo.number+strlen(e_dialinginfo.number)); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) we have already dialed '%s', we received '%s', what's left '%s'.\n", ea_endpoint->ep_serial, e_dialinginfo.id, param->setup.dialinginfo.id, param->setup.dialinginfo.id+strlen(e_dialinginfo.id)); message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_INFORMATION); - SCPY(message->param.information.number, param->setup.dialinginfo.number + strlen(e_dialinginfo.number)); + SCPY(message->param.information.id, param->setup.dialinginfo.id + strlen(e_dialinginfo.id)); message->param.information.ntype = INFO_NTYPE_UNKNOWN; message_put(message); logmessage(message); @@ -3470,8 +3363,8 @@ void EndpointAppPBX::call_setup(struct port_list *portlist, int message_type, un return; } /* if an internal extension is dialed, copy that number */ - if (param->setup.dialinginfo.itype==INFO_ITYPE_INTERN || param->setup.dialinginfo.itype==INFO_ITYPE_VBOX) - SCPY(e_ext.number, param->setup.dialinginfo.number); + if (param->setup.dialinginfo.itype==INFO_ITYPE_ISDN_EXTENSION || param->setup.dialinginfo.itype==INFO_ITYPE_VBOX) + SCPY(e_ext.number, param->setup.dialinginfo.id); /* if an internal extension is dialed, get extension's info about caller */ if (e_ext.number[0]) { @@ -3569,9 +3462,9 @@ void EndpointAppPBX::call_notify(struct port_list *portlist, int message_type, u message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_NOTIFY); memcpy(&message->param.notifyinfo, ¶m->notifyinfo, sizeof(struct notify_info)); /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, portlist->port_type, message->param.notifyinfo.id, &message->param.notifyinfo.ntype, &message->param.notifyinfo.present, NULL, message->param.notifyinfo.voip, message->param.notifyinfo.intern, 0); + apply_callerid_restriction(e_ext.anon_ignore, message->param.notifyinfo.id, &message->param.notifyinfo.ntype, &message->param.notifyinfo.present, 0, message->param.notifyinfo.extension, NULL); /* display callerid if desired for extension */ - SCPY(message->param.notifyinfo.display, apply_callerid_display(message->param.notifyinfo.id, message->param.notifyinfo.itype, message->param.notifyinfo.ntype, message->param.notifyinfo.present, 0, message->param.notifyinfo.voip, message->param.notifyinfo.intern, NULL)); + SCPY(message->param.notifyinfo.display, apply_callerid_display(message->param.notifyinfo.id, message->param.notifyinfo.itype, message->param.notifyinfo.ntype, message->param.notifyinfo.present, 0, message->param.notifyinfo.extension, NULL)); message_put(message); logmessage(message); portlist = portlist->next; @@ -3623,7 +3516,7 @@ void EndpointAppPBX::ea_message_call(unsigned long call_id, int message_type, un /* CALL sends INFORMATION message */ case MESSAGE_INFORMATION: - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received more digits: '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->information.number); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint with terminal '%s' (caller id '%s') received more digits: '%s'\n", ea_endpoint->ep_serial, e_ext.number, e_callerinfo.id, param->information.id); call_information(portlist, message_type, param); break; @@ -3690,7 +3583,7 @@ void EndpointAppPBX::ea_message_call(unsigned long call_id, int message_type, un /* CALL sends SETUP message */ case MESSAGE_SETUP: - PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint received setup from terminal='%s',id='%s' to id='%s' (dialing itype=%d)\n", ea_endpoint->ep_serial, param->setup.callerinfo.intern, param->setup.callerinfo.id, param->setup.dialinginfo.number, param->setup.dialinginfo.itype); + PDEBUG(DEBUG_EPOINT, "EPOINT(%d) epoint received setup from terminal='%s',id='%s' to id='%s' (dialing itype=%d)\n", ea_endpoint->ep_serial, param->setup.callerinfo.extension, param->setup.callerinfo.id, param->setup.dialinginfo.id, param->setup.dialinginfo.itype); call_setup(portlist, message_type, param); return; break; @@ -3961,9 +3854,9 @@ reject: message->param.connectinfo.itype = eapp->e_callerinfo.itype; message->param.connectinfo.ntype = eapp->e_callerinfo.ntype; /* handle restricted caller ids */ - apply_callerid_restriction(e_ext.anon_ignore, ea_endpoint->ep_portlist->port_type, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name); + apply_callerid_restriction(e_ext.anon_ignore, message->param.connectinfo.id, &message->param.connectinfo.ntype, &message->param.connectinfo.present, &message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name); /* display callerid if desired for extension */ - SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.voip, message->param.connectinfo.intern, message->param.connectinfo.name)); + SCPY(message->param.connectinfo.display, apply_callerid_display(message->param.connectinfo.id, message->param.connectinfo.itype, message->param.connectinfo.ntype, message->param.connectinfo.present, message->param.connectinfo.screen, message->param.connectinfo.extension, message->param.connectinfo.name)); message_put(message); /* we send a connect to the audio path (not for vbox) */ @@ -3972,7 +3865,7 @@ reject: message_put(message); /* beeing paranoid, we make call update */ - callpbx->c_mixer = 1; + callpbx->c_updatebridge = 1; if (options.deb & DEBUG_EPOINT) { @@ -4177,7 +4070,7 @@ void EndpointAppPBX::join_call(void) PDEBUG(DEBUG_EPOINT, "EPOINT(%d)d-call completely removed!\n"); /* mixer must update */ - our_callpbx->c_mixer = 1; /* update mixer flag */ + our_callpbx->c_updatebridge = 1; /* update mixer flag */ /* we send a retrieve to that endpoint */ // mixer will update the hold-state of the call and send it to the endpoints is changes @@ -4291,8 +4184,6 @@ int EndpointAppPBX::check_external(char **errstr, class Port **port) void EndpointAppPBX::logmessage(struct message *message) { - class Port *port; - class Pdss1 *pdss1; char *logtext = "unknown"; char buffer[64]; @@ -4306,19 +4197,19 @@ void EndpointAppPBX::logmessage(struct message *message) { case MESSAGE_SETUP: trace_header("SETUP", DIRECTION_OUT); - if (message->param.setup.callerinfo.intern[0]) - add_trace("extension", NULL, "%s", message->param.setup.callerinfo.intern); + if (message->param.setup.callerinfo.extension[0]) + add_trace("extension", NULL, "%s", message->param.setup.callerinfo.extension); add_trace("caller id", "number", "%s", numberrize_callerinfo(message->param.setup.callerinfo.id, message->param.setup.callerinfo.ntype)); if (message->param.setup.callerinfo.present == INFO_PRESENT_RESTRICTED) add_trace("caller id", "present", "restricted"); - if (message->param.setup.redirinfo.number[0]) + if (message->param.setup.redirinfo.id[0]) { add_trace("redir'ing", "number", "%s", numberrize_callerinfo(message->param.setup.redirinfo.id, message->param.setup.redirinfo.ntype)); if (message->param.setup.redirinfo.present == INFO_PRESENT_RESTRICTED) add_trace("redir'ing", "present", "restricted"); } - if (message->param.setup.dialinginfo.number[0]) - add_trace("dialing", NULL, "%s", message->param.setup.dialinginfo.number); + if (message->param.setup.dialinginfo.id[0]) + add_trace("dialing", NULL, "%s", message->param.setup.dialinginfo.id); end_trace(); break; @@ -4339,8 +4230,8 @@ void EndpointAppPBX::logmessage(struct message *message) case MESSAGE_CONNECT: trace_header("CONNECT", DIRECTION_OUT); - if (message->param.connectinfo.intern[0]) - add_trace("extension", NULL, "%s", message->param.connectinfo.intern); + if (message->param.connectinfo.extension[0]) + add_trace("extension", NULL, "%s", message->param.connectinfo.extension); add_trace("connect id", "number", "%s", numberrize_callerinfo(message->param.connectinfo.id, message->param.connectinfo.ntype)); if (message->param.connectinfo.present == INFO_PRESENT_RESTRICTED) add_trace("connect id", "present", "restricted"); @@ -4444,7 +4335,7 @@ void EndpointAppPBX::logmessage(struct message *message) trace_header("NOTIFY", DIRECTION_OUT); if (message->param.notifyinfo.notify) add_trace("indicator", NULL, "%s", logtext); - if (message->param.notifyinfo.number[0]) + if (message->param.notifyinfo.id[0]) { add_trace("redir'on", "number", "%s", numberrize_callerinfo(message->param.notifyinfo.id, message->param.notifyinfo.ntype)); if (message->param.notifyinfo.present == INFO_PRESENT_RESTRICTED) @@ -4457,7 +4348,7 @@ void EndpointAppPBX::logmessage(struct message *message) case MESSAGE_INFORMATION: trace_header("INFORMATION", DIRECTION_OUT); - add_trace("dialing", NULL, "%s", message->param.information.number); + add_trace("dialing", NULL, "%s", message->param.information.id); end_trace(); break; diff --git a/apppbx.h b/apppbx.h index d0ec28b..a3fa660 100644 --- a/apppbx.h +++ b/apppbx.h @@ -225,7 +225,8 @@ class EndpointAppPBX : public EndpointApp void keypad_function(char digit); void set_tone(struct port_list *portlist, char *tone); void out_setup(void); - char *apply_callerid_display(char *id, int itype, int ntype, int present, int screen, char *h323, char *intern, char *name); + struct mISDNport *hunt_port(char *ifname, int *channel); + char *apply_callerid_display(char *id, int itype, int ntype, int present, int screen, char *extension, char *name); void auth(int job, int bit_num); /* vbox playback stuff */ @@ -352,7 +353,7 @@ class EndpointAppPBX : public EndpointApp char *nationalize_callerinfo(char *string, int *type); char *numberrize_callerinfo(char *string, int type); -void apply_callerid_restriction(int anon_ignore, int port_type, char *id, int *ntype, int *present, int *screen, char *voip, char *intern, char *name); +void apply_callerid_restriction(int anon_ignore, char *id, int *ntype, int *present, int *screen, char *extension, char *name); void send_mail(char *filename, char *callerid, char *callerintern, char *callername, char *vbox_email, int vbox_year, int vbox_mon, int vbox_mday, int vbox_hour, int vbox_min, char *terminal); diff --git a/call.h b/call.h index ff2fc15..2315b56 100644 --- a/call.h +++ b/call.h @@ -9,7 +9,7 @@ ** ** \*****************************************************************************/ -enum { CALL_TYPE_NONE, CALL_TYPE_PBX, CALL_TYPE_CHAN}; +enum { CALL_TYPE_NONE, CALL_TYPE_PBX, CALL_TYPE_ASTERISK}; /* call * diff --git a/callchan.cpp b/callchan.cpp index 0c946c5..a3c7599 100644 --- a/callchan.cpp +++ b/callchan.cpp @@ -38,7 +38,7 @@ CallChan::CallChan(class Endpoint *epoint) : Call(epoint) PDEBUG(DEBUG_CALL, "creating new call and connecting it to the endpoint.\n"); - c_type = CALL_TYPE_CHAN; + c_type = CALL_TYPE_ASTERISK; c_epoint_id = epoint->ep_serial; PDEBUG(DEBUG_CALL, "Constructor(new call)"); diff --git a/callpbx.cpp b/callpbx.cpp index 39dc82b..7fd1a94 100644 --- a/callpbx.cpp +++ b/callpbx.cpp @@ -403,8 +403,8 @@ void CallPBX::bridge(void) */ message = message_create(c_serial, relation->epoint_id, CALL_TO_EPOINT, MESSAGE_mISDNSIGNAL); message->param.mISDNsignal.message = mISDNSIGNAL_CALLDATA; - message->param.mISDNsignal.calldata = (relnum==2 && !allmISDN); - PDEBUG(DEBUG_CALL, "call %d sets 'calldata' on port %s to %d\n", c_serial, port->p_name, calldata); + message->param.mISDNsignal.calldata = (relations==2 && !allmISDN); + PDEBUG(DEBUG_CALL, "call %d sets 'calldata' on port %s to %d\n", c_serial, port->p_name, message->param.mISDNsignal.calldata); message_put(message); relation = relation->next; @@ -597,6 +597,9 @@ int callpbx_countrelations(unsigned long call_id) if (!call) return(0); + if (call->c_type != CALL_TYPE_ASTERISK) + return(2); + if (call->c_type != CALL_TYPE_PBX) return(0); callpbx = (class CallPBX *)call; @@ -681,8 +684,7 @@ void CallPBX::message_epoint(unsigned long epoint_id, int message_type, union pa int new_state; struct message *message; // int size, writesize, oldpointer; - class Endpoint *epoint; - char *number; + char *number, *numbers; if (!epoint_id) { @@ -833,9 +835,10 @@ void CallPBX::message_epoint(unsigned long epoint_id, int message_type, union pa switch(message_type) { case MESSAGE_SETUP: - if (param->dialinginfo.itype == INFO_ITYPE_ISDN_EXTENSION) + if (param->setup.dialinginfo.itype == INFO_ITYPE_ISDN_EXTENSION) { - while(number = strsep(¶m->dialinginfo.number, ',')) + numbers = param->setup.dialinginfo.id; + while((number = strsep(&numbers, ","))) { if (out_setup(epoint_id, message_type, param, number)) return; // call destroyed @@ -938,8 +941,8 @@ int CallPBX::out_setup(unsigned long epoint_id, int message_type, union paramete relation = c_relation; while(relation) { - message = message_create(c_serial, releation->epoint_id, CALL_TO_EPOINT, MESSAGE_RELEASE); - message->param.disconnectinfo.cause = (relation->epoint_id==epoint_id)CAUSE_RESSOURCEUNAVAIL?:CAUSE_NORMAL; + message = message_create(c_serial, relation->epoint_id, CALL_TO_EPOINT, MESSAGE_RELEASE); + message->param.disconnectinfo.cause = (relation->epoint_id==epoint_id)?CAUSE_RESSOURCEUNAVAIL:CAUSE_NORMAL; message->param.disconnectinfo.location = LOCATION_PRIVATE_LOCAL; message_put(message); relation = relation->next; @@ -973,14 +976,9 @@ int CallPBX::out_setup(unsigned long epoint_id, int message_type, union paramete message = message_create(c_serial, relation->epoint_id, CALL_TO_EPOINT, message_type); memcpy(&message->param, param, sizeof(union parameter)); if (newnumber) - SCPY(message->param.setup.dialinginfo.number, newnumber); - PDEBUG(DEBUG_CALL, "setup message sent to ep %d with number='%s'.\n", relation->epoint_id, message->param.setup.dialinginfo.number); + SCPY(message->param.setup.dialinginfo.id, newnumber); + PDEBUG(DEBUG_CALL, "setup message sent to ep %d with number='%s'.\n", relation->epoint_id, message->param.setup.dialinginfo.id); message_put(message); return(0); } -todo: beim release von einem relation_type_setup muss der cause gesammelt werden, bis keine weitere setup-relation mehr existiert -beim letzten den collected cause senden -bridge kann ruhig loslegen, das aber dokumentieren -bridge überdenken: wer sendet, welche töne verfügbar sind, u.s.w - diff --git a/callpbx.h b/callpbx.h index 25e3220..c84d89a 100644 --- a/callpbx.h +++ b/callpbx.h @@ -63,6 +63,7 @@ class CallPBX : public Call char c_dialed[1024]; /* dial string of (all) number(s) */ char c_todial[32]; /* overlap dialing (part not signalled yet) */ + int c_pid; /* pid of call to generate bridge id */ int c_updatebridge; /* bridge must be updated */ struct call_relation *c_relation; /* list of endpoints that are related to the call */ diff --git a/crypt.cpp b/crypt.cpp index 65890c3..2b75792 100644 --- a/crypt.cpp +++ b/crypt.cpp @@ -1832,8 +1832,8 @@ void EndpointAppPBX::encrypt_shared(void) } /* check the key for the call */ - if (port->p_type==PORT_TYPE_DSS1_TE_OUT || port->p_type==PORT_TYPE_DSS1_NT_OUT || port->p_type==PORT_TYPE_SIP_OUT) - ret = parse_secrets((char *)e_ext.number, (char *)port->p_dialinginfo.number, &auth_pointer, &crypt_pointer, &key_pointer); + if (port->p_type==PORT_TYPE_DSS1_TE_OUT || port->p_type==PORT_TYPE_DSS1_NT_OUT) + ret = parse_secrets((char *)e_ext.number, (char *)port->p_dialinginfo.id, &auth_pointer, &crypt_pointer, &key_pointer); else { if (!port->p_callerinfo.id[0]) diff --git a/dss1.cpp b/dss1.cpp index 095f8ff..452c775 100644 --- a/dss1.cpp +++ b/dss1.cpp @@ -36,7 +36,7 @@ extern "C" { */ Pdss1::Pdss1(int type, struct mISDNport *mISDNport, char *portname, struct port_settings *settings, int channel, int exclusive) : PmISDN(type, mISDNport, portname, settings, channel, exclusive) { - p_callerinfo.itype = (mISDNport->ifport->interface->extension)?INFO_ITYPE_ISDN:INFO_ITYPE_ISDN_EXTENSION; + p_callerinfo.itype = (mISDNport->ifport->interface->extension)?INFO_ITYPE_ISDN_EXTENSION:INFO_ITYPE_ISDN; p_m_d_ntmode = mISDNport->ntmode; p_m_d_l3id = 0; p_m_d_ces = -1; @@ -469,7 +469,7 @@ int Pdss1::hunt_bchannel(int channel, int exclusive) } use_channel: add_trace("conclusion", NULL, "channel available"); - add_trace("connect", "channel", "%d", p_m_b_channel); + add_trace("connect", "channel", "%d", channel); end_trace(); return(channel); } @@ -518,7 +518,7 @@ void Pdss1::setup_ind(unsigned long prim, unsigned long dinfo, void *data) l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN); dec_ie_calling_pn(setup->CALLING_PN, (Q931_info_t *)((unsigned long)data+headerlen), &calling_type, &calling_plan, &calling_present, &calling_screen, (unsigned char *)p_callerinfo.id, sizeof(p_callerinfo.id)); - dec_ie_called_pn(setup->CALLED_PN, (Q931_info_t *)((unsigned long)data+headerlen), &called_type, &called_plan, (unsigned char *)p_dialinginfo.number, sizeof(p_dialinginfo.number)); + dec_ie_called_pn(setup->CALLED_PN, (Q931_info_t *)((unsigned long)data+headerlen), &called_type, &called_plan, (unsigned char *)p_dialinginfo.id, sizeof(p_dialinginfo.id)); dec_ie_keypad(setup->KEYPAD, (Q931_info_t *)((unsigned long)data+headerlen), (unsigned char *)keypad, sizeof(keypad)); #ifdef CENTREX /* te-mode: CNIP (calling name identification presentation) */ @@ -596,7 +596,7 @@ void Pdss1::setup_ind(unsigned long prim, unsigned long dinfo, void *data) SCPY(p_callerinfo.interface, p_m_mISDNport->ifport->interface->name); /* dialing information */ - SCAT(p_dialinginfo.number, (char *)keypad); + SCAT(p_dialinginfo.id, (char *)keypad); switch (called_type) { case 0x1: @@ -808,12 +808,12 @@ void Pdss1::information_ind(unsigned long prim, unsigned long dinfo, void *data) struct message *message; l1l2l3_trace_header(p_m_mISDNport, this, prim, DIRECTION_IN); - dec_ie_called_pn(information->CALLED_PN, (Q931_info_t *)((unsigned long)data+headerlen), &type, &plan, (unsigned char *)p_dialinginfo.number, sizeof(p_dialinginfo.number)); + dec_ie_called_pn(information->CALLED_PN, (Q931_info_t *)((unsigned long)data+headerlen), &type, &plan, (unsigned char *)p_dialinginfo.id, sizeof(p_dialinginfo.id)); dec_ie_keypad(information->KEYPAD, (Q931_info_t *)((unsigned long)data+headerlen), (unsigned char *)keypad, sizeof(keypad)); dec_ie_complete(information->COMPLETE, (Q931_info_t *)((unsigned long)data+headerlen), &p_dialinginfo.sending_complete); end_trace(); - SCAT(p_dialinginfo.number, (char *)keypad); + SCAT(p_dialinginfo.id, (char *)keypad); switch (type) { case 0x1: @@ -1120,16 +1120,20 @@ void Pdss1::connect_ind(unsigned long prim, unsigned long dinfo, void *data) p_connectinfo.isdn_port = p_m_portnum; SCPY(p_connectinfo.interfaces, p_m_mISDNport->ifport->interface->name); - /* send connect acknowledge */ - dmsg = create_l3msg(CC_CONNECT | RESPONSE, MT_CONNECT, dinfo, sizeof(CONNECT_ACKNOWLEDGE_t), p_m_d_ntmode); - connect_acknowledge = (CONNECT_ACKNOWLEDGE_t *)(dmsg->data + headerlen); - l1l2l3_trace_header(p_m_mISDNport, this, CC_CONNECT | RESPONSE, DIRECTION_OUT); - /* if we had no bchannel before, we send it now */ - if (!bchannel_before && p_m_b_channel) - enc_ie_channel_id(&connect_acknowledge->CHANNEL_ID, dmsg, 1, p_m_b_channel); - end_trace(); - msg_queue_tail(&p_m_mISDNport->downqueue, dmsg); - + /* only in nt-mode we send connect ack. in te-mode it is done by stack itself or optional */ + if (p_m_d_ntmode) + { + /* send connect acknowledge */ + dmsg = create_l3msg(CC_CONNECT | RESPONSE, MT_CONNECT, dinfo, sizeof(CONNECT_ACKNOWLEDGE_t), p_m_d_ntmode); + connect_acknowledge = (CONNECT_ACKNOWLEDGE_t *)(dmsg->data + headerlen); + l1l2l3_trace_header(p_m_mISDNport, this, CC_CONNECT | RESPONSE, DIRECTION_OUT); + /* if we had no bchannel before, we send it now */ + if (!bchannel_before && p_m_b_channel) + enc_ie_channel_id(&connect_acknowledge->CHANNEL_ID, dmsg, 1, p_m_b_channel); + end_trace(); + msg_queue_tail(&p_m_mISDNport->downqueue, dmsg); + } + message = message_create(p_serial, ACTIVE_EPOINT(p_epointlist), PORT_TO_EPOINT, MESSAGE_CONNECT); memcpy(&message->param.connectinfo, &p_connectinfo, sizeof(struct connect_info)); message_put(message); @@ -1155,7 +1159,7 @@ void Pdss1::disconnect_ind(unsigned long prim, unsigned long dinfo, void *data) cause = 16; /* release if we are remote sends us no tones */ - if (p_m_mISDNport->is_earlyb) + if (p_m_mISDNport->earlyb) { RELEASE_t *release; msg_t *dmsg; @@ -1719,7 +1723,7 @@ void Pdss1::resume_ind(unsigned long prim, unsigned long dinfo, void *data) PERROR("no memory for epointlist\n"); exit(-1); } - if (!(epoint->portlist_new(p_serial, p_type, p_m_mISDNport->is_earlyb))) + if (!(epoint->portlist_new(p_serial, p_type, p_m_mISDNport->earlyb))) { PERROR("no memory for portlist\n"); exit(-1); @@ -2032,7 +2036,7 @@ int Pdss1::handler(void) { int ret; - if ((ret = Port::handler())) + if ((ret = PmISDN::handler())) return(ret); /* handle destruction */ @@ -2056,12 +2060,12 @@ void Pdss1::message_information(unsigned long epoint_id, int message_id, union p INFORMATION_t *information; msg_t *dmsg; - if (param->information.number[0]) /* only if we have something to dial */ + if (param->information.id[0]) /* only if we have something to dial */ { dmsg = create_l3msg(CC_INFORMATION | REQUEST, MT_INFORMATION, p_m_d_l3id, sizeof(INFORMATION_t), p_m_d_ntmode); information = (INFORMATION_t *)(dmsg->data + headerlen); l1l2l3_trace_header(p_m_mISDNport, this, CC_INFORMATION | REQUEST, DIRECTION_OUT); - enc_ie_called_pn(&information->CALLED_PN, dmsg, 0, 1, (unsigned char *)param->information.number); + enc_ie_called_pn(&information->CALLED_PN, dmsg, 0, 1, (unsigned char *)param->information.id); end_trace(); msg_queue_tail(&p_m_mISDNport->downqueue, dmsg); } @@ -2251,9 +2255,9 @@ void Pdss1::message_setup(unsigned long epoint_id, int message_id, union paramet if (type >= 0) enc_ie_calling_pn(&setup->CALLING_PN, dmsg, type, plan, present, screen, (unsigned char *)p_callerinfo.id); /* dialing information */ - if (p_dialinginfo.number[0]) /* only if we have something to dial */ + if (p_dialinginfo.id[0]) /* only if we have something to dial */ { - enc_ie_called_pn(&setup->CALLED_PN, dmsg, 0, 1, (unsigned char *)p_dialinginfo.number); + enc_ie_called_pn(&setup->CALLED_PN, dmsg, 0, 1, (unsigned char *)p_dialinginfo.id); } /* sending complete */ if (p_dialinginfo.sending_complete) @@ -2513,7 +2517,7 @@ void Pdss1::message_overlap(unsigned long epoint_id, int message_id, union param if (p_capainfo.bearer_capa==INFO_BC_SPEECH || p_capainfo.bearer_capa==INFO_BC_AUDIO || p_capainfo.bearer_capa==INFO_BC_DATAUNRESTRICTED_TONES) - if (p_m_mISDNport->is_tones) + if (p_m_mISDNport->tones) enc_ie_progress(&setup_acknowledge->PROGRESS, dmsg, 0, p_m_d_ntmode?1:5, 8); end_trace(); msg_queue_tail(&p_m_mISDNport->downqueue, dmsg); @@ -2539,7 +2543,7 @@ void Pdss1::message_proceeding(unsigned long epoint_id, int message_id, union pa if (p_capainfo.bearer_capa==INFO_BC_SPEECH || p_capainfo.bearer_capa==INFO_BC_AUDIO || p_capainfo.bearer_capa==INFO_BC_DATAUNRESTRICTED_TONES) - if (p_m_mISDNport->is_tones) + if (p_m_mISDNport->tones) enc_ie_progress(&proceeding->PROGRESS, dmsg, 0, p_m_d_ntmode?1:5, 8); end_trace(); msg_queue_tail(&p_m_mISDNport->downqueue, dmsg); @@ -2586,7 +2590,7 @@ void Pdss1::message_alerting(unsigned long epoint_id, int message_id, union para if (p_capainfo.bearer_capa==INFO_BC_SPEECH || p_capainfo.bearer_capa==INFO_BC_AUDIO || p_capainfo.bearer_capa==INFO_BC_DATAUNRESTRICTED_TONES) - if (p_m_mISDNport->is_tones) + if (p_m_mISDNport->tones) enc_ie_progress(&alerting->PROGRESS, dmsg, 0, p_m_d_ntmode?1:5, 8); end_trace(); msg_queue_tail(&p_m_mISDNport->downqueue, dmsg); @@ -2735,7 +2739,7 @@ void Pdss1::message_disconnect(unsigned long epoint_id, int message_id, union pa char *p = NULL; /* we reject during incoming setup when we have no tones. also if we are in outgoing setup state */ - if ((p_state==PORT_STATE_IN_SETUP && !p_m_mISDNport->is_tones) + if ((p_state==PORT_STATE_IN_SETUP && !p_m_mISDNport->tones) || p_state==PORT_STATE_OUT_SETUP) { /* sending release to endpoint */ @@ -2790,7 +2794,7 @@ void Pdss1::message_disconnect(unsigned long epoint_id, int message_id, union pa if (p_capainfo.bearer_capa==INFO_BC_SPEECH || p_capainfo.bearer_capa==INFO_BC_AUDIO || p_capainfo.bearer_capa==INFO_BC_DATAUNRESTRICTED_TONES) - if (p_m_mISDNport->is_tones) + if (p_m_mISDNport->tones) enc_ie_progress(&disconnect->PROGRESS, dmsg, 0, p_m_d_ntmode?1:5, 8); /* send cause */ enc_ie_cause(&disconnect->CAUSE, dmsg, (p_m_d_ntmode && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause); @@ -2889,7 +2893,7 @@ void Pdss1::message_release(unsigned long epoint_id, int message_id, union param if (p_capainfo.bearer_capa==INFO_BC_SPEECH || p_capainfo.bearer_capa==INFO_BC_AUDIO || p_capainfo.bearer_capa==INFO_BC_DATAUNRESTRICTED_TONES) - if (p_m_mISDNport->is_tones) + if (p_m_mISDNport->tones) enc_ie_progress(&disconnect->PROGRESS, dmsg, 0, p_m_d_ntmode?1:5, 8); /* send cause */ enc_ie_cause(&disconnect->CAUSE, dmsg, (p_m_d_ntmode && param->disconnectinfo.location==LOCATION_PRIVATE_LOCAL)?LOCATION_PRIVATE_LOCAL:param->disconnectinfo.location, param->disconnectinfo.cause); diff --git a/endpoint.cpp b/endpoint.cpp index 1e66143..53d2149 100644 --- a/endpoint.cpp +++ b/endpoint.cpp @@ -69,7 +69,7 @@ Endpoint::Endpoint(int port_id, int call_id) if (port) { if ((port->p_type&PORT_CLASS_mISDN_MASK) == PORT_CLASS_mISDN_DSS1) - earlyb = ((class PmISDN *)port)->p_m_mISDNport->is_earlyb; + earlyb = ((class PmISDN *)port)->p_m_mISDNport->earlyb; if (!portlist_new(port_id, port->p_type, earlyb)) { PERROR("no mem for portlist, exitting...\n"); diff --git a/extension.h b/extension.h index 4a09d7f..f62eb96 100644 --- a/extension.h +++ b/extension.h @@ -140,7 +140,6 @@ struct extension { int display_cause; /* clear cause using display message */ int display_ext; /* display external caller ids */ int display_int; /* display internal caller ids */ - int display_voip; /* display h323 caller ids */ int display_fake; /* display fake caller ids */ int display_anon; /* display anonymouse caller ids */ int display_menu; /* display menu */ diff --git a/genext.c b/genext.c index f26b8f8..cab89ad 100644 --- a/genext.c +++ b/genext.c @@ -1,6 +1,6 @@ /*****************************************************************************\ ** ** -** PBX4Linux ** +** LCR ** ** ** **---------------------------------------------------------------------------** ** Copyright: Andreas Eversberg ** diff --git a/genrc.c b/genrc.c index 7b69cca..8cb5b00 100644 --- a/genrc.c +++ b/genrc.c @@ -1,6 +1,6 @@ /*****************************************************************************\ ** ** -** PBX4Linux ** +** LCR ** ** ** **---------------------------------------------------------------------------** ** Copyright: Andreas Eversberg ** @@ -51,7 +51,7 @@ int main(void) char protocol[1024], layermask[1024], types[256]; printf("\n\nThis program generates a script, which is used to start/stop/restart mISDN\n"); - printf("driver. All configuration of cards is done for using with the PBX.\n"); + printf("driver. All configuration of cards is done for using with the LCR.\n"); while(i < (int)sizeof(mode)) /* number of cards */ { @@ -67,7 +67,7 @@ int main(void) ptp[i] = 0; do { - printf("\nIs your port #%d connected to point-to-multipoint line/phone, which supports multiple\ntelephones (Mehrgeräteanschluss) OR is it a point-to-point link which is used\nfor PBX and supports extension dialing (Anlagenanschluss)?\n[ptp | ptm]: ", i+1); fflush(stdout); + printf("\nIs your port #%d connected to point-to-multipoint line/phone, which supports multiple\ntelephones (Mehrgeräteanschluss) OR is it a point-to-point link which is used\nfor LCR and supports extension dialing (Anlagenanschluss)?\n[ptp | ptm]: ", i+1); fflush(stdout); scanf("%s", input); } while (!!strcmp(input,"ptp") && !!strcmp(input,"ptm")); ptp[i] = (input[2]=='p')?1:0; @@ -152,16 +152,16 @@ int main(void) n = i; - printf("\nWhere do you like to load the modules from, enter 0 for default, 1 for\n'/usr/local/pbx/modules/' or the full path.\n[0 | 1 | ]: "); fflush(stdout); + printf("\nWhere do you like to load the modules from, enter 0 for default, 1 for\n'/usr/local/lcr/modules/' or the full path.\n[0 | 1 | ]: "); fflush(stdout); scanf("%s", input); if (!strcmp(input, "0")) SCPY(input, ""); if (!strcmp(input, "1")) - SCPY(input, "/usr/local/pbx/modules"); + SCPY(input, "/usr/local/lcr/modules"); if (input[0]) if (input[strlen(input)-1] != '/') SCAT(input, "/"); - printf("\n\nFinally tell me where to write the mISDN rc file.\Enter the name 'mISDN' for current directory.\nYou may want to say '/usr/local/pbx/mISDN' or '/etc/rc.d/mISDN'\n: "); fflush(stdout); + printf("\n\nFinally tell me where to write the mISDN rc file.\Enter the name 'mISDN' for current directory.\nYou may want to say '/usr/local/lcr/mISDN' or '/etc/rc.d/mISDN'\n: "); fflush(stdout); scanf("%s", name); if (!(fp=fopen(name, "w"))) { diff --git a/ie.cpp b/ie.cpp index 0ac73a4..b27920f 100644 --- a/ie.cpp +++ b/ie.cpp @@ -526,7 +526,7 @@ void Pdss1::dec_ie_calling_pn(unsigned char *p, Q931_info_t *qi, int *type, int add_trace("calling_pn", "plan", "%d", *plan); add_trace("calling_pn", "present", "%d", *present); add_trace("calling_pn", "screen", "%d", *screen); - add_trace("calling_pn", "number", "%s", *number); + add_trace("calling_pn", "number", "%s", number); } diff --git a/interface.c b/interface.c index 2fe7b2c..7b90d15 100644 --- a/interface.c +++ b/interface.c @@ -256,7 +256,6 @@ static int inter_port(struct interface *interface, char *filename, int line, cha { struct interface_port *ifport, **ifportp; struct interface *searchif; - struct interface_port *searchport; int val; val = get_number(value); @@ -269,7 +268,7 @@ static int inter_port(struct interface *interface, char *filename, int line, cha searchif = interface_newlist; while(searchif) { - searchport = searchif->ifport; + ifport = searchif->ifport; while(ifport) { if (ifport->portnum == val) @@ -883,7 +882,7 @@ struct interface *read_interfaces(void) parameter[strlen(parameter)-1] = '\0'; /* check if interface name already exists */ - interface = interface_first; + interface = interface_newlist; while(interface) { if (!strcasecmp(interface->name, parameter+1)) @@ -921,10 +920,12 @@ struct interface *read_interfaces(void) { if (ifparam->func(interface, filename, line, parameter, value)) goto error; - continue; + break; } ifparam++; } + if (ifparam->name) + continue; SPRINT(interface_error, "Error in %s (line %d): unknown parameter: '%s'.\n", filename, line, parameter); goto error; @@ -1092,38 +1093,52 @@ void relink_interfaces(void) { if (!ifport->mISDNport) { - /* open new port */ - mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp); - if (mISDNport) - { - ifport->mISDNport = mISDNport; - mISDNport->ifport = ifport; - } - } - if (ifport->mISDNport) - { - /* default channel selection list */ - if (!ifport->out_channel) - default_out_channel(ifport); - if (!ifport->in_channel) - default_in_channel(ifport); - /* default is_tones */ - if (ifport->interface->is_tones) - ifport->mISDNport->is_tones = (ifport->interface->is_tones==IS_YES); - else - ifport->mISDNport->is_tones = (ifport->mISDNport->ntmode)?1:0; - /* default is_earlyb */ - if (ifport->interface->is_earlyb) - ifport->mISDNport->is_earlyb = (ifport->interface->is_earlyb==IS_YES); - else - ifport->mISDNport->is_earlyb = (ifport->mISDNport->ntmode)?0:1; + load_port(ifport); } + ifport = ifport->next; } interface = interface->next; } } + +/* + * load port + */ +void load_port(struct interface_port *ifport) +{ + struct mISDNport *mISDNport; + + /* open new port */ + mISDNport = mISDNport_open(ifport->portnum, ifport->ptp, ifport->ptmp, ifport->interface); + if (mISDNport) + { + /* link port */ + ifport->mISDNport = mISDNport; + mISDNport->ifport = ifport; + + /* default channel selection list */ + if (!ifport->out_channel) + default_out_channel(ifport); + if (!ifport->in_channel) + default_in_channel(ifport); + /* default is_tones */ + if (ifport->interface->is_tones) + ifport->mISDNport->tones = (ifport->interface->is_tones==IS_YES); + else + ifport->mISDNport->tones = (ifport->mISDNport->ntmode)?1:0; + /* default is_earlyb */ + if (ifport->interface->is_earlyb) + ifport->mISDNport->earlyb = (ifport->interface->is_earlyb==IS_YES); + else + ifport->mISDNport->earlyb = (ifport->mISDNport->ntmode)?0:1; + } else + { + ifport->block = 2; /* not available */ + } +} + /* * give summary of interface syntax */ @@ -1151,4 +1166,3 @@ void doc_interface(void) } } - diff --git a/interface.h b/interface.h index ce15094..c7dac41 100644 --- a/interface.h +++ b/interface.h @@ -109,6 +109,7 @@ extern char interface_error[256]; struct interface *read_interfaces(void); void free_interfaces(struct interface *interface_start); void relink_interfaces(void); +void load_port(struct interface_port *ifport); void doc_interface(void); diff --git a/mISDN.cpp b/mISDN.cpp index cf70697..d82e513 100644 --- a/mISDN.cpp +++ b/mISDN.cpp @@ -141,9 +141,9 @@ void chan_trace_header(struct mISDNport *mISDNport, class PmISDN *port, char *ms { /* init trace with given values */ start_trace(mISDNport?mISDNport->portnum:0, - mISDNport?mISDNport->ifport->interface:NULL, + (mISDNport)?((mISDNport->ifport)?mISDNport->ifport->interface:NULL):NULL, port?numberrize_callerinfo(port->p_callerinfo.id, port->p_callerinfo.ntype):NULL, - port?port->p_dialinginfo.number:NULL, + port?port->p_dialinginfo.id:NULL, direction, CATEGORY_CH, port?port->p_serial:0, @@ -245,7 +245,7 @@ void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsign start_trace(mISDNport?mISDNport->portnum:0, mISDNport?mISDNport->ifport->interface:NULL, port?numberrize_callerinfo(port->p_callerinfo.id, port->p_callerinfo.ntype):NULL, - port?port->p_dialinginfo.number:NULL, + port?port->p_dialinginfo.id:NULL, direction, CATEGORY_CH, port?port->p_serial:0, @@ -304,15 +304,15 @@ static int _bchannel_create(struct mISDNport *mISDNport, int i) mISDN_pid_t pid; int ret; - if (mISDNport->b_stid[i]) + if (!mISDNport->b_stid[i]) { - PERROR("Error: no stack for index"); - return(-1); + PERROR("Error: no stack for index %d\n", i); + return(0); } if (mISDNport->b_addr[i]) { - PERROR("Error: stack already created"); - return(-1); + PERROR("Error: stack already created for index %d\n", i); + return(0); } /* create new layer */ @@ -363,15 +363,15 @@ static int _bchannel_create(struct mISDNport *mISDNport, int i) goto stack_error; chan_trace_header(mISDNport, mISDNport->b_port[i], "BCHANNEL create stack", DIRECTION_OUT); add_trace("channel", NULL, "%d", i+1+(i>=15)); - add_trace("stack", "id", "%d", mISDNport->b_stid[i]); - add_trace("stack", "address", "%d", mISDNport->b_addr[i]); + add_trace("stack", "id", "0x%8x", mISDNport->b_stid[i]); + add_trace("stack", "address", "0x%8x", mISDNport->b_addr[i]); end_trace(); - return(0); + return(1); failed: mISDNport->b_addr[i] = 0; - return(-1); + return(0); } @@ -466,8 +466,8 @@ static void _bchannel_destroy(struct mISDNport *mISDNport, int i) chan_trace_header(mISDNport, mISDNport->b_port[i], "BCHANNEL remove stack", DIRECTION_OUT); add_trace("channel", NULL, "%d", i+1+(i>=15)); - add_trace("stack", "id", "%d", mISDNport->b_stid[i]); - add_trace("stack", "address", "%d", mISDNport->b_addr[i]); + add_trace("stack", "id", "0x%8x", mISDNport->b_stid[i]); + add_trace("stack", "address", "0x%8x", mISDNport->b_addr[i]); end_trace(); /* remove our stack only if set */ PDEBUG(DEBUG_BCHANNEL, "free stack (b_addr=0x%x)\n", mISDNport->b_addr[i]); @@ -533,14 +533,15 @@ All actions taken on these events depend on the current bchannel's state and if void bchannel_event(struct mISDNport *mISDNport, int i, int event) { int state = mISDNport->b_state[i]; - + +printf("event=%d state=%d\n", event, state); switch(event) { case B_EVENT_ACTIVATE: - /* port may not be used by any other bchannel */ - if (mISDNport->b_port[i]) + /* port must be linked in order to allow activation */ + if (!mISDNport->b_port[i]) { - PERROR("SOFTWARE ERROR: bchannel must not be linked to a Port class\n"); + PERROR("SOFTWARE ERROR: bchannel must be linked to a Port class\n"); exit(-1); } switch(state) @@ -775,7 +776,7 @@ int PmISDN::handler(void) inbuffer = (p_m_fromup_buffer_writep - p_m_fromup_buffer_readp) & FROMUP_BUFFER_MASK; /* send tone data to isdn device only if we have data */ - if (p_tone_fh>=0 || p_tone_fetched || p_m_crypt_msg_loops || inbuffer) + if (p_tone_name[0] || p_m_crypt_msg_loops || inbuffer) { /* calculate how much to transmit */ if (!p_last_tv_sec) @@ -793,13 +794,14 @@ int PmISDN::handler(void) } if (elapsed >= ISDN_TRANSMIT) { - unsigned char buf[mISDN_HEADER_LEN+ISDN_PRELOAD], *p = buf; + unsigned char buf[mISDN_HEADER_LEN+ISDN_PRELOAD]; iframe_t *frm = (iframe_t *)buf; + unsigned char *p = buf+mISDN_HEADER_LEN; p_last_tv_sec = now_tv.tv_sec; p_last_tv_msec = now_tv.tv_usec/1000; - /* read tones */ + /* read tones or fill with silence */ length = read_audio(p, elapsed); /* @@ -810,6 +812,7 @@ int PmISDN::handler(void) */ if (inbuffer) { + printf("nix\n"); /* inbuffer might be less than we skip due to audio */ if (inbuffer <= length) { @@ -840,6 +843,7 @@ int PmISDN::handler(void) /* overwrite buffer with crypto stuff */ if (p_m_crypt_msg_loops) { + printf("nix2\n"); /* send pending message */ int tosend; @@ -853,7 +857,7 @@ int PmISDN::handler(void) length = tosend; /* copy message (part) to buffer */ - memcpy(buf, p_m_crypt_msg+p_m_crypt_msg_current, tosend); + memcpy(p, p_m_crypt_msg+p_m_crypt_msg_current, tosend); p_m_crypt_msg_current += tosend; if (p_m_crypt_msg_current == p_m_crypt_msg_len) { @@ -865,7 +869,6 @@ int PmISDN::handler(void) frm->addr = p_m_mISDNport->b_addr[p_m_b_index] | FLG_MSG_DOWN; frm->dinfo = 0; frm->len = length; - memcpy(&frm->data.p, buf, length); mISDN_write(mISDNdevice, frm, mISDN_HEADER_LEN+frm->len, TIMEOUT_1SEC); if (p_debug_nothingtosend) @@ -1009,7 +1012,7 @@ void PmISDN::bchannel_receive(iframe_t *frm) * the call is connected OR tones feature is enabled. */ if (p_state!=PORT_STATE_CONNECT - && !p_m_mISDNport->is_tones) + && !p_m_mISDNport->tones) return; #if 0 @@ -1501,6 +1504,10 @@ int mISDN_handler(void) mISDNport = mISDNport->next; } + /* no device, no read */ + if (mISDNdevice < 0) + return(0); + /* get message from kernel */ if (!(msg = alloc_msg(MAX_MSG_SIZE))) return(1); @@ -1525,6 +1532,7 @@ int mISDN_handler(void) /* global prim */ switch(frm->prim) { + case MGR_DELLAYER | CONFIRM: case MGR_INITTIMER | CONFIRM: case MGR_ADDTIMER | CONFIRM: case MGR_DELTIMER | CONFIRM: @@ -1776,7 +1784,7 @@ int mISDN_handler(void) /* * global function to add a new card (port) */ -struct mISDNport *mISDNport_open(int port, int ptp, int ptmp) +struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface *interface) { int ret; unsigned char buff[1025]; @@ -1911,7 +1919,7 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp) /* add mISDNport structure */ mISDNportp = &mISDNport_first; while(*mISDNportp) - mISDNportp = &mISDNport->next; + mISDNportp = &((*mISDNportp)->next); mISDNport = (struct mISDNport *)calloc(1, sizeof(struct mISDNport)); if (!mISDNport) { @@ -2075,7 +2083,7 @@ struct mISDNport *mISDNport_open(int port, int ptp, int ptmp) PDEBUG(DEBUG_BCHANNEL, "using 'mISDN_dsp.o' module\n"); start_trace(mISDNport->portnum, - mISDNport->ifport->interface, + interface, NULL, NULL, DIRECTION_NONE, @@ -2126,21 +2134,25 @@ void mISDNport_close(struct mISDNport *mISDNport) port = port->next; } - start_trace(mISDNport->portnum, - mISDNport->ifport->interface, - NULL, - NULL, - DIRECTION_NONE, - CATEGORY_CH, - 0, - "PORT (close)"); - end_trace(); + /* only if we are already part of interface */ + if (mISDNport->ifport) + { + start_trace(mISDNport->portnum, + mISDNport->ifport->interface, + NULL, + NULL, + DIRECTION_NONE, + CATEGORY_CH, + 0, + "PORT (close)"); + end_trace(); + } /* free bchannels */ i = 0; while(i < mISDNport->b_num) { - if (mISDNport->b_stid[i]) + if (mISDNport->b_addr[i]) { _bchannel_destroy(mISDNport, i); PDEBUG(DEBUG_BCHANNEL, "freeing %s port %d bchannel (index %d).\n", (mISDNport->ntmode)?"NT":"TE", mISDNport->portnum, i); @@ -2171,9 +2183,8 @@ void mISDNport_close(struct mISDNport *mISDNport) PDEBUG(DEBUG_BCHANNEL, "freeing d-stack.\n"); if (mISDNport->d_stid) { -// mISDN_clear_stack(mISDNdevice, mISDNport->d_stid); - if (mISDNport->lower_id) - mISDN_write_frame(mISDNdevice, buf, mISDNport->lower_id, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); + if (mISDNport->upper_id) + mISDN_write_frame(mISDNdevice, buf, mISDNport->upper_id | FLG_MSG_DOWN, MGR_DELLAYER | REQUEST, 0, 0, NULL, TIMEOUT_1SEC); } /* remove from list */ @@ -2183,12 +2194,13 @@ void mISDNport_close(struct mISDNport *mISDNport) if (*mISDNportp == mISDNport) { *mISDNportp = (*mISDNportp)->next; + mISDNportp = NULL; break; } mISDNportp = &((*mISDNportp)->next); } - if (!(*mISDNportp)) + if (mISDNportp) { PERROR("software error, mISDNport not in list\n"); exit(-1); diff --git a/mISDN.h b/mISDN.h index 1798b88..e8df862 100644 --- a/mISDN.h +++ b/mISDN.h @@ -46,8 +46,8 @@ struct mISDNport { int use; /* counts the number of port that uses this port */ int ntmode; /* is TRUE if port is nt mode */ int pri; /* is TRUE if port is a primary rate interface */ - int is_tones; /* TRUE if tones are sent outside connect state */ - int is_earlyb; /* TRUE if tones are received outside connect state */ + int tones; /* TRUE if tones are sent outside connect state */ + int earlyb; /* TRUE if tones are received outside connect state */ int upper_id; /* id to transfer data down */ int lower_id; /* id to transfer data up */ int d_stid; @@ -79,7 +79,7 @@ calls with no bchannel (call waiting, call on hold). /* mISDN none-object functions */ void mISDN_port_info(void); -struct mISDNport *mISDNport_open(int port, int ptp, int ptmp); +struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, struct interface *interface); void mISDNport_close_all(void); void mISDNport_close(struct mISDNport *mISDNport); void mISDN_port_reorder(void); diff --git a/main.c b/main.c index c97e69d..770ecb1 100644 --- a/main.c +++ b/main.c @@ -66,7 +66,7 @@ int last_debug = 0; int debug_newline = 1; int nooutput = 0; -static void debug(const char *function, int line, char *prefix, char *buffer) +void debug(const char *function, int line, char *prefix, char *buffer) { /* if we have a new debug count, we add a mark */ if (last_debug != debug_count) @@ -169,7 +169,7 @@ void sighandler(int sigset) schedp.sched_priority = 0; sched_setscheduler(0, SCHED_OTHER, &schedp); } - fprintf(stderr, "PBX: Signal received: %d\n", sigset); + fprintf(stderr, "LCR: Signal received: %d\n", sigset); PERROR("Signal received: %d\n", sigset); } } @@ -178,18 +178,8 @@ void sighandler(int sigset) /* * the main */ -#ifdef VOIP -#define ARGC (args.GetCount()+1) -#define ARGV(a) (args[a-1]) -void PBXMain::Main(void) -{ - PArgList &args = GetArguments(); -#else -#define ARGC (argc) -#define ARGV(a) (argv[a]) int main(int argc, char *argv[]) { -#endif int ret = -1; int lockfd = -1; /* file lock */ struct message *message; @@ -218,13 +208,13 @@ int main(int argc, char *argv[]) printf("\n** %s Version %s\n\n", NAME, VERSION_STRING); /* show options */ - if (ARGC <= 1) + if (argc <= 1) { usage: printf("\n"); - printf("Usage: pbx (query | start | fork | rules | route)\n"); + printf("Usage: lcr (query | start | fork | rules | route)\n"); printf("query = Show available isdn ports.\n"); - printf("start = Run pbx normally, abort with CTRL+C.\n"); + printf("start = Run lcr normally, abort with CTRL+C.\n"); printf("fork = Do daemon fork and run as background process.\n"); printf("interface = Get help of available interface syntax.\n"); printf("rules = Get help of available routing rule syntax.\n"); @@ -266,7 +256,7 @@ int main(int argc, char *argv[]) created_mutexe = 1; /* show interface */ - if (!(strcasecmp(ARGV(1),"interface"))) + if (!(strcasecmp(argv[1],"interface"))) { doc_interface(); ret = 0; @@ -274,18 +264,18 @@ int main(int argc, char *argv[]) } /* show rules */ - if (!(strcasecmp(ARGV(1),"rules"))) + if (!(strcasecmp(argv[1],"rules"))) { - if (ARGC <= 2) + if (argc <= 2) doc_rules(NULL); else - doc_rules(ARGV(2)); + doc_rules(argv[2]); ret = 0; goto free; } /* query available isdn ports */ - if (!(strcasecmp(ARGV(1),"query"))) + if (!(strcasecmp(argv[1],"query"))) { mISDN_port_info(); ret = 0; @@ -327,7 +317,7 @@ int main(int argc, char *argv[]) #if 0 /* query available isdn ports */ - if (!(strcasecmp(ARGV(1),"route"))) + if (!(strcasecmp(argv[1],"route"))) { ruleset_debug(ruleset_first); ret = 0; @@ -336,7 +326,7 @@ int main(int argc, char *argv[]) #endif /* do fork in special cases */ - if (!(strcasecmp(ARGV(1),"fork"))) + if (!(strcasecmp(argv[1],"fork"))) { pid_t pid; @@ -365,27 +355,27 @@ int main(int argc, char *argv[]) } if (pid != 0) { - printf("PBX: Starting daemon.\n"); + printf("LCR: Starting daemon.\n"); exit(0); } nooutput = 1; } else /* if not start */ - if (!!strcasecmp(ARGV(1),"start")) + if (!!strcasecmp(argv[1],"start")) { goto usage; } /* create lock and lock! */ - if ((lockfd = open("/var/run/pbx.lock", O_CREAT, 0)) < 0) + if ((lockfd = open("/var/run/lcr.lock", O_CREAT, 0)) < 0) { - fprintf(stderr, "Cannot create lock file: /var/run/pbx.lock\n"); + fprintf(stderr, "Cannot create lock file: /var/run/lcr.lock\n"); goto free; } if (flock(lockfd, LOCK_EX|LOCK_NB) < 0) { if (errno == EWOULDBLOCK) - fprintf(stderr, "PBX: Another PBX process is running. Please kill the other one.\n"); + fprintf(stderr, "LCR: Another LCR process is running. Please kill the other one.\n"); else fprintf(stderr, "Locking process failed: errno=%d\n", errno); goto free; } @@ -417,7 +407,6 @@ int main(int argc, char *argv[]) } relink_interfaces(); interface_first = interface_newlist; - free_interfaces(interface_newlist); interface_newlist = NULL; /* locking memory paging */ @@ -693,7 +682,7 @@ BUDETECT idletime += 4000; } } - printf("PBX terminated\n"); + printf("LCR terminated\n"); ret=0; /* free all */ @@ -811,7 +800,7 @@ free: /* take me out */ if (ret) - printf("PBX: Exit (code %d)\n", ret); + printf("LCR: Exit (code %d)\n", ret); #ifdef VOIP return; #else diff --git a/main.h b/main.h index 62241fb..723d51c 100644 --- a/main.h +++ b/main.h @@ -1,6 +1,6 @@ /*****************************************************************************\ ** ** -** PBX4Linux ** +** LCR ** ** ** **---------------------------------------------------------------------------** ** Copyright: Andreas Eversberg ** @@ -9,11 +9,11 @@ ** ** \*****************************************************************************/ -#define NAME "PBX4Linux" +#define NAME "LCR" #define DEFAULT_ENDPOINT_APP EndpointAppPBX -#define VERSION_STRING "3.6 (Januar 2006)" +#define VERSION_STRING "0.1 (August 2007)" extern int memuse; extern int mmemuse; @@ -32,6 +32,7 @@ extern int fhuse; #define PERROR_RUNTIME(fmt, arg...) _printerror(NULL, 0, fmt, ## arg) void _printdebug(const char *function, int line, unsigned long mask, const char *fmt, ...); void _printerror(const char *function, int line, const char *fmt, ...); +void debug(const char *function, int line, char *prefix, char *buffer); #define DEBUG_CONFIG 0x0001 #define DEBUG_MSG 0x0002 diff --git a/message.h b/message.h index e34e2f3..fc00c02 100644 --- a/message.h +++ b/message.h @@ -141,7 +141,7 @@ struct caller_info { /* call-info structure DIALING */ struct dialing_info { - char number[256]; /* number dialing (so far) */ + char id[256]; /* number dialing (so far) */ char interfaces[128]; /* interfaces for extenal calls */ int itype; /* type of interface */ int ntype; /* type of number */ @@ -151,7 +151,6 @@ struct dialing_info { /* call-info structure CONNECT */ struct connect_info { char id[32]; /* id of caller (user number) */ - char voip[64]; /* URI of voip (or gateway) */ char extension[32]; /* internal id */ char name[16]; int isdn_port; /* internal/external port (if call is isdn) */ @@ -173,8 +172,7 @@ struct disconnect_info { /* call-info structure REDIR */ struct redir_info { char id[32]; /* id of caller (user number) */ - char voip[64]; /* host of voip (or gateway) */ - char intern[32]; /* internal id */ + char extension[32]; /* internal id */ int isdn_port; /* internal/external port (if call is isdn) */ int itype; /* type of interface */ int ntype; /* type of number */ @@ -196,8 +194,7 @@ struct capa_info { struct notify_info { int notify; /* notifications (see INFO_NOTIFY_*) */ char id[32]; /* redirection id (user number) */ - char voip[64]; /* host of voip (or gateway) */ - char intern[32]; /* internal id */ + char extension[32]; /* internal id */ int isdn_port; /* internal/external port (if call is isdn) */ int itype; /* type of interface */ int ntype; /* type of number */ diff --git a/options.c b/options.c index 3e5dda8..16813f6 100644 --- a/options.c +++ b/options.c @@ -15,7 +15,7 @@ #include "main.h" struct options options = { - "/usr/local/pbx/log", /* log file */ + "/usr/local/lcr/log", /* log file */ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/port.cpp b/port.cpp index 1c0f63e..abd480d 100644 --- a/port.cpp +++ b/port.cpp @@ -825,9 +825,9 @@ void Port::close_record(int beep) PDEBUG(DEBUG_PORT, "data still in record buffer: %d (dir %d)\n", (p_record_buffer_writep - p_record_buffer_readp) & RECORD_BUFFER_MASK, p_record_buffer_dir); memcpy(&callerinfo, &p_callerinfo, sizeof(struct caller_info)); - apply_callerid_restriction(p_record_anon_ignore, -1, callerinfo.id, &callerinfo.ntype, &callerinfo.present, &callerinfo.screen, NULL/*callerinfo.voip*/, callerinfo.extension, callerinfo.name); + apply_callerid_restriction(p_record_anon_ignore, callerinfo.id, &callerinfo.ntype, &callerinfo.present, &callerinfo.screen, callerinfo.extension, callerinfo.name); - SCPY(number, p_dialinginfo.number); + SCPY(number, p_dialinginfo.id); SCPY(callerid, numberrize_callerinfo(callerinfo.id, callerinfo.ntype)); if (callerid[0] == '\0') { diff --git a/route.c b/route.c index c992686..97c61a6 100644 --- a/route.c +++ b/route.c @@ -2047,7 +2047,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) goto match_string; case MATCH_DIALING: - string = e_dialinginfo.number; + string = e_dialinginfo.id; goto match_string_prefix; case MATCH_ENBLOCK: @@ -2387,7 +2387,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) /* set timeout in the furture */ e_match_timeout = timeout; e_match_to_action = rule->action_first; - e_match_to_extdialing = e_dialinginfo.number + dialing_required; + e_match_to_extdialing = e_dialinginfo.id + dialing_required; match = 0; /* matches in the future */ } if (match == 1) @@ -2396,7 +2396,7 @@ struct route_action *EndpointAppPBX::route(struct route_ruleset *ruleset) action = rule->action_first; e_match_timeout = 0; /* no timeout */ e_match_to_action = NULL; - e_extdialing = e_dialinginfo.number + dialing_required; + e_extdialing = e_dialinginfo.id + dialing_required; break; } if (match == 2) diff --git a/todo.txt b/todo.txt index 7f3651c..81cacd2 100644 --- a/todo.txt +++ b/todo.txt @@ -20,6 +20,13 @@ display message during nothing/play Port -> Channel Call -> Link +connect_acknowledge + + +maybe: + +delay - per param setzen, lokal als mISDNsignal und remote mittels setup + old stuff.... diff --git a/trace.c b/trace.c index ebe117d..e5e9a2e 100644 --- a/trace.c +++ b/trace.c @@ -11,9 +11,8 @@ #include "main.h" -trace auch ein printdebug struct trace trace; -char trace_string[MX_TRACE_ELEMENTS * 100 + 400]; +char trace_string[MAX_TRACE_ELEMENTS * 100 + 400]; static char *spaces[11] = { " ", @@ -37,10 +36,10 @@ void start_trace(int port, struct interface *interface, char *caller, char *dial { if (trace.name[0]) PERROR("trace already started (name=%s)\n", trace.name); - memset(trace, 0, sizeof(struct trace)); + memset(&trace, 0, sizeof(struct trace)); trace.port = port; - if (interface) if (interface[0]) - SCPY(trace.interface, interface); + if (interface) + SCPY(trace.interface, interface->name); if (caller) if (caller[0]) SCPY(trace.caller, caller); if (dialing) if (dialing[0]) @@ -60,7 +59,7 @@ void start_trace(int port, struct interface *interface, char *caller, char *dial * if subelement is given, element will also contain a subelement * if multiple subelements belong to same element, name must be equal for all subelements */ -void add_trace(char *name, char *sub, const char *fmt, ...); +void add_trace(char *name, char *sub, const char *fmt, ...) { va_list args; @@ -73,7 +72,7 @@ void add_trace(char *name, char *sub, const char *fmt, ...); if (!name[0]) { nostring: - PERROR("trace with name=%s gets element with no string\n", trace->name); + PERROR("trace with name=%s gets element with no string\n", trace.name); return; } @@ -84,7 +83,7 @@ void add_trace(char *name, char *sub, const char *fmt, ...); if (fmt) if (fmt[0]) { va_start(args, fmt); - VUNPRINT(trace.element[trace.element].value, sizeof(trace.element[trace.elements].value)-1, fmt, args); + VUNPRINT(trace.element[trace.elements].value, sizeof(trace.element[trace.elements].value)-1, fmt, args); va_end(args); } @@ -94,51 +93,33 @@ void add_trace(char *name, char *sub, const char *fmt, ...); /* - * trace ends - * this function will put the trace to sockets and logfile, if requested - */ -void end_trace(void); -{ - if (!trace.name[0]) - PERROR("trace not started\n"); - - /* process log file */ - if (options.log[0]) - { - string = print_trace(1, 0, NULL, NULL, NULL, -1, "AP", CATEGORY_EP); - fwrite(string, strlen(string), 1, fp); - if (options.deb) - debug(NULL, 0, "trace", string); - } - - memset(trace, 0, sizeof(struct trace)); -} - - -/* * prints trace to socket or log * detail: 1 = brief, 2=short, 3=long */ -static char *print_trace(int detail, int port, char *interface, char *caller, char *dialing, int category); +static char *print_trace(int detail, int port, char *interface, char *caller, char *dialing, int category) { - trace_string[0] = '\0'; char buffer[256]; + time_t ti = trace.sec; struct tm *tm; + struct mISDNport *mISDNport; + int i; + + trace_string[0] = '\0'; // always clear string if (detail < 1) - return; + return(NULL); /* filter trace */ if (port && trace.port) - if (port != trace.port) return; - if (interface && interface[0] && trace.interface[0]) - if (!!strcasecmp(interface, trace.interface)) return; - if (caller && caller[0] && trace.caller[0]) - if (!!strcasecmp(caller, trace.caller)) return; - if (dialing && dialing[0] && trace.dialing[0]) - if (!!strcasecmp(dialing, trace.dialing)) return; - if (category && category[0] && trace.category[0]) - if (!!strcasecmp(category, trace.category)) return; + if (port != trace.port) return(NULL); + if (interface) if (interface[0] && trace.interface[0]) + if (!!strcasecmp(interface, trace.interface)) return(NULL); + if (caller) if (caller[0] && trace.caller[0]) + if (!!strcasecmp(caller, trace.caller)) return(NULL); + if (dialing) if (dialing[0] && trace.dialing[0]) + if (!!strcasecmp(dialing, trace.dialing)) return(NULL); + if (category && trace.category) + if (category != trace.category) return(NULL); /* head */ if (detail >= 3) @@ -149,12 +130,12 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch mISDNport = mISDNport_first; while(mISDNport) { - if (mISDNport->number == trace.port) + if (mISDNport->portnum == trace.port) break; mISDNport = mISDNport->next; } if (mISDNport) - SPRINT(buffer, "Port: %d (%s %s %s)", port, (mISDNport->pri)?"PRI":"BRI", (mISDNport->ptp)?"PTP":"PTMP", (mISDNport->nt)?"NT":"TE"); + SPRINT(buffer, "Port: %d (%s %s %s)", port, (mISDNport->pri)?"PRI":"BRI", (mISDNport->ptp)?"PTP":"PTMP", (mISDNport->ntmode)?"NT":"TE"); else SPRINT(buffer, "Port: %d (does not exist}\n", port); SCAT(trace_string, buffer); @@ -178,8 +159,8 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch SCAT(trace_string, " Caller: ---\n"); /* "Time: 25.08.73 05:14:39.282" */ - tm = localtime(&trace.sec); - SPRINT(buffer, "Time: %02d.%02d.%02d %02d:%02d:%02d.%03d", tm->tm_mday, tm->tm_mon+1, tm->tm_year%100, tm->tm_hour, tm->tm_min, tm->tm_sec, trace->usec/1000); + tm = localtime(&ti); + SPRINT(buffer, "Time: %02d.%02d.%02d %02d:%02d:%02d.%03d", tm->tm_mday, tm->tm_mon+1, tm->tm_year%100, tm->tm_hour, tm->tm_min, tm->tm_sec, trace.usec/1000); SCAT(trace_string, buffer); if (trace.direction) @@ -232,14 +213,14 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch buffer[0] = '\0'; SCAT(trace_string, buffer); if (trace.element[i].sub[0]) - SPRINT(buffer, " %s=", trace.element[i].sub, value); + SPRINT(buffer, " %s=", trace.element[i].sub); else - SPRINT(buffer, " ", value); + SPRINT(buffer, " "); SCAT(trace_string, buffer); - if (strchr(value, ' ')) - SPRINT(buffer, "'%s'", value); + if (strchr(trace.element[i].value, ' ')) + SPRINT(buffer, "'%s'", trace.element[i].value); else - SPRINT(buffer, "%s", value); + SPRINT(buffer, "%s", trace.element[i].value); SCAT(trace_string, buffer); i++; } @@ -257,14 +238,14 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch SPRINT(buffer, " "); SCAT(trace_string, buffer); if (trace.element[i].sub[0]) - SPRINT(buffer, " : %s%s = ", trace.element[i].sub, spaces[strlen(trace.element[i].sub)], value); + SPRINT(buffer, " : %s%s = ", trace.element[i].sub, spaces[strlen(trace.element[i].sub)]); else - SPRINT(buffer, " : ", value); + SPRINT(buffer, " : "); SCAT(trace_string, buffer); - if (strchr(value, ' ')) - SPRINT(buffer, "'%s'\n", value); + if (strchr(trace.element[i].value, ' ')) + SPRINT(buffer, "'%s'\n", trace.element[i].value); else - SPRINT(buffer, "%s\n", value); + SPRINT(buffer, "%s\n", trace.element[i].value); SCAT(trace_string, buffer); i++; } @@ -274,12 +255,38 @@ static char *print_trace(int detail, int port, char *interface, char *caller, ch /* end */ if (detail >= 3) SCAT(trace_string, "\n"); + return(trace_string); +} + + +/* + * trace ends + * this function will put the trace to sockets and logfile, if requested + */ +void end_trace(void) +{ + char *string; + + if (!trace.name[0]) + PERROR("trace not started\n"); + + /* process log file */ + if (options.deb) + { + string = print_trace(1, 0, NULL, NULL, NULL, 0); + if (string) + { + debug(NULL, 0, "trace", string); + } + } +printf("%s", print_trace(3, 0, NULL, NULL, NULL, 0)); +#warning trace auch zum socket +// fwrite(string, strlen(string), 1, fp); + + memset(&trace, 0, sizeof(struct trace)); } -^todo: -socket -file open diff --git a/trace.h b/trace.h index 816f660..54fdefe 100644 --- a/trace.h +++ b/trace.h @@ -10,8 +10,8 @@ \*****************************************************************************/ struct trace_element { - char name[10]; - char sub[10]; + char name[11]; + char sub[11]; char value[64]; }; @@ -26,7 +26,7 @@ struct trace { unsigned long sec, usec; /* type */ - char category[4]; + int category; int serial; char name[64]; diff --git a/vbox.cpp b/vbox.cpp index bbd0c50..4585680 100644 --- a/vbox.cpp +++ b/vbox.cpp @@ -227,7 +227,7 @@ int VBoxPort::message_epoint(unsigned long epoint_id, int message_id, union para /* get apppbx */ memcpy(&p_vbox_ext, &((class EndpointAppPBX *)(epoint->ep_app))->e_ext, sizeof(p_vbox_ext)); /* extract optional announcement file */ - if ((c = strchr(param->setup.dialinginfo.number, ','))) + if ((c = strchr(param->setup.dialinginfo.id, ','))) { if (c[1] == '/') SPRINT(filename, c+1); @@ -238,7 +238,7 @@ int VBoxPort::message_epoint(unsigned long epoint_id, int message_id, union para { SPRINT(filename, "%s/%s/%s/vbox/announcement", INSTALL_DATA, options.extensions_dir, p_vbox_ext.number); } - PDEBUG(DEBUG_VBOX, "PORT(%s) vbox port received setup from '%s' to '%s'\n", p_name, param->setup.callerinfo.id, param->setup.dialinginfo.number); + PDEBUG(DEBUG_VBOX, "PORT(%s) vbox port received setup from '%s' to '%s'\n", p_name, param->setup.callerinfo.id, param->setup.dialinginfo.id); memcpy(&p_callerinfo, ¶m->setup.callerinfo, sizeof(p_callerinfo)); memcpy(&p_redirinfo, ¶m->setup.redirinfo, sizeof(p_redirinfo)); /* link relation */ @@ -254,7 +254,7 @@ int VBoxPort::message_epoint(unsigned long epoint_id, int message_id, union para } /* copy setup infos to port */ - SCPY(p_vbox_extension, param->setup.dialinginfo.number); + SCPY(p_vbox_extension, param->setup.dialinginfo.id); /* create connect info */ SCPY(p_connectinfo.id, p_vbox_extension);