Added bridgin support for GSM and SIP
[lcr.git] / action.cpp
index aa83304..e0a884d 100644 (file)
@@ -74,6 +74,7 @@ void EndpointAppPBX::action_dialing_internal(void)
        struct capa_info        capainfo;
        struct caller_info      callerinfo;
        struct redir_info       redirinfo;
+       struct rtp_info         rtpinfo;
        struct dialing_info     dialinginfo;
        struct port_list        *portlist = ea_endpoint->ep_portlist;
        struct lcr_msg          *message;
@@ -91,6 +92,7 @@ void EndpointAppPBX::action_dialing_internal(void)
        memcpy(&capainfo, &e_capainfo, sizeof(capainfo));
        memcpy(&callerinfo, &e_callerinfo, sizeof(callerinfo));
        memcpy(&redirinfo, &e_redirinfo, sizeof(redirinfo));
+       memcpy(&rtpinfo, &e_rtpinfo, sizeof(rtpinfo));
        memset(&dialinginfo, 0, sizeof(dialinginfo));
        dialinginfo.itype = INFO_ITYPE_ISDN_EXTENSION;
        SCPY(dialinginfo.id, e_dialinginfo.id);
@@ -111,6 +113,8 @@ void EndpointAppPBX::action_dialing_internal(void)
                        capainfo.bearer_mode = INFO_BMODE_PACKET;
                }
                capainfo.bearer_info1 = INFO_INFO1_NONE;
+               capainfo.hlc = INFO_HLC_NONE;
+               capainfo.exthlc = INFO_HLC_NONE;
        }
        if ((rparam = routeparam(e_action, PARAM_BMODE))) {
                capainfo.bearer_mode = rparam->integer_value;
@@ -162,6 +166,7 @@ void EndpointAppPBX::action_dialing_internal(void)
        memcpy(&message->param.setup.redirinfo, &redirinfo, sizeof(struct redir_info));
        memcpy(&message->param.setup.callerinfo, &callerinfo, sizeof(struct caller_info));
        memcpy(&message->param.setup.capainfo, &capainfo, sizeof(struct capa_info));
+       memcpy(&message->param.setup.rtpinfo, &rtpinfo, sizeof(struct rtp_info));
        message_put(message);
 }
 
@@ -172,6 +177,7 @@ void EndpointAppPBX::action_dialing_external(void)
        struct capa_info capainfo;
        struct caller_info callerinfo;
        struct redir_info redirinfo;
+       struct rtp_info rtpinfo;
        struct dialing_info dialinginfo;
        char *p;
        struct port_list *portlist = ea_endpoint->ep_portlist;
@@ -204,9 +210,10 @@ void EndpointAppPBX::action_dialing_external(void)
        memcpy(&capainfo, &e_capainfo, sizeof(capainfo));
        memcpy(&callerinfo, &e_callerinfo, sizeof(callerinfo));
        memcpy(&redirinfo, &e_redirinfo, sizeof(redirinfo));
+       memcpy(&rtpinfo, &e_rtpinfo, sizeof(rtpinfo));
        memset(&dialinginfo, 0, sizeof(dialinginfo));
        dialinginfo.itype = INFO_ITYPE_ISDN;
-       dialinginfo.sending_complete = 0;
+//     dialinginfo.sending_complete = 0;
        SCPY(dialinginfo.id, e_extdialing);
 
        /* process prefix */
@@ -221,8 +228,6 @@ void EndpointAppPBX::action_dialing_external(void)
 
        /* process number complete */
        if ((rparam = routeparam(e_action, PARAM_COMPLETE)))
-               if ((rparam = routeparam(e_action, PARAM_PREFIX)))
-                       SCPY(dialinginfo.id, rparam->string_value);
                dialinginfo.sending_complete = 1;
 
        /* process number type */
@@ -237,6 +242,8 @@ void EndpointAppPBX::action_dialing_external(void)
                        capainfo.bearer_mode = INFO_BMODE_PACKET;
                }
                capainfo.bearer_info1 = INFO_INFO1_NONE;
+               capainfo.hlc = INFO_HLC_NONE;
+               capainfo.exthlc = INFO_HLC_NONE;
        }
        if ((rparam = routeparam(e_action, PARAM_BMODE))) {
                capainfo.bearer_mode = rparam->integer_value;
@@ -309,6 +316,8 @@ void EndpointAppPBX::action_dialing_external(void)
        /* add or update outgoing call */
        trace_header("ACTION extern (calling)", DIRECTION_NONE);
        add_trace("number", NULL, dialinginfo.id);
+       if (dialinginfo.sending_complete)
+       add_trace("number", "complete", "yes");
        if (dialinginfo.interfaces[0])
                add_trace("interfaces", NULL, dialinginfo.interfaces);
        end_trace();
@@ -317,6 +326,7 @@ void EndpointAppPBX::action_dialing_external(void)
        memcpy(&message->param.setup.redirinfo, &redirinfo, sizeof(struct redir_info));
        memcpy(&message->param.setup.callerinfo, &callerinfo, sizeof(struct caller_info));
        memcpy(&message->param.setup.capainfo, &capainfo, sizeof(struct capa_info));
+       memcpy(&message->param.setup.rtpinfo, &rtpinfo, sizeof(struct rtp_info));
        message_put(message);
 }
 
@@ -1961,7 +1971,7 @@ void EndpointAppPBX::action_execute(void)
        int iWaitStatus;
        char *command = (char *)"";
        char isdn_port[10];
-       char *argv[11]; /* check also number of args below */
+       char *argv[12]; /* check also number of args below */
        int i = 0;
 
        /* get script / command */
@@ -1972,9 +1982,11 @@ void EndpointAppPBX::action_execute(void)
                end_trace();
                return;
        }
+#if 0
        argv[i++] = (char *)"/bin/sh";
        argv[i++] = (char *)"-c";
        argv[i++] = command;
+#endif
        argv[i++] = command;
        if ((rparam = routeparam(e_action, PARAM_PARAM))) {
                argv[i++] = rparam->string_value;
@@ -1985,6 +1997,7 @@ void EndpointAppPBX::action_execute(void)
        argv[i++] = e_callerinfo.name;
        SPRINT(isdn_port, "%d", e_callerinfo.isdn_port);
        argv[i++] = isdn_port;
+       argv[i++] = e_callerinfo.imsi;
        argv[i++] = NULL; /* check also number of args above */
        switch (pid = fork ()) {
                case -1:
@@ -1994,12 +2007,10 @@ void EndpointAppPBX::action_execute(void)
                case 0:
                        /* To be shure there are no zombies created double fork */
                        if ((pid2 = fork()) == 0) {
-                               execve("/bin/sh", argv, environ);
-                       }
-                       else {
-                               /* Exit immediately and release the waiting parent. The subprocess falls to init because the parent died */
-                               exit(0);
+                               execve(command, argv, environ);
                        }
+                       /* Exit immediately and release the waiting parent. The subprocess falls to init because the parent died */
+                       exit(0);
                        break;
                default:
                        trace_header("ACTION execute", DIRECTION_NONE);
@@ -2278,11 +2289,12 @@ void EndpointAppPBX::process_dialing(int timeout)
                }
 
                gettimeofday(&current_time, NULL);
-               if (timeout && TIME_SMALLER(&e_match_timeout.timeout, &current_time)) {
+               if (e_match_to_action && TIME_SMALLER(&e_match_timeout.timeout, &current_time)) {
                        /* 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.id, e_ruleset->name);
                        unsched_timer(&e_match_timeout);
                        e_action = e_match_to_action;
+                       e_match_to_action = NULL;
                        e_extdialing = e_match_to_extdialing;
                        trace_header("ROUTING (timeout)", DIRECTION_NONE);
                        add_trace("action", NULL, "%s", action_defs[e_action->index].name);