[asterisk-commits] kpfleming: trunk r157706 - in /trunk: ./ apps/ include/asterisk/ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Nov 19 06:42:36 CST 2008


Author: kpfleming
Date: Wed Nov 19 06:42:19 2008
New Revision: 157706

URL: http://svn.digium.com/view/asterisk?view=rev&rev=157706
Log:
make some corrections to the ast_agi_register_multiple(), ast_agi_unregister_multiple() and ast_agi_fdprintf() API calls to be consistent with API guidelines

also, move UPGRADE.txt to UPGRADE-1.6.txt and make the new UPGRADE.txt contain information about upgrading between Asterisk 1.6 releases


Added:
    trunk/UPGRADE-1.6.txt
      - copied unchanged from r157705, team/kpfleming/agi_multiple-api-fix/UPGRADE-1.6.txt
Modified:
    trunk/UPGRADE.txt
    trunk/apps/app_stack.c
    trunk/include/asterisk/agi.h
    trunk/res/res_agi.c

Modified: trunk/UPGRADE.txt
URL: http://svn.digium.com/view/asterisk/trunk/UPGRADE.txt?view=diff&rev=157706&r1=157705&r2=157706
==============================================================================
--- trunk/UPGRADE.txt (original)
+++ trunk/UPGRADE.txt Wed Nov 19 06:42:19 2008
@@ -1,312 +1,27 @@
-=========================================================
-=== Information for upgrading from Asterisk 1.4 to 1.6
+===========================================================
+=== Information for upgrading between Asterisk 1.6 versions
 ===
 ===
 === UPGRADE-1.2.txt -- Upgrade info for 1.0 to 1.2
 === UPGRADE-1.4.txt -- Upgrade info for 1.2 to 1.4
-=== UPGRADE.txt     -- Upgrade info for 1.4 to 1.6
-=========================================================
+=== UPGRADE-1.6.txt -- Upgrade info for 1.4 to 1.6
+===========================================================
 
-AEL:
+From 1.6.0.1 to 1.6.0.2 or later, or 1.6.1 or later:
 
-* Macros are now implemented underneath with the Gosub() application.
-  Heaven Help You if you wrote code depending on any aspect of this!
-  Previous to 1.6, macros were implemented with the Macro() app, which
-  provided a nice feature of auto-returning. The compiler will do its
-  best to insert a Return() app call at the end of your macro if you did
-  not include it, but really, you should make sure that all execution
-  paths within your macros end in "return;".
+* The ast_agi_register_multiple() and ast_agi_unregister_multiple()
+  API calls were added in 1.6.0, so that modules that provide multiple
+  AGI commands could register/unregister them all with a single
+  step. However, these API calls were not implemented properly, and did
+  not allow the caller to know whether registration or unregistration
+  succeeded or failed. They have been redefined to now return success
+  or failure, but this means any code using these functions will need
+  be recompiled after upgrading to a version of Asterisk containing
+  these changes. In addition, the source code using these functions
+  should be reviewed to ensure it can properly react to failure
+  of registration or unregistration of its API commands.
 
-* The conf2ael program is 'introduced' in this release; it is in a rather
-  crude state, but deemed useful for making a first pass at converting
-  extensions.conf code into AEL. More intelligence will come with time.
-
-Core:
-
-* The 'languageprefix' option in asterisk.conf is now deprecated, and
-  the default sound file layout for non-English sounds is the 'new
-  style' layout introduced in Asterisk 1.4 (and used by the automatic
-  sound file installer in the Makefile).
-
-* The ast_expr2 stuff has been modified to handle floating-point numbers.
-  Numbers of the format D.D are now acceptable input for the expr parser, 
-  Where D is a string of base-10 digits. All math is now done in "long double",
-  if it is available on your compiler/architecture. This was half-way between
-  a bug-fix (because the MATH func returns fp by default), and an enhancement.
-  Also, for those counting on, or needing, integer operations, a series of
-  'functions' were also added to the expr language, to allow several styles
-  of rounding/truncation, along with a set of common floating point operations,
-  like sin, cos, tan, log, pow, etc. The ability to call external functions
-  like CDR(), etc. was also added, without having to use the ${...} notation.
- 
-* The delimiter passed to applications has been changed to the comma (','), as
-  that is what people are used to using within extensions.conf.  If you are
-  using realtime extensions, you will need to translate your existing dialplan
-  to use this separator.  To use a literal comma, you need merely to escape it
-  with a backslash ('\').  Another possible side effect is that you may need to
-  remove the obscene level of backslashing that was necessary for the dialplan
-  to work correctly in 1.4 and previous versions.  This should make writing
-  dialplans less painful in the future, albeit with the pain of a one-time
-  conversion.  If you would like to avoid this conversion immediately, set
-  pbx_realtime=1.4 in the [compat] section of asterisk.conf.  After
-  transitioning, set pbx_realtime=1.6 in the same section.
-
-* For the same purpose as above, you may set res_agi=1.4 in the [compat]
-  section of asterisk.conf to continue to use the '|' delimiter in the EXEC
-  arguments of AGI applications.  After converting to use the ',' delimiter,
-  change this option to res_agi=1.6.
-
-* The logger.conf option 'rotatetimestamp' has been deprecated in favor of
-  'rotatestrategy'.  This new option supports a 'rotate' strategy that more
-  closely mimics the system logger in terms of file rotation.
-
-* The concise versions of various CLI commands are now deprecated. We recommend
-  using the manager interface (AMI) for application integration with Asterisk.
-
-* The following core commands dealing with dialplan has been deprecated: 'core
-  show globals', 'core set global' and 'core set chanvar'. Use the equivalent
-  'dialplan show globals', 'dialplan set global' and 'dialplan set chanvar'
-  instead.
-
-* The silencethreshold used for various applications is now settable via a
-  centralized config option in dsp.conf.
-
-* The logical value of spaces immediately preceding a standalone 0 previously
-  evaluated to true.  It now evaluates to false.  This has confused a good
-  many people in the past (typically because they failed to realize the space
-  had any significance).  Since this violates the Principle of Least Surprise,
-  it has been changed.
-
-* The default console now will use colors according to the default background
-  color, instead of forcing the background color to black.  If you are using a
-  light colored background for your console, you may wish to use the option
-  flag '-W' to present better color choices for the various messages.  However,
-  if you'd prefer the old method of forcing colors to white text on a black
-  background, the compatiblity option -B is provided for this purpose.
-
-Voicemail:
-
-* The voicemail configuration values 'maxmessage' and 'minmessage' have
-  been changed to 'maxsecs' and 'minsecs' to clarify their purpose and
-  to make them more distinguishable from 'maxmsgs', which sets folder
-  size.  The old variables will continue to work in this version, albeit
-  with a deprecation warning.
-
-* If you use any interface for modifying voicemail aside from the built in
-  dialplan applications, then the option "pollmailboxes" *must* be set in
-  voicemail.conf for message waiting indication (MWI) to work properly.  This
-  is because Voicemail notification is now event based instead of polling
-  based.  The channel drivers are no longer responsible for constantly manually
-  checking mailboxes for changes so that they can send MWI information to users.
-  Examples of situations that would require this option are web interfaces to
-  voicemail or an email client in the case of using IMAP storage.
-
-* The externnotify script should accept an additional (last) parameter
-  containing the number of urgent messages in the INBOX.
-
-Applications:
-
-* SendImage() no longer hangs up the channel on transmission error or on
-  another type of error; in those cases, a FAILURE status is stored in 
-  SENDIMAGESTATUS and dialplan execution continues.  The possible return values
-  stored in SENDIMAGESTATUS are: SUCCESS, FAILURE, and UNSUPPORTED. ('OK' has
-  been replaced with 'SUCCESS', and 'NOSUPPORT' has been replaced with
-  'UNSUPPORTED').  This change makes the SendImage application more consistent
-  with other applications.
-
-* ChanIsAvail() now has a 't' option, which allows the specified device
-  to be queried for state without consulting the channel drivers. This
-  performs mostly a 'ChanExists' sort of function.
-
-* ChannelRedirect() will not terminate the channel that fails to do a
-  channelredirect as it has done previously. Instead CHANNELREDIRECT_STATUS
-  will reflect if the attempt was successful of not.
-
-* SetCallerPres() has been replaced with the CALLERPRES() dialplan function
-  and is now deprecated.
-
-* DISA()'s fifth argument is now an options argument.  If you have previously
-  used 'NOANSWER' in this argument, you'll need to convert that to the new
-  option 'n'.
-
-* Macro() is now deprecated.  If you need subroutines, you should use the
-  Gosub()/Return() applications.  To replace MacroExclusive(), we have
-  introduced dialplan functions LOCK(), TRYLOCK(), and UNLOCK().  You may use
-  these functions in any location where you desire to ensure that only one
-  channel is executing that path at any one time.  The Macro() applications
-  are deprecated for performance reasons.  However, since Macro() has been
-  around for a long time and so many dialplans depend heavily on it, for the
-  sake of backwards compatibility it will not be removed .  It is also worth
-  noting that using both Macro() and GoSub() at the same time is _heavily_
-  discouraged.
-
-* Read() now sets a READSTATUS variable on exit.  It does NOT automatically
-  return -1 (and hangup) anymore on error.  If you want to hangup on error,
-  you need to do so explicitly in your dialplan.
-
-* Privacy() no longer uses privacy.conf, so any options must be specified
-  directly in the application arguments.
-
-* MusicOnHold application now has duration parameter which allows specifying
-  timeout in seconds.
-
-* WaitMusicOnHold application is now deprecated in favor of extended MusicOnHold.
-
-* SetMusicOnHold is now deprecated. You should use Set(CHANNEL(musicclass)=...)
-  instead.
-
-* While app_directory has always relied on having a voicemail.conf or users.conf file
-  correctly set up, it now is dependent on app_voicemail being compiled as well.
-
-* The arguments in ExecIf changed a bit, to be more like other applications.
-  The syntax is now ExecIf(<cond>?appiftrue(args):appiffalse(args)).
-
-* The behavior of the Set application now depends upon a compatibility option,
-  set in asterisk.conf.  To use the old 1.4 behavior, which allowed Set to take
-  multiple key/value pairs, set app_set=1.4 in [compat] in asterisk.conf.  To
-  use the new behavior, which permits variables to be set with embedded commas,
-  set app_set=1.6 in [compat] in asterisk.conf.  Note that you can have both
-  behaviors at the same time, if you switch to using MSet if you want the old
-  behavior.
-
-Dialplan Functions:
-
-* QUEUE_MEMBER_COUNT() has been deprecated in favor of the QUEUE_MEMBER() function. For
-  more information, issue a "show function QUEUE_MEMBER" from the CLI.
-
-CDR:
-
-* The cdr_sqlite module has been marked as deprecated in favor of
-  cdr_sqlite3_custom.  It will potentially be removed from the tree
-  after Asterisk 1.6 is released.
-
-* The cdr_odbc module now uses res_odbc to manage its connections.  The
-  username and password parameters in cdr_odbc.conf, therefore, are no
-  longer used.  The dsn parameter now points to an entry in res_odbc.conf.
-
-* The uniqueid field in the core Asterisk structure has been changed from a
-  maximum 31 character field to a 149 character field, to account for all
-  possible values the systemname prefix could be.  In the past, if the
-  systemname was too long, the uniqueid would have been truncated.
-
-* The cdr_tds module now supports all versions of FreeTDS that contain
-  the db-lib frontend.  It will also now log the userfield variable if
-  the target database table contains a column for it.
-
-Formats:
-
-* format_wav: The GAIN preprocessor definition and source code that used it
-  is removed.  This change was made in response to user complaints of
-  choppiness or the clipping of loud signal peaks.  To increase the volume
-  of voicemail messages, use the 'volgain' option in voicemail.conf
-
-Channel Drivers:
-
-* SIP: a small upgrade to support the "Record" button on the SNOM360,
-  which sends a sip INFO message with a "Record: on" or "Record: off" 
-  header. If Asterisk is set up (via features.conf) to accept "One Touch Monitor"
-  requests (by default, via '*1'), then the user-configured dialpad sequence
-  is generated, and recording can be started and stopped via this button. The
-  file names and formats are all controlled via the normal mechanisms. If the
-  user has not configured the automon feature, the normal "415 Unsupported media type"
-  is returned, and nothing is done.
-
-* SIP: The "call-limit" option is marked as deprecated. It still works in this version of
-  Asterisk, but will be removed in the following version. Please use the groupcount functions
-  in the dialplan to enforce call limits. The "limitonpeer" configuration option is
-  now renamed to "counteronpeer".
-
-* SIP: The "username" option is now renamed to "defaultuser" to match "defaultip".
-  These are used only before registration to call a peer with the uri 
-	sip:defaultuser at defaultip
-  The "username" setting still work, but is deprecated and will not work in 
-  the next version of Asterisk.
-
-* SIP: All of the functionality in SIPCHANINFO() has been implemented in CHANNEL(),
-  and you should start using that function instead for retrieving information about
-  the channel in a technology-agnostic way.
-
-* chan_local.c: the comma delimiter inside the channel name has been changed to a
-  semicolon, in order to make the Local channel driver compatible with the comma
-  delimiter change in applications.
-
-* H323: The "tos" setting has changed name to "tos_audio" and "cos" to "cos_audio"
-  to be compatible with settings in sip.conf. The "tos" and "cos" configuration
-  is deprecated and will stop working in the next release of Asterisk.
-
-* Console: A new console channel driver, chan_console, has been added to Asterisk.
-  This new module can not be loaded at the same time as chan_alsa or chan_oss.  The
-  default modules.conf only loads one of them (chan_oss by default).  So, unless you
-  have modified your modules.conf to not use the autoload option, then you will need
-  to modify modules.conf to add another "noload" line to ensure that only one of
-  these three modules gets loaded.
-
-* DAHDI: The chan_zap module that supported PSTN interfaces using
-  Zaptel has been renamed to chan_dahdi, and only supports the DAHDI
-  telephony driver package for PSTN interfaces. See the
-  Zaptel-to-DAHDI.txt file for more details on this transition.
-
-* DAHDI: The "msdstrip" option has been deprecated, as it provides no value over
-  the method of stripping digits in the dialplan using variable substring syntax.
-
-Configuration:
-
-* pbx_dundi.c: tos parameter changed to use new values. Old values like lowdelay,
-  lowcost and other is not acceptable now. Look into qos.tex for description of 
-  this parameter.
-
-* queues.conf: the queue-lessthan sound file option is no longer available, and the
-  queue-round-seconds option no longer takes '1' as a valid parameter.
-
-* If you have any third party modules which use a config file variable whose
-  name ends in a '+', please note that the append capability added to this
-  version may now conflict with that variable naming scheme.  An easy
-  workaround is to ensure that a space occurs between the '+' and the '=',
-  to differentiate your variable from the append operator.  This potential
-  conflict is unlikely, but is documented here to be thorough.
-
-* skinny.conf now has seperate sections for lines and devices.
-  Please have a look at configs/skinny.conf.sample and update
-  your skinny.conf.
-
-Manager:
-
-* Manager has been upgraded to version 1.1 with a lot of changes. 
-  Please check doc/manager_1_1.txt for information
-
-* The IAXpeers command output has been changed to more closely resemble the
-  output of the SIPpeers command.
-
-* cdr_manager now reports at the "cdr" level, not at "call"  You may need to
-  change your manager.conf to add the level to existing AMI users, if they
-  want to see the CDR events generated.
-
-* The Originate command now requires the Originate write permission.  For
-  Originate with the Application parameter, you need the additional System
-  privilege if you want to do anything that calls out to a subshell.
-
-Queues:
-
-* New queue log events ADDMEMBER and REMOVEMEMBER have been added.  Also, a
-  new value has been added to the TRANSFER event that indicates the caller's
-  original position in the queue they are being transfered from.
-
-* Prior to Asterisk 1.6.2, queue names were treated in a case-sensitive
-  manner, meaning that queues with names like "sales" and "sALeS" would
-  be seen as unique queues. The parsing logic has changed to use case-
-  insensitive comparisons now when originally hashing based on queue
-  names, meaning that now the two queues mentioned as examples earlier
-  will be seen as having the same name.
-
-iLBC Codec:
-
-* Previously, the Asterisk source code distribution included the iLBC
-  encoder/decoder source code, from Global IP Solutions
-  (http://www.gipscorp.com). This code is not licensed for
-  distribution, and thus has been removed from the Asterisk source
-  code distribution. If you wish to use codec_ilbc to support iLBC
-  channels in Asterisk, you can run the contrib/scripts/get_ilbc_source.sh
-  script to download the source and put it in the proper place in
-  the Asterisk build tree. Once that is done you can follow your normal
-  steps of building Asterisk. You will need to run 'menuselect' and enable
-  the iLBC codec in the 'Codec  Translators' category.
+* The ast_agi_fdprintf() API call has been renamed to ast_agi_send()
+  to better match what it really does, and the argument order has been
+  changed to be consistent with other API calls that perform similar
+  operations.

Modified: trunk/apps/app_stack.c
URL: http://svn.digium.com/view/asterisk/trunk/apps/app_stack.c?view=diff&rev=157706&r1=157705&r2=157706
==============================================================================
--- trunk/apps/app_stack.c (original)
+++ trunk/apps/app_stack.c Wed Nov 19 06:42:19 2008
@@ -491,11 +491,11 @@
 		/* Lookup the priority label */
 		if ((priority = ast_findlabel_extension(chan, argv[1], argv[2], argv[3], chan->cid.cid_num)) < 0) {
 			ast_log(LOG_ERROR, "Priority '%s' not found in '%s@%s'\n", argv[3], argv[2], argv[1]);
-			ast_agi_fdprintf(chan, agi->fd, "200 result=-1 Gosub label not found\n");
+			ast_agi_send(agi->fd, chan, "200 result=-1 Gosub label not found\n");
 			return RESULT_FAILURE;
 		}
 	} else if (!ast_exists_extension(chan, argv[1], argv[2], priority, chan->cid.cid_num)) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=-1 Gosub label not found\n");
+		ast_agi_send(agi->fd, chan, "200 result=-1 Gosub label not found\n");
 		return RESULT_FAILURE;
 	}
 
@@ -506,7 +506,7 @@
 
 	if (!(theapp = pbx_findapp("Gosub"))) {
 		ast_log(LOG_ERROR, "Gosub() cannot be found in the list of loaded applications\n");
-		ast_agi_fdprintf(chan, agi->fd, "503 result=-2 Gosub is not loaded\n");
+		ast_agi_send(agi->fd, chan, "503 result=-2 Gosub is not loaded\n");
 		return RESULT_FAILURE;
 	}
 
@@ -540,19 +540,19 @@
 			struct ast_pbx *pbx = chan->pbx;
 			/* Suppress warning about PBX already existing */
 			chan->pbx = NULL;
-			ast_agi_fdprintf(chan, agi->fd, "100 result=0 Trying...\n");
+			ast_agi_send(agi->fd, chan, "100 result=0 Trying...\n");
 			ast_pbx_run(chan);
-			ast_agi_fdprintf(chan, agi->fd, "200 result=0 Gosub complete\n");
+			ast_agi_send(agi->fd, chan, "200 result=0 Gosub complete\n");
 			if (chan->pbx) {
 				ast_free(chan->pbx);
 			}
 			chan->pbx = pbx;
 		} else {
-			ast_agi_fdprintf(chan, agi->fd, "200 result=%d Gosub failed\n", res);
+			ast_agi_send(agi->fd, chan, "200 result=%d Gosub failed\n", res);
 		}
 		ast_free(gosub_args);
 	} else {
-		ast_agi_fdprintf(chan, agi->fd, "503 result=-2 Memory allocation failure\n");
+		ast_agi_send(agi->fd, chan, "503 result=-2 Memory allocation failure\n");
 		return RESULT_FAILURE;
 	}
 

Modified: trunk/include/asterisk/agi.h
URL: http://svn.digium.com/view/asterisk/trunk/include/asterisk/agi.h?view=diff&rev=157706&r1=157705&r2=157706
==============================================================================
--- trunk/include/asterisk/agi.h (original)
+++ trunk/include/asterisk/agi.h Wed Nov 19 06:42:19 2008
@@ -66,11 +66,53 @@
 #define AGI_WEAK
 #endif
 
-int AGI_WEAK ast_agi_fdprintf(struct ast_channel *chan, int fd, char *fmt, ...);
+/*!
+ * \brief
+ *
+ * Sends a string of text to an application connected via AGI.
+ *
+ * \param fd The file descriptor for the AGI session (from struct agi_state)
+ * \param chan Pointer to an associated Asterisk channel, if any
+ * \param fmt printf-style format string
+ * \return 0 for success, -1 for failure
+ *
+ */
+int AGI_WEAK ast_agi_send(int fd, struct ast_channel *chan, char *fmt, ...) __attribute__((format(printf, 3, 4)));
 int AGI_WEAK ast_agi_register(struct ast_module *mod, agi_command *cmd);
 int AGI_WEAK ast_agi_unregister(struct ast_module *mod, agi_command *cmd);
-void AGI_WEAK ast_agi_register_multiple(struct ast_module *mod, agi_command *cmd, int len);
-void AGI_WEAK ast_agi_unregister_multiple(struct ast_module *mod, agi_command *cmd, int len);
+
+/*!
+ * \brief
+ *
+ * Registers a group of AGI commands, provided as an array of struct agi_command
+ * entries.
+ *
+ * \param mod Pointer to the module_info structure for the module that is registering the commands
+ * \param cmd Pointer to the first entry in the array of commands
+ * \param len Length of the array (use the ARRAY_LEN macro to determine this easily)
+ * \return 0 on success, -1 on failure
+ *
+ * \note If any command fails to register, all commands previously registered during the operation
+ * will be unregistered. In other words, this function registers all the provided commands, or none
+ * of them.
+ */
+int AGI_WEAK ast_agi_register_multiple(struct ast_module *mod, struct agi_command *cmd, unsigned int len);
+
+/*!
+ * \brief
+ *
+ * Unregisters a group of AGI commands, provided as an array of struct agi_command
+ * entries.
+ *
+ * \param mod Pointer to the module_info structure for the module that is unregistering the commands
+ * \param cmd Pointer to the first entry in the array of commands
+ * \param len Length of the array (use the ARRAY_LEN macro to determine this easily)
+ * \return 0 on success, -1 on failure
+ *
+ * \note If any command fails to unregister, this function will continue to unregister the
+ * remaining commands in the array; it will not reregister the already-unregistered commands.
+ */
+int AGI_WEAK ast_agi_unregister_multiple(struct ast_module *mod, struct agi_command *cmd, unsigned int len);
 
 #if defined(__cplusplus) || defined(c_plusplus)
 }

Modified: trunk/res/res_agi.c
URL: http://svn.digium.com/view/asterisk/trunk/res/res_agi.c?view=diff&rev=157706&r1=157705&r2=157706
==============================================================================
--- trunk/res/res_agi.c (original)
+++ trunk/res/res_agi.c Wed Nov 19 06:42:19 2008
@@ -304,7 +304,7 @@
 AST_THREADSTORAGE(agi_buf);
 #define AGI_BUF_INITSIZE 256
 
-int ast_agi_fdprintf(struct ast_channel *chan, int fd, char *fmt, ...)
+int ast_agi_send(int fd, struct ast_channel *chan, char *fmt, ...)
 {
 	int res = 0;
 	va_list ap;
@@ -771,7 +771,7 @@
 		}
 	}
 
-	if (ast_agi_fdprintf(NULL, s, "agi_network: yes\n") < 0) {
+	if (ast_agi_send(s, NULL, "agi_network: yes\n") < 0) {
 		if (errno != EINTR) {
 			ast_log(LOG_WARNING, "Connect to '%s' failed: %s\n", agiurl, strerror(errno));
 			close(s);
@@ -782,7 +782,7 @@
 	/* If we have a script parameter, relay it to the fastagi server */
 	/* Script parameters take the form of: AGI(agi://my.example.com/?extension=${EXTEN}) */
 	if (!ast_strlen_zero(script))
-		ast_agi_fdprintf(NULL, s, "agi_network_script: %s\n", script);
+		ast_agi_send(s, NULL, "agi_network_script: %s\n", script);
 
 	ast_debug(4, "Wow, connected!\n");
 	fds[0] = s;
@@ -911,40 +911,40 @@
 
 	/* Print initial environment, with agi_request always being the first
 	   thing */
-	ast_agi_fdprintf(chan, fd, "agi_request: %s\n", request);
-	ast_agi_fdprintf(chan, fd, "agi_channel: %s\n", chan->name);
-	ast_agi_fdprintf(chan, fd, "agi_language: %s\n", chan->language);
-	ast_agi_fdprintf(chan, fd, "agi_type: %s\n", chan->tech->type);
-	ast_agi_fdprintf(chan, fd, "agi_uniqueid: %s\n", chan->uniqueid);
-	ast_agi_fdprintf(chan, fd, "agi_version: %s\n", ast_get_version());
+	ast_agi_send(fd, chan, "agi_request: %s\n", request);
+	ast_agi_send(fd, chan, "agi_channel: %s\n", chan->name);
+	ast_agi_send(fd, chan, "agi_language: %s\n", chan->language);
+	ast_agi_send(fd, chan, "agi_type: %s\n", chan->tech->type);
+	ast_agi_send(fd, chan, "agi_uniqueid: %s\n", chan->uniqueid);
+	ast_agi_send(fd, chan, "agi_version: %s\n", ast_get_version());
 
 	/* ANI/DNIS */
-	ast_agi_fdprintf(chan, fd, "agi_callerid: %s\n", S_OR(chan->cid.cid_num, "unknown"));
-	ast_agi_fdprintf(chan, fd, "agi_calleridname: %s\n", S_OR(chan->cid.cid_name, "unknown"));
-	ast_agi_fdprintf(chan, fd, "agi_callingpres: %d\n", chan->cid.cid_pres);
-	ast_agi_fdprintf(chan, fd, "agi_callingani2: %d\n", chan->cid.cid_ani2);
-	ast_agi_fdprintf(chan, fd, "agi_callington: %d\n", chan->cid.cid_ton);
-	ast_agi_fdprintf(chan, fd, "agi_callingtns: %d\n", chan->cid.cid_tns);
-	ast_agi_fdprintf(chan, fd, "agi_dnid: %s\n", S_OR(chan->cid.cid_dnid, "unknown"));
-	ast_agi_fdprintf(chan, fd, "agi_rdnis: %s\n", S_OR(chan->cid.cid_rdnis, "unknown"));
+	ast_agi_send(fd, chan, "agi_callerid: %s\n", S_OR(chan->cid.cid_num, "unknown"));
+	ast_agi_send(fd, chan, "agi_calleridname: %s\n", S_OR(chan->cid.cid_name, "unknown"));
+	ast_agi_send(fd, chan, "agi_callingpres: %d\n", chan->cid.cid_pres);
+	ast_agi_send(fd, chan, "agi_callingani2: %d\n", chan->cid.cid_ani2);
+	ast_agi_send(fd, chan, "agi_callington: %d\n", chan->cid.cid_ton);
+	ast_agi_send(fd, chan, "agi_callingtns: %d\n", chan->cid.cid_tns);
+	ast_agi_send(fd, chan, "agi_dnid: %s\n", S_OR(chan->cid.cid_dnid, "unknown"));
+	ast_agi_send(fd, chan, "agi_rdnis: %s\n", S_OR(chan->cid.cid_rdnis, "unknown"));
 
 	/* Context information */
-	ast_agi_fdprintf(chan, fd, "agi_context: %s\n", chan->context);
-	ast_agi_fdprintf(chan, fd, "agi_extension: %s\n", chan->exten);
-	ast_agi_fdprintf(chan, fd, "agi_priority: %d\n", chan->priority);
-	ast_agi_fdprintf(chan, fd, "agi_enhanced: %s\n", enhanced ? "1.0" : "0.0");
+	ast_agi_send(fd, chan, "agi_context: %s\n", chan->context);
+	ast_agi_send(fd, chan, "agi_extension: %s\n", chan->exten);
+	ast_agi_send(fd, chan, "agi_priority: %d\n", chan->priority);
+	ast_agi_send(fd, chan, "agi_enhanced: %s\n", enhanced ? "1.0" : "0.0");
 
 	/* User information */
-	ast_agi_fdprintf(chan, fd, "agi_accountcode: %s\n", chan->accountcode ? chan->accountcode : "");
-	ast_agi_fdprintf(chan, fd, "agi_threadid: %ld\n", (long)pthread_self());
+	ast_agi_send(fd, chan, "agi_accountcode: %s\n", chan->accountcode ? chan->accountcode : "");
+	ast_agi_send(fd, chan, "agi_threadid: %ld\n", (long)pthread_self());
 
 	/* Send any parameters to the fastagi server that have been passed via the agi application */
 	/* Agi application paramaters take the form of: AGI(/path/to/example/script|${EXTEN}) */
 	for(count = 1; count < argc; count++)
-		ast_agi_fdprintf(chan, fd, "agi_arg_%d: %s\n", count, argv[count]);
+		ast_agi_send(fd, chan, "agi_arg_%d: %s\n", count, argv[count]);
 
 	/* End with empty return */
-	ast_agi_fdprintf(chan, fd, "\n");
+	ast_agi_send(fd, chan, "\n");
 }
 
 static int handle_answer(struct ast_channel *chan, AGI *agi, int argc, char *argv[])
@@ -955,7 +955,7 @@
 	if (chan->_state != AST_STATE_UP)
 		res = ast_answer(chan);
 
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -968,7 +968,7 @@
 	if (sscanf(argv[3], "%d", &to) != 1)
 		return RESULT_SHOWUSAGE;
 	res = ast_waitfordigit_full(chan, to, agi->audio, agi->ctrl);
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -987,7 +987,7 @@
 	   parsing, then here, add a newline at the end of the string
 	   before sending it to ast_sendtext --DUDE */
 	res = ast_sendtext(chan, argv[2]);
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1000,14 +1000,14 @@
 
 	res = ast_recvchar(chan,atoi(argv[2]));
 	if (res == 0) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%d (timeout)\n", res);
+		ast_agi_send(agi->fd, chan, "200 result=%d (timeout)\n", res);
 		return RESULT_SUCCESS;
 	}
 	if (res > 0) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+		ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 		return RESULT_SUCCESS;
 	}
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d (hangup)\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d (hangup)\n", res);
 	return RESULT_FAILURE;
 }
 
@@ -1020,10 +1020,10 @@
 
 	buf = ast_recvtext(chan, atoi(argv[2]));
 	if (buf) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=1 (%s)\n", buf);
+		ast_agi_send(agi->fd, chan, "200 result=1 (%s)\n", buf);
 		ast_free(buf);
 	} else {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=-1\n");
+		ast_agi_send(agi->fd, chan, "200 result=-1\n");
 	}
 	return RESULT_SUCCESS;
 }
@@ -1048,9 +1048,9 @@
 	}
 	res = ast_channel_setoption(chan, AST_OPTION_TDD, &x, sizeof(char), 0);
 	if (res != RESULT_SUCCESS) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=0\n");
+		ast_agi_send(agi->fd, chan, "200 result=0\n");
 	} else {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=1\n");
+		ast_agi_send(agi->fd, chan, "200 result=1\n");
 	}
 	return RESULT_SUCCESS;
 }
@@ -1067,7 +1067,7 @@
 	if (!ast_check_hangup(chan)) {
 		res = 0;
 	}
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1102,7 +1102,7 @@
 
 	res = ast_control_streamfile(chan, argv[3], fwd, rev, stop, suspend, NULL, skipms, NULL);
 
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
@@ -1124,7 +1124,7 @@
 		return RESULT_SHOWUSAGE;
 
 	if (!(fs = ast_openstream(chan, argv[2], chan->language))) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%d endpos=%ld\n", 0, sample_offset);
+		ast_agi_send(agi->fd, chan, "200 result=%d endpos=%ld\n", 0, sample_offset);
 		return RESULT_SUCCESS;
 	}
 
@@ -1152,7 +1152,7 @@
 		/* Stop this command, don't print a result line, as there is a new command */
 		return RESULT_SUCCESS;
 	}
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d endpos=%ld\n", res, sample_offset);
+	ast_agi_send(agi->fd, chan, "200 result=%d endpos=%ld\n", res, sample_offset);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1179,7 +1179,7 @@
 	}
 
 	if (!(fs = ast_openstream(chan, argv[2], chan->language))) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%d endpos=%ld\n", 0, sample_offset);
+		ast_agi_send(agi->fd, chan, "200 result=%d endpos=%ld\n", 0, sample_offset);
 		ast_log(LOG_WARNING, "Unable to open %s\n", argv[2]);
 		return RESULT_SUCCESS;
 	}
@@ -1217,7 +1217,7 @@
 			res=0;
 	}
 
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d endpos=%ld\n", res, sample_offset);
+	ast_agi_send(agi->fd, chan, "200 result=%d endpos=%ld\n", res, sample_offset);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1237,7 +1237,7 @@
 	res = ast_say_number_full(chan, num, argv[3], chan->language, argc > 4 ? argv[4] : NULL, agi->audio, agi->ctrl);
 	if (res == 1)
 		return RESULT_SUCCESS;
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1253,7 +1253,7 @@
 	res = ast_say_digit_str_full(chan, argv[2], argv[3], chan->language, agi->audio, agi->ctrl);
 	if (res == 1) /* New command */
 		return RESULT_SUCCESS;
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1267,7 +1267,7 @@
 	res = ast_say_character_str_full(chan, argv[2], argv[3], chan->language, agi->audio, agi->ctrl);
 	if (res == 1) /* New command */
 		return RESULT_SUCCESS;
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1282,7 +1282,7 @@
 	res = ast_say_date(chan, num, argv[3], chan->language);
 	if (res == 1)
 		return RESULT_SUCCESS;
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1297,7 +1297,7 @@
 	res = ast_say_time(chan, num, argv[3], chan->language);
 	if (res == 1)
 		return RESULT_SUCCESS;
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1331,7 +1331,7 @@
 	if (res == 1)
 		return RESULT_SUCCESS;
 
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1345,7 +1345,7 @@
 	res = ast_say_phonetic_str_full(chan, argv[2], argv[3], chan->language, agi->audio, agi->ctrl);
 	if (res == 1) /* New command */
 		return RESULT_SUCCESS;
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 	return (res >= 0) ? RESULT_SUCCESS : RESULT_FAILURE;
 }
 
@@ -1368,11 +1368,11 @@
 	if (res == 2)			/* New command */
 		return RESULT_SUCCESS;
 	else if (res == 1)
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%s (timeout)\n", data);
+		ast_agi_send(agi->fd, chan, "200 result=%s (timeout)\n", data);
 	else if (res < 0 )
-		ast_agi_fdprintf(chan, agi->fd, "200 result=-1\n");
+		ast_agi_send(agi->fd, chan, "200 result=-1\n");
 	else
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%s\n", data);
+		ast_agi_send(agi->fd, chan, "200 result=%s\n", data);
 	return RESULT_SUCCESS;
 }
 
@@ -1382,7 +1382,7 @@
 	if (argc != 3)
 		return RESULT_SHOWUSAGE;
 	ast_copy_string(chan->context, argv[2], sizeof(chan->context));
-	ast_agi_fdprintf(chan, agi->fd, "200 result=0\n");
+	ast_agi_send(agi->fd, chan, "200 result=0\n");
 	return RESULT_SUCCESS;
 }
 
@@ -1391,7 +1391,7 @@
 	if (argc != 3)
 		return RESULT_SHOWUSAGE;
 	ast_copy_string(chan->exten, argv[2], sizeof(chan->exten));
-	ast_agi_fdprintf(chan, agi->fd, "200 result=0\n");
+	ast_agi_send(agi->fd, chan, "200 result=0\n");
 	return RESULT_SUCCESS;
 }
 
@@ -1408,7 +1408,7 @@
 	}
 
 	ast_explicit_goto(chan, NULL, NULL, pri);
-	ast_agi_fdprintf(chan, agi->fd, "200 result=0\n");
+	ast_agi_send(agi->fd, chan, "200 result=0\n");
 	return RESULT_SUCCESS;
 }
 
@@ -1483,12 +1483,12 @@
 	if (!res)
 		res = ast_waitstream(chan, argv[4]);
 	if (res) {
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%d (randomerror) endpos=%ld\n", res, sample_offset);
+		ast_agi_send(agi->fd, chan, "200 result=%d (randomerror) endpos=%ld\n", res, sample_offset);
 	} else {
 		fs = ast_writefile(argv[2], argv[3], NULL, O_CREAT | O_WRONLY | (sample_offset ? O_APPEND : 0), 0, AST_FILE_MODE);
 		if (!fs) {
 			res = -1;
-			ast_agi_fdprintf(chan, agi->fd, "200 result=%d (writefile)\n", res);
+			ast_agi_send(agi->fd, chan, "200 result=%d (writefile)\n", res);
 			if (sildet)
 				ast_dsp_free(sildet);
 			return RESULT_FAILURE;
@@ -1508,14 +1508,14 @@
 			res = ast_waitfor(chan, -1);
 			if (res < 0) {
 				ast_closestream(fs);
-				ast_agi_fdprintf(chan, agi->fd, "200 result=%d (waitfor) endpos=%ld\n", res,sample_offset);
+				ast_agi_send(agi->fd, chan, "200 result=%d (waitfor) endpos=%ld\n", res,sample_offset);
 				if (sildet)
 					ast_dsp_free(sildet);
 				return RESULT_FAILURE;
 			}
 			f = ast_read(chan);
 			if (!f) {
-				ast_agi_fdprintf(chan, agi->fd, "200 result=%d (hangup) endpos=%ld\n", -1, sample_offset);
+				ast_agi_send(agi->fd, chan, "200 result=%d (hangup) endpos=%ld\n", -1, sample_offset);
 				ast_closestream(fs);
 				if (sildet)
 					ast_dsp_free(sildet);
@@ -1530,7 +1530,7 @@
 					ast_stream_rewind(fs, 200);
 					ast_truncstream(fs);
 					sample_offset = ast_tellstream(fs);
-					ast_agi_fdprintf(chan, agi->fd, "200 result=%d (dtmf) endpos=%ld\n", f->subclass, sample_offset);
+					ast_agi_send(agi->fd, chan, "200 result=%d (dtmf) endpos=%ld\n", f->subclass, sample_offset);
 					ast_closestream(fs);
 					ast_frfree(f);
 					if (sildet)
@@ -1575,7 +1575,7 @@
 			ast_truncstream(fs);
 			sample_offset = ast_tellstream(fs);
 		}
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%d (timeout) endpos=%ld\n", res, sample_offset);
+		ast_agi_send(agi->fd, chan, "200 result=%d (timeout) endpos=%ld\n", res, sample_offset);
 		ast_closestream(fs);
 	}
 
@@ -1605,7 +1605,7 @@
 		whentohangup.tv_usec = (timeout - whentohangup.tv_sec) * 1000000.0;
 	}
 	ast_channel_setwhentohangup_tv(chan, whentohangup);
-	ast_agi_fdprintf(chan, agi->fd, "200 result=0\n");
+	ast_agi_send(agi->fd, chan, "200 result=0\n");
 	return RESULT_SUCCESS;
 }
 
@@ -1616,7 +1616,7 @@
 	if (argc == 1) {
 		/* no argument: hangup the current channel */
 		ast_softhangup(chan,AST_SOFTHANGUP_EXPLICIT);
-		ast_agi_fdprintf(chan, agi->fd, "200 result=1\n");
+		ast_agi_send(agi->fd, chan, "200 result=1\n");
 		return RESULT_SUCCESS;
 	} else if (argc == 2) {
 		/* one argument: look for info on the specified channel */
@@ -1624,12 +1624,12 @@
 		if (c) {
 			/* we have a matching channel */
 			ast_softhangup(c,AST_SOFTHANGUP_EXPLICIT);
-			ast_agi_fdprintf(chan, agi->fd, "200 result=1\n");
+			ast_agi_send(agi->fd, chan, "200 result=1\n");
 			ast_channel_unlock(c);
 			return RESULT_SUCCESS;
 		}
 		/* if we get this far no channel name matched the argument given */
-		ast_agi_fdprintf(chan, agi->fd, "200 result=-1\n");
+		ast_agi_send(agi->fd, chan, "200 result=-1\n");
 		return RESULT_SUCCESS;
 	} else {
 		return RESULT_SHOWUSAGE;
@@ -1671,7 +1671,7 @@
 		ast_log(LOG_WARNING, "Could not find application (%s)\n", argv[1]);
 		res = -2;
 	}
-	ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", res);
+	ast_agi_send(agi->fd, chan, "200 result=%d\n", res);
 
 	/* Even though this is wrong, users are depending upon this result. */
 	return res;
@@ -1694,7 +1694,7 @@
 		ast_set_callerid(chan, l, n, NULL);
 	}
 
-	ast_agi_fdprintf(chan, agi->fd, "200 result=1\n");
+	ast_agi_send(agi->fd, chan, "200 result=1\n");
 	return RESULT_SUCCESS;
 }
 
@@ -1703,18 +1703,18 @@
 	struct ast_channel *c;
 	if (argc == 2) {
 		/* no argument: supply info on the current channel */
-		ast_agi_fdprintf(chan, agi->fd, "200 result=%d\n", chan->_state);
+		ast_agi_send(agi->fd, chan, "200 result=%d\n", chan->_state);
 		return RESULT_SUCCESS;
 	} else if (argc == 3) {

[... 397 lines stripped ...]



More information about the asterisk-commits mailing list