Author: arekm                        Date: Sat Feb  9 13:04:42 2008 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- from debian

---- Files affected:
SOURCES:
   asterisk-bristuff.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/asterisk-bristuff.patch
diff -u /dev/null SOURCES/asterisk-bristuff.patch:1.1
--- /dev/null   Sat Feb  9 14:04:42 2008
+++ SOURCES/asterisk-bristuff.patch     Sat Feb  9 14:04:37 2008
@@ -0,0 +1,8799 @@
+--- a/README
++++ b/README
+@@ -4,6 +4,8 @@ and the Asterisk.org developer community
+ 
+ Copyright (C) 2001-2006 Digium, Inc.
+ and other copyright holders.
++Copyright (C) 2002-2005 Junghanns.NET GmbH 
++and other copyright holders.
+ ================================================================
+ 
+ * SECURITY
+--- a/LICENSE
++++ b/LICENSE
+@@ -1,7 +1,7 @@
+-Asterisk is distributed under the GNU General Public License version 2
+-and is also available under alternative licenses negotiated directly
+-with Digium, Inc. If you obtained Asterisk under the GPL, then the GPL
+-applies to all loadable Asterisk modules used on your system as well,
++BRIstuffed Asterisk is distributed under the GNU General Public License 
version 2
++and is not available under any alternative licenses.
++If you obtained BRIstuffed Asterisk under the GPL, then the GPL
++applies to all loadable BRIstuffed Asterisk modules used on your system as 
well,
+ except as defined below. The GPL (version 2) is included in this
+ source tree in the file COPYING.
+ 
+--- a/doc/hardware.txt
++++ b/doc/hardware.txt
+@@ -31,6 +31,19 @@ Zaptel compatible hardware
+    * Wildcard TE410P - Quad T1/E1 switchable interface.  Supports PRI and 
+      RBS signalling, as well as PPP, FR, and HDLC data modes.
+ 
++-- Junghanns.NET (Primary author of BRIstuff)
++      http://www.junghanns.net
++      
++    * quadBRI PCI ISDN - 4port BRI ISDN interface, supports NT and TE mode
++    
++    * octoBRI PCI ISDN - 8port BRI ISDN interface, supports NT and TE mode
++
++    * singleE1 PCI ISDN - Single E1 interface
++
++    * doubleE1 PCI ISDN - Double E1 interface
++    
++    * uno/duo/quad GSM PCI - 1/2/4 channel GSM interface cards
++
+ Non-zaptel compatible hardware
+ ==============================
+ 
+--- a/build_tools/make_defaults_h
++++ b/build_tools/make_defaults_h
+@@ -17,6 +17,7 @@ cat << END
+ #define AST_KEY_DIR    "${INSTALL_PATH}${ASTDATADIR}/keys"
+ #define AST_DB         "${INSTALL_PATH}${ASTVARLIBDIR}/astdb"
+ #define AST_TMP_DIR    "${INSTALL_PATH}${ASTSPOOLDIR}/tmp"
++#define AST_SYSTEM_NAME       "asterisk"
+ 
+ #define AST_CONFIG_FILE "${INSTALL_PATH}${ASTCONFPATH}"
+ 
+--- a/main/asterisk.c
++++ b/main/asterisk.c
+@@ -2387,6 +2387,7 @@ static void ast_readconfig(void) 
+       ast_copy_string(ast_config_AST_PID, AST_PID, 
sizeof(ast_config_AST_PID));
+       ast_copy_string(ast_config_AST_SOCKET, AST_SOCKET, 
sizeof(ast_config_AST_SOCKET));
+       ast_copy_string(ast_config_AST_RUN_DIR, AST_RUN_DIR, 
sizeof(ast_config_AST_RUN_DIR));
++      ast_copy_string(ast_config_AST_SYSTEM_NAME, AST_SYSTEM_NAME, 
sizeof(ast_config_AST_SYSTEM_NAME));
+ 
+       /* no asterisk.conf? no problem, use buildtime config! */
+       if (!cfg) {
+@@ -2511,6 +2512,8 @@ static void ast_readconfig(void) 
+                       ast_copy_string(ast_config_AST_RUN_GROUP, v->value, 
sizeof(ast_config_AST_RUN_GROUP));
+               } else if (!strcasecmp(v->name, "systemname")) {
+                       ast_copy_string(ast_config_AST_SYSTEM_NAME, v->value, 
sizeof(ast_config_AST_SYSTEM_NAME));
++              } else if (!strcasecmp(v->name, "uniquename")) {
++                      ast_copy_string(ast_config_AST_SYSTEM_NAME, v->value, 
sizeof(ast_config_AST_SYSTEM_NAME));
+               } else if (!strcasecmp(v->name, "languageprefix")) {
+                       ast_language_is_prefix = ast_true(v->value);
+               }
+--- a/include/asterisk/agi.h
++++ b/include/asterisk/agi.h
+@@ -29,7 +29,8 @@ extern "C" {
+ 
+ typedef struct agi_state {
+       int fd;         /* FD for general output */
+-      int audio;      /* FD for audio output */
++      int audio_out;  /* FD for audio output */
++      int audio_in;   /* FD for audio output */
+       int ctrl;       /* FD for input control */
+       unsigned int fast:1; /* flag for fast agi or not */
+ } AGI;
+--- a/res/res_agi.c
++++ b/res/res_agi.c
+@@ -11,6 +11,9 @@
+  * the project provides a web site, mailing lists and IRC
+  * channels for your use.
+  *
++ * Copyright (C) 2005 Junghanns.NET GmbH
++ * Klaus-Peter Junghanns <[EMAIL PROTECTED]>
++ *
+  * This program is free software, distributed under the terms of
+  * the GNU General Public License Version 2. See the LICENSE file
+  * at the top of the source tree.
+@@ -75,16 +78,19 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revisi
+ 
+ static char *app = "AGI";
+ 
++static char *xapp = "XAGI";
++
+ static char *eapp = "EAGI";
+ 
+ static char *deadapp = "DeadAGI";
+ 
+ static char *synopsis = "Executes an AGI compliant application";
++static char *xsynopsis = "Executes an XAGI compliant application";
+ static char *esynopsis = "Executes an EAGI compliant application";
+ static char *deadsynopsis = "Executes AGI on a hungup channel";
+ 
+ static char *descrip =
+-"  [E|Dead]AGI(command|args): Executes an Asterisk Gateway Interface 
compliant\n"
++"  [E|Dead|X]AGI(command|args): Executes an Asterisk Gateway Interface 
compliant\n"
+ "program on a channel. AGI allows Asterisk to launch external programs\n"
+ "written in any language to control a telephony channel, play audio,\n"
+ "read DTMF digits, etc. by communicating with the AGI protocol on stdin\n"
+@@ -97,6 +103,8 @@ static char *descrip =
+ "variable to \"no\" before executing the AGI application.\n"
+ "  Using 'EAGI' provides enhanced AGI, with incoming audio available out of 
band\n"
+ "on file descriptor 3\n\n"
++"Using 'XAGI' provides enhanced AGI, with incoming audio available out of 
band"
++" on file descriptor 3 and outgoing audio available out of band on file 
descriptor 4\n\n"
+ "  Use the CLI command 'agi show' to list available agi commands\n"
+ "  This application sets the following channel variable upon completion:\n"
+ "     AGISTATUS      The status of the attempt to the run the AGI script\n"
+@@ -236,13 +244,14 @@ static enum agi_result launch_netscript(
+       return AGI_RESULT_SUCCESS_FAST;
+ }
+ 
+-static enum agi_result launch_script(char *script, char *argv[], int *fds, 
int *efd, int *opid)
++static enum agi_result launch_script(char *script, char *argv[], int *fds, 
int *efd, int *efd2, int *opid)
+ {
+       char tmp[256];
+       int pid;
+       int toast[2];
+       int fromast[2];
+       int audio[2];
++      int audio2[2];
+       int x;
+       int res;
+       sigset_t signal_set, old_set;
+@@ -287,6 +296,33 @@ static enum agi_result launch_script(cha
+                       return AGI_RESULT_FAILURE;
+               }
+       }
++      if (efd2) {
++              if (pipe(audio2)) {
++                      ast_log(LOG_WARNING, "unable to create audio pipe: 
%s\n", strerror(errno));
++                      close(fromast[0]);
++                      close(fromast[1]);
++                      close(toast[0]);
++                      close(toast[1]);
++                      close(audio[0]);
++                      close(audio[1]);
++                      return AGI_RESULT_FAILURE;
++              }
++              res = fcntl(audio2[0], F_GETFL);
++              if (res > -1) 
++                      res = fcntl(audio2[0], F_SETFL, res | O_NONBLOCK);
++              if (res < 0) {
++                      ast_log(LOG_WARNING, "unable to set audio pipe 
parameters: %s\n", strerror(errno));
++                      close(fromast[0]);
++                      close(fromast[1]);
++                      close(toast[0]);
++                      close(toast[1]);
++                      close(audio[0]);
++                      close(audio[1]);
++                      close(audio2[0]);
++                      close(audio2[1]);
++                      return AGI_RESULT_FAILURE;
++              }
++      }
+ 
+       /* Block SIGHUP during the fork - prevents a race */
+       sigfillset(&signal_set);
+@@ -322,6 +358,11 @@ static enum agi_result launch_script(cha
+               } else {
+                       close(STDERR_FILENO + 1);
+               }
++              if (efd2) {
++                      dup2(audio2[1], STDERR_FILENO + 2);
++              } else {
++                      close(STDERR_FILENO + 2);
++              }
+ 
+               /* Before we unblock our signals, return our trapped signals 
back to the defaults */
+               signal(SIGHUP, SIG_DFL);
+@@ -339,7 +380,7 @@ static enum agi_result launch_script(cha
+               }
+ 
+               /* Close everything but stdin/out/error */
+-              for (x=STDERR_FILENO + 2;x<1024;x++) 
++              for (x=STDERR_FILENO + 3;x<1024;x++) 
+                       close(x);
+ 
+               /* Execute script */
+@@ -357,12 +398,19 @@ static enum agi_result launch_script(cha
+       if (efd) {
+               *efd = audio[1];
+       }
++      if (efd2) {
++              *efd2 = audio2[0];
++      }
+       /* close what we're not using in the parent */
+       close(toast[1]);
+       close(fromast[0]);
+ 
+-      if (efd)
++      if (efd) {
+               close(audio[0]);
++      }
++      if (efd2) {
++              close(audio2[1]);
++      }
+ 
+       *opid = pid;
+       return AGI_RESULT_SUCCESS;
+@@ -392,7 +440,7 @@ static void setup_env(struct ast_channel
+       fdprintf(fd, "agi_context: %s\n", chan->context);
+       fdprintf(fd, "agi_extension: %s\n", chan->exten);
+       fdprintf(fd, "agi_priority: %d\n", chan->priority);
+-      fdprintf(fd, "agi_enhanced: %s\n", enhanced ? "1.0" : "0.0");
++      fdprintf(fd, "agi_enhanced: %d%s\n", enhanced, ".0");
+ 
+       /* User information */
+       fdprintf(fd, "agi_accountcode: %s\n", chan->accountcode ? 
chan->accountcode : "");
+@@ -421,7 +469,7 @@ static int handle_waitfordigit(struct as
+               return RESULT_SHOWUSAGE;
+       if (sscanf(argv[3], "%d", &to) != 1)
+               return RESULT_SHOWUSAGE;
+-      res = ast_waitfordigit_full(chan, to, agi->audio, agi->ctrl);
++      res = ast_waitfordigit_full(chan, to, agi->audio_out, agi->ctrl);
+       fdprintf(agi->fd, "200 result=%d\n", res);
+       return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
+ }
+@@ -596,7 +644,7 @@ static int handle_streamfile(struct ast_
+       if (vfs)
+               ast_playstream(vfs);
+       
+-      res = ast_waitstream_full(chan, argv[3], agi->audio, agi->ctrl);
++      res = ast_waitstream_full(chan, argv[3], agi->audio_out, agi->ctrl);
+       /* this is to check for if ast_waitstream closed the stream, we 
probably are at
+        * the end of the stream, return that amount, else check for the amount 
*/
+       sample_offset = (chan->stream) ? ast_tellstream(fs) : max_length;
+@@ -657,7 +705,7 @@ static int handle_getoption(struct ast_c
+       if (vfs)
+               ast_playstream(vfs);
+ 
+-      res = ast_waitstream_full(chan, argv[3], agi->audio, agi->ctrl);
++      res = ast_waitstream_full(chan, argv[3], agi->audio_out, agi->ctrl);
+       /* this is to check for if ast_waitstream closed the stream, we 
probably are at
+        * the end of the stream, return that amount, else check for the amount 
*/
+       sample_offset = (chan->stream)?ast_tellstream(fs):max_length;
+@@ -669,7 +717,7 @@ static int handle_getoption(struct ast_c
+ 
+       /* If the user didnt press a key, wait for digitTimeout*/
+       if (res == 0 ) {
+-              res = ast_waitfordigit_full(chan, timeout, agi->audio, 
agi->ctrl);
++              res = ast_waitfordigit_full(chan, timeout, agi->audio_out, 
agi->ctrl);
+               /* Make sure the new result is in the escape digits of the GET 
OPTION */
+               if ( !strchr(edigits,res) )
+                       res=0;
+@@ -693,7 +741,7 @@ static int handle_saynumber(struct ast_c
+               return RESULT_SHOWUSAGE;
+       if (sscanf(argv[2], "%d", &num) != 1)
+               return RESULT_SHOWUSAGE;
+-      res = ast_say_number_full(chan, num, argv[3], chan->language, (char *) 
NULL, agi->audio, agi->ctrl);
++      res = ast_say_number_full(chan, num, argv[3], chan->language, (char *) 
NULL, agi->audio_out, agi->ctrl);
+       if (res == 1)
+               return RESULT_SUCCESS;
+       fdprintf(agi->fd, "200 result=%d\n", res);
+@@ -710,7 +758,7 @@ static int handle_saydigits(struct ast_c
+       if (sscanf(argv[2], "%d", &num) != 1)
+               return RESULT_SHOWUSAGE;
+ 
+-      res = ast_say_digit_str_full(chan, argv[2], argv[3], chan->language, 
agi->audio, agi->ctrl);
++      res = ast_say_digit_str_full(chan, argv[2], argv[3], chan->language, 
agi->audio_out, agi->ctrl);
+       if (res == 1) /* New command */
+               return RESULT_SUCCESS;
+       fdprintf(agi->fd, "200 result=%d\n", res);
+@@ -724,7 +772,7 @@ static int handle_sayalpha(struct ast_ch
+       if (argc != 4)
+               return RESULT_SHOWUSAGE;
+ 
+-      res = ast_say_character_str_full(chan, argv[2], argv[3], 
chan->language, agi->audio, agi->ctrl);
++      res = ast_say_character_str_full(chan, argv[2], argv[3], 
chan->language, agi->audio_out, agi->ctrl);
+       if (res == 1) /* New command */
+               return RESULT_SUCCESS;
+       fdprintf(agi->fd, "200 result=%d\n", res);
+@@ -802,7 +850,7 @@ static int handle_sayphonetic(struct ast
+       if (argc != 4)
+               return RESULT_SHOWUSAGE;
+ 
+-      res = ast_say_phonetic_str_full(chan, argv[2], argv[3], chan->language, 
agi->audio, agi->ctrl);
++      res = ast_say_phonetic_str_full(chan, argv[2], argv[3], chan->language, 
agi->audio_out, agi->ctrl);
+       if (res == 1) /* New command */
+               return RESULT_SUCCESS;
+       fdprintf(agi->fd, "200 result=%d\n", res);
+@@ -826,7 +874,7 @@ static int handle_getdata(struct ast_cha
+               max = atoi(argv[4]); 
+       else
+               max = 1024;
+-      res = ast_app_getdata_full(chan, argv[2], data, max, timeout, 
agi->audio, agi->ctrl);
++      res = ast_app_getdata_full(chan, argv[2], data, max, timeout, 
agi->audio_out, agi->ctrl);
+       if (res == 2)                   /* New command */
+               return RESULT_SUCCESS;
+       else if (res == 1)
+@@ -1833,8 +1881,13 @@ static enum agi_result run_agi(struct as
+       int ms;
+       enum agi_result returnstatus = AGI_RESULT_SUCCESS;
+       struct ast_frame *f;
++      struct ast_frame fr;
+       char buf[AGI_BUF_LEN];
++      char audiobuf[AGI_BUF_LEN];
+       char *res = NULL;
++      int audiobytes;
++      int fds[2];
++      int enhanced = 0;
+       FILE *readf;
+       /* how many times we'll retry if ast_waitfor_nandfs will return without 
either 
+         channel or file descriptor in case select is interrupted by a system 
call (EINTR) */
+@@ -1848,10 +1901,22 @@ static enum agi_result run_agi(struct as
+               return AGI_RESULT_FAILURE;
+       }
+       setlinebuf(readf);
+-      setup_env(chan, request, agi->fd, (agi->audio > -1));
++      if (agi->audio_out > -1) {
++          enhanced = 1;
++      }
++      if (agi->audio_in > -1) {
++          enhanced++;
++      }
++      setup_env(chan, request, agi->fd, enhanced);
++      fds[0] = agi->ctrl;
++      fds[1] = agi->audio_in;
+       for (;;) {
+               ms = -1;
+-              c = ast_waitfor_nandfds(&chan, dead ? 0 : 1, &agi->ctrl, 1, 
NULL, &outfd, &ms);
++              if (agi->audio_in > -1) {
++                  c = ast_waitfor_nandfds(&chan, dead ? 0 : 1, fds, 2, NULL, 
&outfd, &ms);
++              } else {
++                  c = ast_waitfor_nandfds(&chan, dead ? 0 : 1, &agi->ctrl, 1, 
NULL, &outfd, &ms);
++              }
+               if (c) {
+                       retry = AGI_NANDFS_RETRY;
+                       /* Idle the channel until we get a command */
+@@ -1862,13 +1927,23 @@ static enum agi_result run_agi(struct as
+                               break;
+                       } else {
+                               /* If it's voice, write it to the audio pipe */
+-                              if ((agi->audio > -1) && (f->frametype == 
AST_FRAME_VOICE)) {
++                              if ((agi->audio_out > -1) && (f->frametype == 
AST_FRAME_VOICE)) {
+                                       /* Write, ignoring errors */
+-                                      write(agi->audio, f->data, f->datalen);
++                                      write(agi->audio_out, f->data, 
f->datalen);
+                               }
+                               ast_frfree(f);
+                       }
+               } else if (outfd > -1) {
++                  if ((agi->audio_in > -1) && (outfd == agi->audio_in)) {
++                      audiobytes = read(agi->audio_in, audiobuf, 
sizeof(audiobuf));
++                      if (audiobytes > 0) {
++                          fr.frametype = AST_FRAME_VOICE;
++                          fr.subclass = AST_FORMAT_SLINEAR;
++                          fr.datalen = audiobytes;
++                          fr.data = audiobuf;
++                          ast_write(chan, &fr);
++                      }
++                  } else {
+                       size_t len = sizeof(buf);
+                       size_t buflen = 0;
+ 
+@@ -1914,6 +1989,7 @@ static enum agi_result run_agi(struct as
+                       if ((returnstatus < 0) || (returnstatus == 
AST_PBX_KEEPALIVE)) {
+                               break;
+                       }
++                  }
+               } else {
+                       if (--retry <= 0) {
+                               ast_log(LOG_WARNING, "No channel, no fd?\n");
+@@ -2022,6 +2098,7 @@ static int agi_exec_full(struct ast_chan
+       int argc = 0;
+       int fds[2];
+       int efd = -1;
++      int efd2 = -1;
+       int pid;
+         char *stringp;
+       AGI agi;
+@@ -2047,12 +2124,13 @@ static int agi_exec_full(struct ast_chan
+               }
+       }
+ #endif
+-      res = launch_script(argv[0], argv, fds, enhanced ? &efd : NULL, &pid);
++      res = launch_script(argv[0], argv, fds, enhanced ? &efd : NULL, 
(enhanced == 2) ? &efd2 : NULL, &pid);
+       if (res == AGI_RESULT_SUCCESS || res == AGI_RESULT_SUCCESS_FAST) {
+               int status = 0;
+               agi.fd = fds[1];
+               agi.ctrl = fds[0];
+-              agi.audio = efd;
++              agi.audio_out = efd;
++              agi.audio_in = efd2;
+               agi.fast = (res == AGI_RESULT_SUCCESS_FAST) ? 1 : 0;
+               res = run_agi(chan, argv[0], &agi, pid, &status, dead);
+               /* If the fork'd process returns non-zero, set AGISTATUS to 
FAILURE */
+@@ -2062,6 +2140,8 @@ static int agi_exec_full(struct ast_chan
+                       close(fds[1]);
+               if (efd > -1)
+                       close(efd);
++              if (efd2 > -1)
++                      close(efd2);
+               ast_unreplace_sigchld();
+       }
+       ast_module_user_remove(u);
+@@ -2110,6 +2190,35 @@ static int eagi_exec(struct ast_channel 
+       return res;
+ }
+ 
++static int xagi_exec(struct ast_channel *chan, void *data)
++{
++      int readformat, writeformat;
++      int res;
++
++      if (chan->_softhangup)
++              ast_log(LOG_WARNING, "If you want to run AGI on hungup channels 
you should use DeadAGI!\n");
++      readformat = chan->readformat;
++      if (ast_set_read_format(chan, AST_FORMAT_SLINEAR)) {
++              ast_log(LOG_WARNING, "Unable to set channel '%s' to linear 
mode\n", chan->name);
++              return -1;
++      }
++      writeformat = chan->writeformat;
++      if (ast_set_write_format(chan, AST_FORMAT_SLINEAR)) {
++              ast_log(LOG_WARNING, "Unable to set channel '%s' to linear 
mode\n", chan->name);
++              return -1;
++      }
++      res = agi_exec_full(chan, data, 2, 0);
++      if (!res) {
++              if (ast_set_read_format(chan, readformat)) {
++                      ast_log(LOG_WARNING, "Unable to restore channel '%s' to 
format %s\n", chan->name, ast_getformatname(readformat));
++              }
++              if (ast_set_write_format(chan, writeformat)) {
++                      ast_log(LOG_WARNING, "Unable to restore channel '%s' to 
format %s\n", chan->name, ast_getformatname(writeformat));
++              }
++      }
++      return res;
++}
++
+ static int deadagi_exec(struct ast_channel *chan, void *data)
+ {
+       if (!ast_check_hangup(chan))
+@@ -2165,6 +2274,7 @@ static int unload_module(void)
+ {
+       ast_module_user_hangup_all();
+       ast_cli_unregister_multiple(cli_agi, sizeof(cli_agi) / sizeof(struct 
ast_cli_entry));
++      ast_unregister_application(xapp);
+       ast_unregister_application(eapp);
+       ast_unregister_application(deadapp);
+       return ast_unregister_application(app);
+@@ -2175,6 +2285,7 @@ static int load_module(void)
+       ast_cli_register_multiple(cli_agi, sizeof(cli_agi) / sizeof(struct 
ast_cli_entry));
+       ast_register_application(deadapp, deadagi_exec, deadsynopsis, descrip);
+       ast_register_application(eapp, eagi_exec, esynopsis, descrip);
++      ast_register_application(xapp, xagi_exec, xsynopsis, descrip);
+       return ast_register_application(app, agi_exec, synopsis, descrip);
+ }
+ 
+--- /dev/null
++++ b/agi/xagi-test.c
+@@ -0,0 +1,175 @@
++/*
++ * Asterisk -- A telephony toolkit for Linux.
++ *
++ * XAGI sample script 
++ * 
++ * Copyright (C) 2005 Junghanns.NET GmbH
++ * Klaus-Peter Junghanns <[EMAIL PROTECTED]>
++ *
++ * based on eagi-test.c
++ *
++ * This program is free software, distributed under the terms of
++ * the GNU General Public License
++ */
++
++#include <stdio.h>
++#include <unistd.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <string.h>
++#include <sys/select.h>
++#ifdef SOLARIS
++#include <solaris-compat/compat.h>
++#endif
++
++#define AUDIO_FILENO_IN (STDERR_FILENO + 1)
++#define AUDIO_FILENO_OUT (STDERR_FILENO + 2)
++
++static int read_environment(void)
++{
++      char buf[256];
++      char *val;
++      /* Read environment */
++      for(;;) {
++              fgets(buf, sizeof(buf), stdin);
++              if (feof(stdin))
++                      return -1;
++              buf[strlen(buf) - 1] = '\0';
++              /* Check for end of environment */
++              if (!strlen(buf))
++                      return 0;
++              val = strchr(buf, ':');
++              if (!val) {
++                      fprintf(stderr, "Invalid environment: '%s'\n", buf);
++                      return -1;
++              }
++              *val = '\0';
++              val++;
++              val++;
++              /* Skip space */
++      //      fprintf(stderr, "Environment: '%s' is '%s'\n", buf, val);
++
++              /* Load into normal environment */
++              setenv(buf, val, 1);
++              
++      }
++      /* Never reached */
++      return 0;
++}
++
++static void app_echo(void)
++{
++      fd_set fds;
++      int res;
++      int bytes = 0;
++      static char astresp[256];
++      char audiobuf[16000]; /* 1 second of audio */
++      for (;;) {
++              FD_ZERO(&fds);
++              FD_SET(STDIN_FILENO, &fds);
++              FD_SET(AUDIO_FILENO_IN, &fds);
++              /* Wait for *some* sort of I/O */
++              res = select(AUDIO_FILENO_IN + 1, &fds, NULL, NULL, NULL);
++              if (res < 0) {
++                      fprintf(stderr, "Error in select: %s\n", 
strerror(errno));
++                      return;
++              }
++              if (FD_ISSET(STDIN_FILENO, &fds)) {
++                      fgets(astresp, sizeof(astresp), stdin);
++                      if (feof(stdin)) {
++                              return;
++                      }
++                      astresp[strlen(astresp) - 1] = '\0';
++                      fprintf(stderr, "Ooh, got a response from Asterisk: 
'%s'\n", astresp);
++                      return;
++              }
++              if (FD_ISSET(AUDIO_FILENO_IN, &fds)) {
++                      /* what goes in.... */
++                      res = read(AUDIO_FILENO_IN, audiobuf, sizeof(audiobuf));
++                      if (res > 0) {
++                          bytes = res;
++                          /* must come out */
++                          write(AUDIO_FILENO_OUT, audiobuf, bytes);
++                      }
++              }
++      }
++}
++
++static char *wait_result(void)
++{
++      fd_set fds;
++      int res;
++      static char astresp[256];
++      char audiobuf[4096];
++      for (;;) {
++              FD_ZERO(&fds);
++              FD_SET(STDIN_FILENO, &fds);
++              FD_SET(AUDIO_FILENO_IN, &fds);
++              /* Wait for *some* sort of I/O */
++              res = select(AUDIO_FILENO_IN + 1, &fds, NULL, NULL, NULL);
++              if (res < 0) {
++                      fprintf(stderr, "Error in select: %s\n", 
strerror(errno));
++                      return NULL;
++              }
++              if (FD_ISSET(STDIN_FILENO, &fds)) {
++                      fgets(astresp, sizeof(astresp), stdin);
++                      if (feof(stdin)) {
++                              fprintf(stderr, "Got hungup on apparently\n");
++                              return NULL;
<<Diff was trimmed, longer than 597 lines>>
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to