i have a problem with AGI in Asterisk 1.0.5, the problem occurs either
with PHP or C AGI scripts/programs. Well, its simple,
either asterisk is not sending correctly the command responses to the
standard output, or for some unknown reason to me the
scripts/programs are not able to read it from standard input.

I have the next C test program for AGI:

#include <stdio.h>
main()
{
        char line[80];
        setlinebuf(stdout);
        setlinebuf(stderr);
        while (1) 
        {
                fgets(line,80,stdin);
                if ( strlen(line) <= 1 )
                {
                        break;
                }
        }
        printf("SAY NUMBER 55 \"\"\n");
        fgets(line,80,stdin);
        
        printf("SAY NUMBER 66 \"\"\n");
        fgets(line,80,stdin);
        
 }
 
 I currently have 2 servers with Asterisk. The problematic one, as i
said is running Asterisk 1.0.5, the other server
 is running Asterisk 1.0.0, and it run the C test perfectly, the
problematic one just run the first command, never reach
 the secondth command (SAY NUMBER 66).
 
 I have a PHP test a little bit more meaningfull, because it says a
lot of things of what is going on, besides im PHP programmer
 not C one, so i feel more comfortable with it. The test code is:
 
 <?php
include_once 
'/var/www/localhost/htdocs/ivsadmin/apps/pavoz/classes/AgiTest.php';
$agi = new AgiTest();
die();
?>

i guess the code before doesnt say anything :p , the class AgiTest code is:

<?php
class AgiTest
{
        private $read_bytes                     = 80;
        private $asterisk_environment_variables = array();
        private $log_stream                     = null;
        
        public function __construct()
        {
                $this->log_stream = fopen('/var/log/pavoz/asterisk','w');
                //reading asterisk initial variables and writing them to log
                $this->ReceiveAsteriskEnvironmentVariables();
                
                //now we try to execute a command, and track the point of error
                $command  = "SAY NUMBER 55 \"\"";
                $this->ExecuteCommand($command);
                
                $command  = "SAY NUMBER 66 \"\"";
                $this->ExecuteCommand($command);
                return true;
        }
        
        public function __destruct()
        {
                fclose($this->log_stream);
        }
        
        private function WriteLog($Message)
        {
                return fwrite($this->log_stream, $Message."\n");
        }
        
        private function ReadStdin($Bytes = null)
        {
                $Bytes = $Bytes === null ? $this->read_bytes : $Bytes;
                $this->WriteLog("\nReading {$Bytes} bytes response from 
Asterisk...");
                $response = fgets(STDIN, $Bytes);
                $this->WriteLog("Received response: {$response}");
                return $response;
        }
        
        private function WriteStdout($String)
        {
                $escaped_string = str_replace("\n", '\n', $String);
                $this->WriteLog("\nSending string {$escaped_string} to 
Asterisk...");
                $bytes = fwrite(STDOUT, $String);
                fflush(STDOUT);
                $this->WriteLog("Wroten bytes to STDOUT: {$bytes}");
                return $bytes;
        }
        
        private function ReceiveAsteriskEnvironmentVariables()
        {
                do
                {
                        $asterisk_string       = $this->ReadStdin();
                        if ( $asterisk_string != "\n" )
                        {
                                $delimiter_position                             
  =
strpos($asterisk_string,':');
                                $data_name                                      
  =
substr($asterisk_string, 0, $delimiter_position);
                                $data_value                                     
  =
substr($asterisk_string, $delimiter_position + 1);
                                
$this->asterisk_environment_variables[$data_name] = trim($data_value);
                        }
                } while ( $asterisk_string != "\n" );
                return true;
        }
        
        public function GetAsteriskEnvironmentVariable($VariableName)
        {
                if ( 
array_key_exists($VariableName,$this->asterisk_environment_variables) )
                {
                        return 
$this->asterisk_environment_variables[$VariableName];
                }
                else
                {
                        return false;
                }
        }
        
        public function ExecuteCommand($Command)
        {
                $Command .= "\n";
                $bytes    = $this->WriteStdout($Command);
                $response = $this->ReadStdin();
                return $response;
        }
}
?>

As you can see, the test is exactly the same, in fact, the output to
the asterisk console is the same, but here i can log the communication
between Asterisk and my PHP script. The log output in the file defined
in the script is:

Reading 80 bytes response from Asterisk...
Received response: agi_request: agi_cdr.php


Reading 80 bytes response from Asterisk...
Received response: agi_channel: SIP/12-d91b


Reading 80 bytes response from Asterisk...
Received response: agi_language: en


Reading 80 bytes response from Asterisk...
Received response: agi_type: SIP


Reading 80 bytes response from Asterisk...
Received response: agi_uniqueid: 1111659738.1


Reading 80 bytes response from Asterisk...
Received response: agi_callerid: "Moises Silva" <12>


Reading 80 bytes response from Asterisk...
Received response: agi_dnid: 10


Reading 80 bytes response from Asterisk...
Received response: agi_rdnis: unknown


Reading 80 bytes response from Asterisk...
Received response: agi_context: macro-root


Reading 80 bytes response from Asterisk...
Received response: agi_extension: s


Reading 80 bytes response from Asterisk...
Received response: agi_priority: 4


Reading 80 bytes response from Asterisk...
Received response: agi_enhanced: 0.0


Reading 80 bytes response from Asterisk...
Received response: agi_accountcode:


Reading 80 bytes response from Asterisk...
Received response:


Sending string SAY NUMBER 55 ""\n to Asterisk...
Wroten bytes to STDOUT: 17

Reading 80 bytes response from Asterisk...
Received response:

Sending string SAY NUMBER 66 ""\n to Asterisk...
Wroten bytes to STDOUT: 0

Reading 80 bytes response from Asterisk...
Received response:


As we can see, the initial data is received well by the script, but,
after executing a command, is not possible to read the response. But
even worse, the script hangs until i hangup the phone. It stays in the
same point, the line where i attempt to read with fread(); the
response from Asterisk.

this is the output with the same script in the server that is running correctly

Reading 80 bytes response from Asterisk...
Received response: agi_request: agi_test.php


Reading 80 bytes response from Asterisk...
Received response: agi_channel: SIP/13-b3d1


Reading 80 bytes response from Asterisk...
Received response: agi_language: en


Reading 80 bytes response from Asterisk...
Received response: agi_type: SIP


Reading 80 bytes response from Asterisk...
Received response: agi_uniqueid: 1111686414.65


Reading 80 bytes response from Asterisk...
Received response: agi_callerid: "Andrew" <13>


Reading 80 bytes response from Asterisk...
Received response: agi_dnid: 21


Reading 80 bytes response from Asterisk...
Received response: agi_rdnis: unknown


Reading 80 bytes response from Asterisk...
Received response: agi_context: macro-root


Reading 80 bytes response from Asterisk...
Received response: agi_extension: s


Reading 80 bytes response from Asterisk...
Received response: agi_priority: 4


Reading 80 bytes response from Asterisk...
Received response: agi_enhanced: 0.0


Reading 80 bytes response from Asterisk...
Received response: agi_accountcode:


Reading 80 bytes response from Asterisk...
Received response:


Sending string SAY NUMBER 55 ""\n to Asterisk...
Wroten bytes to STDOUT: 17

Reading 80 bytes response from Asterisk...
Received response: 200 result=0


Sending string SAY NUMBER 66 ""\n to Asterisk...
Wroten bytes to STDOUT: 17

Reading 80 bytes response from Asterisk...
Received response: 200 result=0

I was tired of looking for errors in the script, but the fact that the
script in PHP and the C test program runs perfectly in the other
server is very annoying :( , So, i started to look out in the Asterisk
C code. I checked out mainly the file res/agi_res.c
well, once here i checked the function 'static void setup_env' that
function sends the initial environment variables, uses
the function fdprintf, that appears to be a redefinition of
printf_to_agi_result_buffer function,to send data to the AGI script.
I assume that since i receive correctly the initial data, then the
function fdprintf works fine. Then i checked out the function
that handles the command SAY_NUMBER, this function is called
handle_saynumber, i put some extra ast_log warnings to verify that the
function is doing all well, and in effect, it does.

The output in the asterisk console when i try to execute the agi_script is:

    -- Executing Macro("SIP/12-dec6", "root|sipextens") in new stack
    -- Executing GotoIf("SIP/12-dec6", "1 ? 2 : 5") in new stack
    -- Goto (macro-root,s,2)
    -- Executing SetVar("SIP/12-dec6", "dialed=10") in new stack
    -- Executing SetVar("SIP/12-dec6", "authtype=sipextens") in new stack
    -- Executing AGI("SIP/12-dec6", "agi_cdr.php") in new stack
    -- Launched AGI Script /var/lib/asterisk/agi-bin/agi_cdr.php
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:579 handle_saynumber:
Entering function handle_saynumber!
Mar 24 05:06:18 WARNING[2911]: res_agi.c:586 handle_saynumber: About
to execute ast_say_number_full function!
    -- Playing 'digits/50' (language 'en')
    -- Playing 'digits/5' (language 'en')
Mar 24 05:06:20 WARNING[2911]: res_agi.c:588 handle_saynumber:
Executed function, return value is 0!
Mar 24 05:06:20 WARNING[2911]: res_agi.c:591 handle_saynumber:
returning value to AGI with fdprintf!
Mar 24 05:06:20 WARNING[2911]: res_agi.c:376
printf_to_agi_result_buffer: Valid buffer!
Mar 24 05:06:20 WARNING[2911]: res_agi.c:594 handle_saynumber:
returning succes to asterisk!

after i hangup the call then:
  == Spawn extension (macro-root, s, 4) exited non-zero on
'SIP/12-dec6' in macro 'root'
  == Spawn extension (localplans.some, 10, 1) exited non-zero on 'SIP/12-dec6'
  
the warnings are messages set by me to check that the buffer where
asterisk is written are valid and
some other info inside the handle_saynumber function.
  

The information of the Servers and the software installed in them is:
 
Server Running Correctly:
Gnu/Linux Distro: Gentoo
uname: Linux intervoip1 2.6.9-ivsol1 #2 Thu Nov 25 08:25:32 CST 2004
i686 Intel(R) Pentium(R) 4 CPU 2.40GHz GenuineIntel GNU/Linux
Compiler: GCC Version 3.4.3
Glibc: Version 2.3.4.20041021
Asterisk: Version 1.0.0

Server Running With Bugs:
Gnu/Linux Distro: Gentoo
uname: Linux hq 2.6.9-ivsol1 #1 Fri Nov 19 22:37:46 CST 2004 i686 AMD
Athlon(tm) XP 2400+ AuthenticAMD GNU/Linux
Gcc: Version 3.4.3
Glibc: Version 2.3.4.20041102
Asterisk: Version 1.0.5

The main difference is the Asterisk version and the Glibc version.

I appreciate any help with this. Sorry if i omit information that may
be important, but that was all i thought it is.
_______________________________________________
Asterisk-Users mailing list
Asterisk-Users@lists.digium.com
http://lists.digium.com/mailman/listinfo/asterisk-users
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-users

Reply via email to