aboutsummaryrefslogtreecommitdiffstats
path: root/1.4.23-rc4/funcs
diff options
context:
space:
mode:
Diffstat (limited to '1.4.23-rc4/funcs')
-rw-r--r--1.4.23-rc4/funcs/Makefile32
-rw-r--r--1.4.23-rc4/funcs/func_audiohookinherit.c282
-rw-r--r--1.4.23-rc4/funcs/func_base64.c94
-rw-r--r--1.4.23-rc4/funcs/func_callerid.c187
-rw-r--r--1.4.23-rc4/funcs/func_cdr.c185
-rw-r--r--1.4.23-rc4/funcs/func_channel.c198
-rw-r--r--1.4.23-rc4/funcs/func_curl.c215
-rw-r--r--1.4.23-rc4/funcs/func_cut.c330
-rw-r--r--1.4.23-rc4/funcs/func_db.c231
-rw-r--r--1.4.23-rc4/funcs/func_enum.c198
-rw-r--r--1.4.23-rc4/funcs/func_env.c158
-rw-r--r--1.4.23-rc4/funcs/func_global.c86
-rw-r--r--1.4.23-rc4/funcs/func_groupcount.c243
-rw-r--r--1.4.23-rc4/funcs/func_language.c90
-rw-r--r--1.4.23-rc4/funcs/func_logic.c214
-rw-r--r--1.4.23-rc4/funcs/func_math.c268
-rw-r--r--1.4.23-rc4/funcs/func_md5.c120
-rw-r--r--1.4.23-rc4/funcs/func_moh.c87
-rw-r--r--1.4.23-rc4/funcs/func_odbc.c672
-rw-r--r--1.4.23-rc4/funcs/func_rand.c104
-rw-r--r--1.4.23-rc4/funcs/func_realtime.c175
-rw-r--r--1.4.23-rc4/funcs/func_sha1.c83
-rw-r--r--1.4.23-rc4/funcs/func_strings.c636
-rw-r--r--1.4.23-rc4/funcs/func_timeout.c194
-rw-r--r--1.4.23-rc4/funcs/func_uri.c101
25 files changed, 0 insertions, 5183 deletions
diff --git a/1.4.23-rc4/funcs/Makefile b/1.4.23-rc4/funcs/Makefile
deleted file mode 100644
index 7b55e6efb..000000000
--- a/1.4.23-rc4/funcs/Makefile
+++ /dev/null
@@ -1,32 +0,0 @@
-#
-# Asterisk -- A telephony toolkit for Linux.
-#
-# Makefile for dialplan functions
-#
-# Copyright (C) 2005-2006, Digium, Inc.
-#
-# This program is free software, distributed under the terms of
-# the GNU General Public License
-#
-
--include ../menuselect.makeopts ../menuselect.makedeps
-
-MENUSELECT_CATEGORY=FUNCS
-MENUSELECT_DESCRIPTION=Dialplan Functions
-
-ALL_C_MODS:=$(patsubst %.c,%,$(wildcard func_*.c))
-ALL_CC_MODS:=$(patsubst %.cc,%,$(wildcard func_*.cc))
-
-C_MODS:=$(filter-out $(MENUSELECT_FUNCS),$(ALL_C_MODS))
-CC_MODS:=$(filter-out $(MENUSELECT_FUNCS),$(ALL_CC_MODS))
-
-LOADABLE_MODS:=$(C_MODS) $(CC_MODS)
-
-ifneq ($(findstring funcs,$(MENUSELECT_EMBED)),)
- EMBEDDED_MODS:=$(LOADABLE_MODS)
- LOADABLE_MODS:=
-endif
-
-all: _all
-
-include $(ASTTOPDIR)/Makefile.moddir_rules
diff --git a/1.4.23-rc4/funcs/func_audiohookinherit.c b/1.4.23-rc4/funcs/func_audiohookinherit.c
deleted file mode 100644
index 6936864e3..000000000
--- a/1.4.23-rc4/funcs/func_audiohookinherit.c
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2008, Digium, Inc.
- *
- * Mark Michelson <mmichelson@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- *
- * Please follow coding guidelines
- * http://svn.digium.com/view/asterisk/trunk/doc/CODING-GUIDELINES
- */
-
-/*! \file
- *
- * \brief Audiohook inheritance function
- *
- * \author \verbatim Mark Michelson <mmichelson@digium.com> \endverbatim
- *
- * \ingroup functions
- */
-
-#include "asterisk.h"
-#include "asterisk/channel.h"
-#include "asterisk/audiohook.h"
-#include "asterisk/pbx.h"
-#include "asterisk/module.h"
-#include "asterisk/options.h"
-
-struct inheritable_audiohook {
- AST_LIST_ENTRY(inheritable_audiohook) list;
- char source[1];
-};
-
-struct audiohook_inheritance_datastore {
- AST_LIST_HEAD (, inheritable_audiohook) allowed_list;
-};
-
-static void audiohook_inheritance_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan);
-static void audiohook_inheritance_destroy (void *data);
-static const struct ast_datastore_info audiohook_inheritance_info = {
- .type = "audiohook inheritance",
- .destroy = audiohook_inheritance_destroy,
- .chan_fixup = audiohook_inheritance_fixup,
-};
-
-/*! \brief Move audiohooks as defined by previous calls to the AUDIOHOOK_INHERIT function
- *
- * Move allowed audiohooks from the old channel to the new channel.
- *
- * \param data The ast_datastore containing audiohook inheritance information that will be moved
- * \param old_chan The "clone" channel from a masquerade. We are moving the audiohook in question off of this channel
- * \param new_chan The "original" channel from a masquerade. We are moving the audiohook in question to this channel
- * \return Void
- */
-static void audiohook_inheritance_fixup(void *data, struct ast_channel *old_chan, struct ast_channel *new_chan)
-{
- struct inheritable_audiohook *audiohook = NULL;
- struct audiohook_inheritance_datastore *datastore = data;
-
- if (option_debug > 1) {
- ast_log(LOG_DEBUG, "inheritance fixup occurring for channels %s(%p) and %s(%p)", old_chan->name, old_chan, new_chan->name, new_chan);
- }
-
- AST_LIST_TRAVERSE(&datastore->allowed_list, audiohook, list) {
- ast_audiohook_move_by_source(old_chan, new_chan, audiohook->source);
- if (option_debug > 2) {
- ast_log(LOG_DEBUG, "Moved audiohook %s from %s(%p) to %s(%p)\n",
- audiohook->source, old_chan->name, old_chan, new_chan->name, new_chan);
- }
- }
- return;
-}
-
-/*! \brief Destroy dynamically allocated data on an audiohook_inheritance_datastore
- *
- * \param data Pointer to the audiohook_inheritance_datastore in question.
- * \return Void
- */
-static void audiohook_inheritance_destroy(void *data)
-{
- struct audiohook_inheritance_datastore *audiohook_inheritance_datastore = data;
- struct inheritable_audiohook *inheritable_audiohook = NULL;
-
- while ((inheritable_audiohook = AST_LIST_REMOVE_HEAD(&audiohook_inheritance_datastore->allowed_list, list))) {
- ast_free(inheritable_audiohook);
- }
-}
-
-/*! \brief create an audiohook_inheritance_datastore and attach it to a channel
- *
- * \param chan The channel to which we wish to attach the new datastore
- * \return Returns the newly created audiohook_inheritance_datastore or NULL on error
- */
-static struct audiohook_inheritance_datastore *setup_inheritance_datastore(struct ast_channel *chan)
-{
- struct ast_datastore *datastore = NULL;
- struct audiohook_inheritance_datastore *audiohook_inheritance_datastore = NULL;
-
- if (!(datastore = ast_channel_datastore_alloc(&audiohook_inheritance_info, NULL))) {
- return NULL;
- }
-
- if (!(audiohook_inheritance_datastore = ast_calloc(1, sizeof(*audiohook_inheritance_datastore)))) {
- ast_channel_datastore_free(datastore);
- return NULL;
- }
-
- datastore->data = audiohook_inheritance_datastore;
- ast_channel_lock(chan);
- ast_channel_datastore_add(chan, datastore);
- ast_channel_unlock(chan);
- return audiohook_inheritance_datastore;
-}
-
-/*! \brief Create a new inheritable_audiohook structure and add it to an audiohook_inheritance_datastore
- *
- * \param audiohook_inheritance_datastore The audiohook_inheritance_datastore we want to add the new inheritable_audiohook to
- * \param source The audiohook source for the newly created inheritable_audiohook
- * \retval 0 Success
- * \retval non-zero Failure
- */
-static int setup_inheritable_audiohook(struct audiohook_inheritance_datastore *audiohook_inheritance_datastore, const char *source)
-{
- struct inheritable_audiohook *inheritable_audiohook = NULL;
-
- inheritable_audiohook = ast_calloc(1, sizeof(*inheritable_audiohook) + strlen(source));
-
- if (!inheritable_audiohook) {
- return -1;
- }
-
- strcpy(inheritable_audiohook->source, source);
- AST_LIST_INSERT_TAIL(&audiohook_inheritance_datastore->allowed_list, inheritable_audiohook, list);
- if (option_debug > 2) {
- ast_log(LOG_DEBUG, "Set audiohook %s to be inheritable\n", source);
- }
- return 0;
-}
-
-/*! \brief Set the permissibility of inheritance for a particular audiohook source on a channel
- *
- * For details regarding what happens in the function, see the inline comments
- *
- * \param chan The channel we are operating on
- * \param function The name of the dialplan function (AUDIOHOOK_INHERIT)
- * \param data The audiohook source for which we are setting inheritance permissions
- * \param value The value indicating the permission for audiohook inheritance
- */
-static int func_inheritance_write(struct ast_channel *chan, char *function, char *data, const char *value)
-{
- int allow;
- struct ast_datastore *datastore = NULL;
- struct audiohook_inheritance_datastore *inheritance_datastore = NULL;
- struct inheritable_audiohook *inheritable_audiohook;
-
- /* Step 1: Get data from function call */
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "No argument provided to INHERITANCE function.\n");
- return -1;
- }
-
- if (ast_strlen_zero(value)) {
- ast_log(LOG_WARNING, "No value provided to INHERITANCE function.\n");
- return -1;
- }
-
- allow = ast_true(value);
-
- /* Step 2: retrieve or set up datastore */
- ast_channel_lock(chan);
- if (!(datastore = ast_channel_datastore_find(chan, &audiohook_inheritance_info, NULL))) {
- ast_channel_unlock(chan);
- /* In the case where we cannot find the datastore, we can take a few shortcuts */
- if (!allow) {
- if (option_debug) {
- ast_log(LOG_DEBUG, "Audiohook %s is already set to not be inheritable on channel %s\n", data, chan->name);
- }
- return 0;
- } else if (!(inheritance_datastore = setup_inheritance_datastore(chan))) {
- ast_log(LOG_WARNING, "Unable to set up audiohook inheritance datastore on channel %s\n", chan->name);
- return -1;
- } else {
- return setup_inheritable_audiohook(inheritance_datastore, data);
- }
- } else {
- inheritance_datastore = datastore->data;
- }
- ast_channel_unlock(chan);
-
- /* Step 3: Traverse the list to see if we're trying something redundant */
-
- AST_LIST_TRAVERSE_SAFE_BEGIN(&inheritance_datastore->allowed_list, inheritable_audiohook, list) {
- if (!strcasecmp(inheritable_audiohook->source, data)) {
- if (allow) {
- if (option_debug > 1) {
- ast_log(LOG_DEBUG, "Audiohook source %s is already set up to be inherited from channel %s\n", data, chan->name);
- }
- return 0;
- } else {
- if (option_debug > 1) {
- ast_log(LOG_DEBUG, "Removing inheritability of audiohook %s from channel %s\n", data, chan->name);
- }
- AST_LIST_REMOVE_CURRENT(&inheritance_datastore->allowed_list, list);
- ast_free(inheritable_audiohook);
- return 0;
- }
- }
- }
- AST_LIST_TRAVERSE_SAFE_END;
-
- /* Step 4: There is no step 4 */
-
- /* Step 5: This means we are addressing an audiohook source which we have not encountered yet for the channel. Create a new inheritable
- * audiohook structure if we're allowing inheritance, or just return if not
- */
-
- if (allow) {
- return setup_inheritable_audiohook(inheritance_datastore, data);
- } else {
- if (option_debug) {
- ast_log(LOG_DEBUG, "Audiohook %s is already set to not be inheritable on channel %s\n", data, chan->name);
- }
- return 0;
- }
-}
-
-static struct ast_custom_function inheritance_function = {
- .name = "AUDIOHOOK_INHERIT",
- .synopsis = "Set whether an audiohook may be inherited to another channel",
- .syntax = "AUDIOHOOK_INHERIT(source)",
- .desc =
- "By enabling audiohook inheritance on the channel, you are giving\n"
- "permission for an audiohook to be inherited by a descendent channel.\n"
- "Inheritance may be be disabled at any point as well.\n"
- "\n"
- " Example scenario:\n"
- " exten => 2000,1,MixMonitor(blah.wav)\n"
- " exten => 2000,n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)\n"
- " exten => 2000,n,Dial(SIP/2000)\n"
- "\n"
- " exten => 4000,1,Dial(SIP/4000)\n"
- "\n"
- " exten => 5000,1,MixMonitor(blah2.wav)\n"
- " exten => 5000,n,Dial(SIP/5000)\n"
- "\n"
- " In this basic dialplan scenario, let's consider the following sample calls\n"
- " Call 1: Caller dials 2000. The person who answers then executes an attended\n"
- " transfer to 4000.\n"
- " Result: Since extension 2000 set MixMonitor to be inheritable, after the\n"
- " transfer to 400 has completed, the call will continue to be recorded\n"
- " to blah.wav\n"
- "\n"
- " Call 2: Caller dials 5000. The person who answers then executes an attended\n"
- " transfer to 4000.\n"
- " Result: Since extension 5000 did not set MixMonitor to be inheritable, the\n"
- " recording will stop once the call has been transferred to 4000.\n",
- .write = func_inheritance_write,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&inheritance_function);
-}
-
-static int load_module(void)
-{
- if (ast_custom_function_register(&inheritance_function)) {
- return AST_MODULE_LOAD_DECLINE;
- } else {
- return AST_MODULE_LOAD_SUCCESS;
- }
-}
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Audiohook inheritance function");
diff --git a/1.4.23-rc4/funcs/func_base64.c b/1.4.23-rc4/funcs/func_base64.c
deleted file mode 100644
index 463e6dd87..000000000
--- a/1.4.23-rc4/funcs/func_base64.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2005 - 2006, Digium, Inc.
- * Copyright (C) 2005, Claude Patry
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Use the base64 as functions
- *
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int base64_encode(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: BASE64_ENCODE(<data>) - missing argument!\n");
- return -1;
- }
-
- ast_base64encode(buf, (unsigned char *) data, strlen(data), len);
-
- return 0;
-}
-
-static int base64_decode(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: BASE64_DECODE(<base_64 string>) - missing argument!\n");
- return -1;
- }
-
- ast_base64decode((unsigned char *) buf, data, len);
-
- return 0;
-}
-
-static struct ast_custom_function base64_encode_function = {
- .name = "BASE64_ENCODE",
- .synopsis = "Encode a string in base64",
- .desc = "Returns the base64 string\n",
- .syntax = "BASE64_ENCODE(<string>)",
- .read = base64_encode,
-};
-
-static struct ast_custom_function base64_decode_function = {
- .name = "BASE64_DECODE",
- .synopsis = "Decode a base64 string",
- .desc = "Returns the plain text string\n",
- .syntax = "BASE64_DECODE(<base64_string>)",
- .read = base64_decode,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&base64_encode_function) |
- ast_custom_function_unregister(&base64_decode_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&base64_encode_function) |
- ast_custom_function_register(&base64_decode_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "base64 encode/decode dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_callerid.c b/1.4.23-rc4/funcs/func_callerid.c
deleted file mode 100644
index 86c54883e..000000000
--- a/1.4.23-rc4/funcs/func_callerid.c
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999-2006, Digium, Inc.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Caller ID related dialplan functions
- *
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/options.h"
-#include "asterisk/callerid.h"
-
-static int callerid_read(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- int res = -1;
- char *opt = data;
-
- if (!chan)
- return -1;
-
- if (strchr(opt, '|')) {
- char name[80], num[80];
-
- data = strsep(&opt, "|");
- ast_callerid_split(opt, name, sizeof(name), num, sizeof(num));
-
- if (!strncasecmp("all", data, 3)) {
- snprintf(buf, len, "\"%s\" <%s>", name, num);
- res = 0;
- } else if (!strncasecmp("name", data, 4)) {
- ast_copy_string(buf, name, len);
- res = 0;
- } else if (!strncasecmp("num", data, 3) ||
- !strncasecmp("number", data, 6)) {
-
- ast_copy_string(buf, num, len);
- res = 0;
- } else {
- ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
- }
- } else {
- ast_channel_lock(chan);
-
- if (!strncasecmp("all", data, 3)) {
- snprintf(buf, len, "\"%s\" <%s>",
- S_OR(chan->cid.cid_name, ""),
- S_OR(chan->cid.cid_num, ""));
- res = 0;
- } else if (!strncasecmp("name", data, 4)) {
- if (chan->cid.cid_name) {
- ast_copy_string(buf, chan->cid.cid_name, len);
- res = 0;
- }
- } else if (!strncasecmp("num", data, 3)
- || !strncasecmp("number", data, 6)) {
- if (chan->cid.cid_num) {
- ast_copy_string(buf, chan->cid.cid_num, len);
- res = 0;
- }
- } else if (!strncasecmp("ani", data, 3)) {
- if (chan->cid.cid_ani) {
- ast_copy_string(buf, chan->cid.cid_ani, len);
- res = 0;
- }
- } else if (!strncasecmp("dnid", data, 4)) {
- if (chan->cid.cid_dnid) {
- ast_copy_string(buf, chan->cid.cid_dnid, len);
- res = 0;
- }
- } else if (!strncasecmp("rdnis", data, 5)) {
- if (chan->cid.cid_rdnis) {
- ast_copy_string(buf, chan->cid.cid_rdnis, len);
- res = 0;
- }
- } else {
- ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
- }
-
- ast_channel_unlock(chan);
- }
-
- return res;
-}
-
-static int callerid_write(struct ast_channel *chan, char *cmd, char *data,
- const char *value)
-{
- if (!value || !chan)
- return -1;
-
- if (!strncasecmp("all", data, 3)) {
- char name[256];
- char num[256];
-
- if (!ast_callerid_split(value, name, sizeof(name), num, sizeof(num))) {
- ast_set_callerid(chan, num, name, num);
- if (chan->cdr)
- ast_cdr_setcid(chan->cdr, chan);
- }
- } else if (!strncasecmp("name", data, 4)) {
- ast_set_callerid(chan, NULL, value, NULL);
- if (chan->cdr)
- ast_cdr_setcid(chan->cdr, chan);
- } else if (!strncasecmp("num", data, 3) ||
- !strncasecmp("number", data, 6)) {
- ast_set_callerid(chan, value, NULL, NULL);
- if (chan->cdr)
- ast_cdr_setcid(chan->cdr, chan);
- } else if (!strncasecmp("ani", data, 3)) {
- ast_set_callerid(chan, NULL, NULL, value);
- if (chan->cdr)
- ast_cdr_setcid(chan->cdr, chan);
- } else if (!strncasecmp("dnid", data, 4)) {
- ast_channel_lock(chan);
- if (chan->cid.cid_dnid)
- free(chan->cid.cid_dnid);
- chan->cid.cid_dnid = ast_strdup(value);
- if (chan->cdr)
- ast_cdr_setcid(chan->cdr, chan);
- ast_channel_unlock(chan);
- } else if (!strncasecmp("rdnis", data, 5)) {
- ast_channel_lock(chan);
- if (chan->cid.cid_rdnis)
- free(chan->cid.cid_rdnis);
- chan->cid.cid_rdnis = ast_strdup(value);
- if (chan->cdr)
- ast_cdr_setcid(chan->cdr, chan);
- ast_channel_unlock(chan);
- } else {
- ast_log(LOG_ERROR, "Unknown callerid data type '%s'.\n", data);
- }
-
- return 0;
-}
-
-static struct ast_custom_function callerid_function = {
- .name = "CALLERID",
- .synopsis = "Gets or sets Caller*ID data on the channel.",
- .syntax = "CALLERID(datatype[,<optional-CID>])",
- .desc =
- "Gets or sets Caller*ID data on the channel. The allowable datatypes\n"
- "are \"all\", \"name\", \"num\", \"ANI\", \"DNID\", \"RDNIS\".\n"
- "Uses channel callerid by default or optional callerid, if specified.\n",
- .read = callerid_read,
- .write = callerid_write,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&callerid_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&callerid_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Caller ID related dialplan function");
diff --git a/1.4.23-rc4/funcs/func_cdr.c b/1.4.23-rc4/funcs/func_cdr.c
deleted file mode 100644
index 4e90246c4..000000000
--- a/1.4.23-rc4/funcs/func_cdr.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999-2006, Digium, Inc.
- *
- * Portions Copyright (C) 2005, Anthony Minessale II
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Call Detail Record related dialplan functions
- *
- * \author Anthony Minessale II
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/cdr.h"
-
-enum {
- OPT_RECURSIVE = (1 << 0),
- OPT_UNPARSED = (1 << 1),
- OPT_LAST = (1 << 2),
- OPT_SKIPLOCKED = (1 << 3),
-} cdr_option_flags;
-
-AST_APP_OPTIONS(cdr_func_options, {
- AST_APP_OPTION('l', OPT_LAST),
- AST_APP_OPTION('r', OPT_RECURSIVE),
- AST_APP_OPTION('s', OPT_SKIPLOCKED),
- AST_APP_OPTION('u', OPT_UNPARSED),
-});
-
-static int cdr_read(struct ast_channel *chan, char *cmd, char *parse,
- char *buf, size_t len)
-{
- char *ret;
- struct ast_flags flags = { 0 };
- struct ast_cdr *cdr = chan ? chan->cdr : NULL;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(variable);
- AST_APP_ARG(options);
- );
-
- if (ast_strlen_zero(parse))
- return -1;
-
- if (!cdr)
- return -1;
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- if (!ast_strlen_zero(args.options))
- ast_app_parse_options(cdr_func_options, &flags, NULL, args.options);
-
- if (ast_test_flag(&flags, OPT_LAST))
- while (cdr->next)
- cdr = cdr->next;
-
- if (ast_test_flag(&flags, OPT_SKIPLOCKED))
- while (ast_test_flag(cdr, AST_CDR_FLAG_LOCKED) && cdr->next)
- cdr = cdr->next;
-
- ast_cdr_getvar(cdr, args.variable, &ret, buf, len,
- ast_test_flag(&flags, OPT_RECURSIVE),
- ast_test_flag(&flags, OPT_UNPARSED));
-
- return ret ? 0 : -1;
-}
-
-static int cdr_write(struct ast_channel *chan, char *cmd, char *parse,
- const char *value)
-{
- struct ast_cdr *cdr = chan ? chan->cdr : NULL;
- struct ast_flags flags = { 0 };
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(variable);
- AST_APP_ARG(options);
- );
-
- if (ast_strlen_zero(parse) || !value || !chan)
- return -1;
-
- if (!cdr)
- return -1;
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- if (!ast_strlen_zero(args.options))
- ast_app_parse_options(cdr_func_options, &flags, NULL, args.options);
-
- if (ast_test_flag(&flags, OPT_LAST))
- while (cdr->next)
- cdr = cdr->next;
-
- if (!strcasecmp(args.variable, "accountcode")) /* the 'l' flag doesn't apply to setting the accountcode, userfield, or amaflags */
- ast_cdr_setaccount(chan, value);
- else if (!strcasecmp(args.variable, "userfield"))
- ast_cdr_setuserfield(chan, value);
- else if (!strcasecmp(args.variable, "amaflags"))
- ast_cdr_setamaflags(chan, value);
- else
- ast_cdr_setvar(cdr, args.variable, value, ast_test_flag(&flags, OPT_RECURSIVE));
- /* No need to worry about the u flag, as all fields for which setting
- * 'u' would do anything are marked as readonly. */
-
- return 0;
-}
-
-static struct ast_custom_function cdr_function = {
- .name = "CDR",
- .synopsis = "Gets or sets a CDR variable",
- .syntax = "CDR(<name>[|options])",
- .read = cdr_read,
- .write = cdr_write,
- .desc =
-"Options:\n"
-" 'l' uses the most recent CDR on a channel with multiple records\n"
-" 'r' searches the entire stack of CDRs on the channel\n"
-" 's' skips any CDR's that are marked 'LOCKED' due to forkCDR() calls.\n"
-" (on setting/writing CDR vars only)\n"
-" 'u' retrieves the raw, unprocessed value\n"
-" For example, 'start', 'answer', and 'end' will be retrieved as epoch\n"
-" values, when the 'u' option is passed, but formatted as YYYY-MM-DD HH:MM:SS\n"
-" otherwise. Similarly, disposition and amaflags will return their raw\n"
-" integral values.\n"
-" Here is a list of all the available cdr field names:\n"
-" clid lastdata disposition\n"
-" src start amaflags\n"
-" dst answer accountcode\n"
-" dcontext end uniqueid\n"
-" dstchannel duration userfield\n"
-" lastapp billsec channel\n"
-" All of the above variables are read-only, except for accountcode,\n"
-" userfield, and amaflags. You may, however, supply\n"
-" a name not on the above list, and create your own\n"
-" variable, whose value can be changed with this function,\n"
-" and this variable will be stored on the cdr.\n"
-" For setting CDR values, the 'l' flag does not apply to\n"
-" setting the accountcode, userfield, or amaflags.\n"
-" raw values for disposition:\n"
-" 1 = NO ANSWER\n"
-" 2 = BUSY\n"
-" 3 = FAILED\n"
-" 4 = ANSWERED\n"
-" raw values for amaflags:\n"
-" 1 = OMIT\n"
-" 2 = BILLING\n"
-" 3 = DOCUMENTATION\n",
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&cdr_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&cdr_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "CDR dialplan function");
diff --git a/1.4.23-rc4/funcs/func_channel.c b/1.4.23-rc4/funcs/func_channel.c
deleted file mode 100644
index 302272e0b..000000000
--- a/1.4.23-rc4/funcs/func_channel.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2006, Digium, Inc.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Channel info dialplan function
- *
- * \author Kevin P. Fleming <kpfleming@digium.com>
- *
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <regex.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/indications.h"
-#include "asterisk/stringfields.h"
-
-#define locked_copy_string(chan, dest, source, len) \
- do { \
- ast_channel_lock(chan); \
- ast_copy_string(dest, source, len); \
- ast_channel_unlock(chan); \
- } while (0)
-#define locked_string_field_set(chan, field, source) \
- do { \
- ast_channel_lock(chan); \
- ast_string_field_set(chan, field, source); \
- ast_channel_unlock(chan); \
- } while (0)
-
-char *transfercapability_table[0x20] = {
- "SPEECH", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK",
- "DIGITAL", "RESTRICTED_DIGITAL", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK",
- "3K1AUDIO", "DIGITAL_W_TONES", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK",
- "VIDEO", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK", "UNK", };
-
-static int func_channel_read(struct ast_channel *chan, char *function,
- char *data, char *buf, size_t len)
-{
- int ret = 0;
-
- if (!strcasecmp(data, "audionativeformat"))
- /* use the _multiple version when chan->nativeformats holds multiple formats */
- /* ast_getformatname_multiple(buf, len, chan->nativeformats & AST_FORMAT_AUDIO_MASK); */
- ast_copy_string(buf, ast_getformatname(chan->nativeformats & AST_FORMAT_AUDIO_MASK), len);
- else if (!strcasecmp(data, "videonativeformat"))
- /* use the _multiple version when chan->nativeformats holds multiple formats */
- /* ast_getformatname_multiple(buf, len, chan->nativeformats & AST_FORMAT_VIDEO_MASK); */
- ast_copy_string(buf, ast_getformatname(chan->nativeformats & AST_FORMAT_VIDEO_MASK), len);
- else if (!strcasecmp(data, "audioreadformat"))
- ast_copy_string(buf, ast_getformatname(chan->readformat), len);
- else if (!strcasecmp(data, "audiowriteformat"))
- ast_copy_string(buf, ast_getformatname(chan->writeformat), len);
- else if (!strcasecmp(data, "tonezone") && chan->zone)
- locked_copy_string(chan, buf, chan->zone->country, len);
- else if (!strcasecmp(data, "language"))
- locked_copy_string(chan, buf, chan->language, len);
- else if (!strcasecmp(data, "musicclass"))
- locked_copy_string(chan, buf, chan->musicclass, len);
- else if (!strcasecmp(data, "state"))
- locked_copy_string(chan, buf, ast_state2str(chan->_state), len);
- else if (!strcasecmp(data, "channeltype"))
- locked_copy_string(chan, buf, chan->tech->type, len);
- else if (!strcasecmp(data, "transfercapability"))
- locked_copy_string(chan, buf, transfercapability_table[chan->transfercapability & 0x1f], len);
- else if (!strcasecmp(data, "callgroup")) {
- char groupbuf[256];
- locked_copy_string(chan, buf, ast_print_group(groupbuf, sizeof(groupbuf), chan->callgroup), len);
- } else if (!chan->tech->func_channel_read
- || chan->tech->func_channel_read(chan, function, data, buf, len)) {
- ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n", data);
- ret = -1;
- }
-
- return ret;
-}
-
-static int func_channel_write(struct ast_channel *chan, char *function,
- char *data, const char *value)
-{
- int ret = 0;
- signed char gainset;
-
- if (!strcasecmp(data, "language"))
- locked_string_field_set(chan, language, value);
- else if (!strcasecmp(data, "musicclass"))
- locked_string_field_set(chan, musicclass, value);
- else if (!strcasecmp(data, "tonezone")) {
- struct tone_zone *new_zone;
- if (!(new_zone = ast_get_indication_zone(value))) {
- ast_log(LOG_ERROR, "Unknown country code '%s' for tonezone. Check indications.conf for available country codes.\n", value);
- ret = -1;
- } else
- chan->zone = new_zone;
- } else if (!strcasecmp(data, "callgroup"))
- chan->callgroup = ast_get_group(value);
- else if (!strcasecmp(data, "txgain")) {
- sscanf(value, "%hhd", &gainset);
- ast_channel_setoption(chan, AST_OPTION_TXGAIN, &gainset, sizeof(gainset), 0);
- } else if (!strcasecmp(data, "rxgain")) {
- sscanf(value, "%hhd", &gainset);
- ast_channel_setoption(chan, AST_OPTION_RXGAIN, &gainset, sizeof(gainset), 0);
- } else if (!strcasecmp(data, "transfercapability")) {
- unsigned short i;
- for (i = 0; i < 0x20; i++) {
- if (!strcasecmp(transfercapability_table[i], value) && strcmp(value, "UNK")) {
- chan->transfercapability = i;
- break;
- }
- }
- } else if (!chan->tech->func_channel_write
- || chan->tech->func_channel_write(chan, function, data, value)) {
- ast_log(LOG_WARNING, "Unknown or unavailable item requested: '%s'\n",
- data);
- ret = -1;
- }
-
- return ret;
-}
-
-static struct ast_custom_function channel_function = {
- .name = "CHANNEL",
- .synopsis = "Gets/sets various pieces of information about the channel.",
- .syntax = "CHANNEL(item)",
- .desc = "Gets/set various pieces of information about the channel.\n"
- "Standard items (provided by all channel technologies) are:\n"
- "R/O audioreadformat format currently being read\n"
- "R/O audionativeformat format used natively for audio\n"
- "R/O audiowriteformat format currently being written\n"
- "R/W callgroup call groups for call pickup\n"
- "R/O channeltype technology used for channel\n"
- "R/W language language for sounds played\n"
- "R/W musicclass class (from musiconhold.conf) for hold music\n"
- "R/W rxgain set rxgain level on channel drivers that support it\n"
- "R/O state state for channel\n"
- "R/W tonezone zone for indications played\n"
- "R/W txgain set txgain level on channel drivers that support it\n"
- "R/O videonativeformat format used natively for video\n"
- "\n"
- "chan_sip provides the following additional options:\n"
- "R/O rtpqos Get QOS information about the RTP stream\n"
- " This option takes two additional arguments:\n"
- " Argument 1:\n"
- " audio Get data about the audio stream\n"
- " video Get data about the video stream\n"
- " Argument 2:\n"
- " local_ssrc Local SSRC (stream ID)\n"
- " local_lostpackets Local lost packets\n"
- " local_jitter Local calculated jitter\n"
- " local_count Number of received packets\n"
- " remote_ssrc Remote SSRC (stream ID)\n"
- " remote_lostpackets Remote lost packets\n"
- " remote_jitter Remote reported jitter\n"
- " remote_count Number of transmitted packets\n"
- " rtt Round trip time\n"
- " all All statistics (in a form suited to logging, but not for parsing)\n"
- "\n"
- "Additional items may be available from the channel driver providing\n"
- "the channel; see its documentation for details.\n"
- "\n"
- "Any item requested that is not available on the current channel will\n"
- "return an empty string.\n",
- .read = func_channel_read,
- .write = func_channel_write,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&channel_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&channel_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Channel information dialplan function");
diff --git a/1.4.23-rc4/funcs/func_curl.c b/1.4.23-rc4/funcs/func_curl.c
deleted file mode 100644
index 2c71cf7a2..000000000
--- a/1.4.23-rc4/funcs/func_curl.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2004 - 2006, Tilghman Lesher
- *
- * Tilghman Lesher <curl-20050919@the-tilghman.com>
- * and Brian Wilkins <bwilkins@cfl.rr.com> (Added POST option)
- *
- * app_curl.c is distributed with no restrictions on usage or
- * redistribution.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- */
-
-/*! \file
- *
- * \brief Curl - Load a URL
- *
- * \author Tilghman Lesher <curl-20050919@the-tilghman.com>
- *
- * \note Brian Wilkins <bwilkins@cfl.rr.com> (Added POST option)
- *
- * \ingroup functions
- */
-
-/*** MODULEINFO
- <depend>curl</depend>
- ***/
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <curl/curl.h>
-
-#include "asterisk/lock.h"
-#include "asterisk/file.h"
-#include "asterisk/logger.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/cli.h"
-#include "asterisk/options.h"
-#include "asterisk/module.h"
-#include "asterisk/app.h"
-#include "asterisk/utils.h"
-#include "asterisk/threadstorage.h"
-
-struct MemoryStruct {
- char *memory;
- size_t size;
-};
-
-static void *myrealloc(void *ptr, size_t size)
-{
- /* There might be a realloc() out there that doesn't like reallocing
- NULL pointers, so we take care of it here */
- if (ptr)
- return ast_realloc(ptr, size);
- else
- return ast_malloc(size);
-}
-
-static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
-{
- register int realsize = size * nmemb;
- struct MemoryStruct *mem = (struct MemoryStruct *)data;
-
- mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1);
- if (mem->memory) {
- memcpy(&(mem->memory[mem->size]), ptr, realsize);
- mem->size += realsize;
- mem->memory[mem->size] = 0;
- }
- return realsize;
-}
-
-static const char *global_useragent = "asterisk-libcurl-agent/1.0";
-
-static void curl_instance_cleanup(void *data)
-{
- CURL **curl = data;
-
- curl_easy_cleanup(*curl);
-
- free(data);
-}
-
-AST_THREADSTORAGE_CUSTOM(curl_instance, curl_instance_init, curl_instance_cleanup);
-
-static int curl_internal(struct MemoryStruct *chunk, char *url, char *post)
-{
- int ret;
- CURL **curl;
-
- if (!(curl = ast_threadstorage_get(&curl_instance, sizeof(*curl))))
- return -1;
-
- if (!*curl) {
- if (!(*curl = curl_easy_init()))
- return -1;
- curl_easy_setopt(*curl, CURLOPT_NOSIGNAL, 1);
- curl_easy_setopt(*curl, CURLOPT_TIMEOUT, 180);
- curl_easy_setopt(*curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
- curl_easy_setopt(*curl, CURLOPT_USERAGENT, global_useragent);
- }
-
- curl_easy_setopt(*curl, CURLOPT_URL, url);
- curl_easy_setopt(*curl, CURLOPT_WRITEDATA, (void *) chunk);
-
- if (post) {
- curl_easy_setopt(*curl, CURLOPT_POST, 1);
- curl_easy_setopt(*curl, CURLOPT_POSTFIELDS, post);
- }
-
- ret = curl_easy_perform(*curl);
-
- if (post)
- curl_easy_setopt(*curl, CURLOPT_POST, 0);
-
- return ret ? -1 : 0;
-}
-
-static int acf_curl_exec(struct ast_channel *chan, char *cmd, char *info, char *buf, size_t len)
-{
- int ret = -1;
- struct ast_module_user *u;
- struct MemoryStruct chunk = { NULL, 0 };
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(url);
- AST_APP_ARG(postdata);
- );
-
- *buf = '\0';
-
- if (ast_strlen_zero(info)) {
- ast_log(LOG_WARNING, "CURL requires an argument (URL)\n");
- return -1;
- }
-
- u = ast_module_user_add(chan);
-
- AST_STANDARD_APP_ARGS(args, info);
-
- if (chan)
- ast_autoservice_start(chan);
-
- if (!curl_internal(&chunk, args.url, args.postdata)) {
- if (chunk.memory) {
- chunk.memory[chunk.size] = '\0';
- if (chunk.memory[chunk.size - 1] == 10)
- chunk.memory[chunk.size - 1] = '\0';
-
- ast_copy_string(buf, chunk.memory, len);
- free(chunk.memory);
- }
- ret = 0;
- } else {
- ast_log(LOG_ERROR, "Cannot allocate curl structure\n");
- }
-
- if (chan)
- ast_autoservice_stop(chan);
-
- ast_module_user_remove(u);
-
- return ret;
-}
-
-struct ast_custom_function acf_curl = {
- .name = "CURL",
- .synopsis = "Retrieves the contents of a URL",
- .syntax = "CURL(url[|post-data])",
- .desc =
- " url - URL to retrieve\n"
- " post-data - Optional data to send as a POST (GET is default action)\n",
- .read = acf_curl_exec,
-};
-
-static int unload_module(void)
-{
- int res;
-
- res = ast_custom_function_unregister(&acf_curl);
-
- ast_module_user_hangup_all();
-
- curl_global_cleanup();
-
- return res;
-}
-
-static int load_module(void)
-{
- int res;
-
- if (curl_global_init(CURL_GLOBAL_ALL)) {
- ast_log(LOG_ERROR, "Unable to initialize the CURL library. Cannot load func_curl\n");
- return AST_MODULE_LOAD_DECLINE;
- }
-
- res = ast_custom_function_register(&acf_curl);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Load external URL");
-
diff --git a/1.4.23-rc4/funcs/func_cut.c b/1.4.23-rc4/funcs/func_cut.c
deleted file mode 100644
index b8f5c5869..000000000
--- a/1.4.23-rc4/funcs/func_cut.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (c) 2003-2006 Tilghman Lesher. All rights reserved.
- *
- * Tilghman Lesher <app_cut__v003@the-tilghman.com>
- *
- * This code is released by the author with no restrictions on usage.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- */
-
-/*! \file
- *
- * \brief CUT function
- *
- * \author Tilghman Lesher <app_cut__v003@the-tilghman.com>
- *
- * \ingroup functions
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "asterisk/file.h"
-#include "asterisk/logger.h"
-#include "asterisk/options.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/module.h"
-#include "asterisk/app.h"
-
-/* Maximum length of any variable */
-#define MAXRESULT 1024
-
-struct sortable_keys {
- char *key;
- float value;
-};
-
-static int sort_subroutine(const void *arg1, const void *arg2)
-{
- const struct sortable_keys *one=arg1, *two=arg2;
- if (one->value < two->value)
- return -1;
- else if (one->value == two->value)
- return 0;
- else
- return 1;
-}
-
-#define ERROR_NOARG (-1)
-#define ERROR_NOMEM (-2)
-#define ERROR_USAGE (-3)
-
-static int sort_internal(struct ast_channel *chan, char *data, char *buffer, size_t buflen)
-{
- char *strings, *ptrkey, *ptrvalue;
- int count=1, count2, element_count=0;
- struct sortable_keys *sortable_keys;
-
- memset(buffer, 0, buflen);
-
- if (!data)
- return ERROR_NOARG;
-
- strings = ast_strdupa(data);
-
- for (ptrkey = strings; *ptrkey; ptrkey++) {
- if (*ptrkey == '|')
- count++;
- }
-
- sortable_keys = alloca(count * sizeof(struct sortable_keys));
-
- memset(sortable_keys, 0, count * sizeof(struct sortable_keys));
-
- /* Parse each into a struct */
- count2 = 0;
- while ((ptrkey = strsep(&strings, "|"))) {
- ptrvalue = index(ptrkey, ':');
- if (!ptrvalue) {
- count--;
- continue;
- }
- *ptrvalue++ = '\0';
- sortable_keys[count2].key = ptrkey;
- sscanf(ptrvalue, "%f", &sortable_keys[count2].value);
- count2++;
- }
-
- /* Sort the structs */
- qsort(sortable_keys, count, sizeof(struct sortable_keys), sort_subroutine);
-
- for (count2 = 0; count2 < count; count2++) {
- int blen = strlen(buffer);
- if (element_count++) {
- strncat(buffer + blen, ",", buflen - blen - 1);
- blen++;
- }
- strncat(buffer + blen, sortable_keys[count2].key, buflen - blen - 1);
- }
-
- return 0;
-}
-
-static int cut_internal(struct ast_channel *chan, char *data, char *buffer, size_t buflen)
-{
- char *parse;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(varname);
- AST_APP_ARG(delimiter);
- AST_APP_ARG(field);
- );
-
- memset(buffer, 0, buflen);
-
- parse = ast_strdupa(data);
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- /* Check and parse arguments */
- if(args.argc < 3){
- return ERROR_NOARG;
- } else {
- char d, ds[2];
- char *tmp = alloca(strlen(args.varname) + 4);
- char varvalue[MAXRESULT], *tmp2=varvalue;
-
- if (tmp) {
- snprintf(tmp, strlen(args.varname) + 4, "${%s}", args.varname);
- memset(varvalue, 0, sizeof(varvalue));
- } else {
- return ERROR_NOMEM;
- }
-
- if (args.delimiter[0] == '\\') {
- if (args.delimiter[1] == 'n')
- d = '\n';
- else if (args.delimiter[1] == 't')
- d = '\t';
- else if (args.delimiter[1] == 'r')
- d = '\r';
- else if (args.delimiter[1])
- d = args.delimiter[1];
- else
- d = '-';
- } else if (args.delimiter[0])
- d = args.delimiter[0];
- else
- d = '-';
-
- /* String form of the delimiter, for use with strsep(3) */
- snprintf(ds, sizeof(ds), "%c", d);
-
- pbx_substitute_variables_helper(chan, tmp, tmp2, MAXRESULT - 1);
-
- if (tmp2) {
- int curfieldnum = 1;
- while (tmp2 != NULL && args.field != NULL) {
- char *nextgroup = strsep(&(args.field), "&");
- int num1 = 0, num2 = MAXRESULT;
- char trashchar;
-
- if (sscanf(nextgroup, "%d-%d", &num1, &num2) == 2) {
- /* range with both start and end */
- } else if (sscanf(nextgroup, "-%d", &num2) == 1) {
- /* range with end */
- num1 = 0;
- } else if ((sscanf(nextgroup, "%d%c", &num1, &trashchar) == 2) && (trashchar == '-')) {
- /* range with start */
- num2 = MAXRESULT;
- } else if (sscanf(nextgroup, "%d", &num1) == 1) {
- /* single number */
- num2 = num1;
- } else {
- return ERROR_USAGE;
- }
-
- /* Get to start, if any */
- if (num1 > 0) {
- while (tmp2 != (char *)NULL + 1 && curfieldnum < num1) {
- tmp2 = index(tmp2, d) + 1;
- curfieldnum++;
- }
- }
-
- /* Most frequent problem is the expectation of reordering fields */
- if ((num1 > 0) && (curfieldnum > num1))
- ast_log(LOG_WARNING, "We're already past the field you wanted?\n");
-
- /* Re-null tmp2 if we added 1 to NULL */
- if (tmp2 == (char *)NULL + 1)
- tmp2 = NULL;
-
- /* Output fields until we either run out of fields or num2 is reached */
- while (tmp2 != NULL && curfieldnum <= num2) {
- char *tmp3 = strsep(&tmp2, ds);
- int curlen = strlen(buffer);
-
- if (curlen)
- snprintf(buffer + curlen, buflen - curlen, "%c%s", d, tmp3);
- else
- snprintf(buffer, buflen, "%s", tmp3);
-
- curfieldnum++;
- }
- }
- }
- }
- return 0;
-}
-
-static int acf_sort_exec(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
- struct ast_module_user *u;
- int ret = -1;
-
- u = ast_module_user_add(chan);
-
- switch (sort_internal(chan, data, buf, len)) {
- case ERROR_NOARG:
- ast_log(LOG_ERROR, "SORT() requires an argument\n");
- break;
- case ERROR_NOMEM:
- ast_log(LOG_ERROR, "Out of memory\n");
- break;
- case 0:
- ret = 0;
- break;
- default:
- ast_log(LOG_ERROR, "Unknown internal error\n");
- }
-
- ast_module_user_remove(u);
-
- return ret;
-}
-
-static int acf_cut_exec(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
- int ret = -1;
- struct ast_module_user *u = NULL;
-
- if (chan) {
- u = ast_module_user_add(chan);
- }
-
- switch (cut_internal(chan, data, buf, len)) {
- case ERROR_NOARG:
- ast_log(LOG_ERROR, "Syntax: CUT(<varname>,<char-delim>,<range-spec>) - missing argument!\n");
- break;
- case ERROR_NOMEM:
- ast_log(LOG_ERROR, "Out of memory\n");
- break;
- case ERROR_USAGE:
- ast_log(LOG_ERROR, "Usage: CUT(<varname>,<char-delim>,<range-spec>)\n");
- break;
- case 0:
- ret = 0;
- break;
- default:
- ast_log(LOG_ERROR, "Unknown internal error\n");
- }
-
- if (chan) {
- ast_module_user_remove(u);
- }
-
- return ret;
-}
-
-struct ast_custom_function acf_sort = {
- .name = "SORT",
- .synopsis = "Sorts a list of key/vals into a list of keys, based upon the vals",
- .syntax = "SORT(key1:val1[...][,keyN:valN])",
- .desc =
-"Takes a comma-separated list of keys and values, each separated by a colon, and returns a\n"
-"comma-separated list of the keys, sorted by their values. Values will be evaluated as\n"
-"floating-point numbers.\n",
- .read = acf_sort_exec,
-};
-
-struct ast_custom_function acf_cut = {
- .name = "CUT",
- .synopsis = "Slices and dices strings, based upon a named delimiter.",
- .syntax = "CUT(<varname>,<char-delim>,<range-spec>)",
- .desc =
-" varname - variable you want cut\n"
-" char-delim - defaults to '-'\n"
-" range-spec - number of the field you want (1-based offset)\n"
-" may also be specified as a range (with -)\n"
-" or group of ranges and fields (with &)\n",
- .read = acf_cut_exec,
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&acf_cut);
- res |= ast_custom_function_unregister(&acf_sort);
-
- ast_module_user_hangup_all();
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&acf_cut);
- res |= ast_custom_function_register(&acf_sort);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Cut out information from a string");
diff --git a/1.4.23-rc4/funcs/func_db.c b/1.4.23-rc4/funcs/func_db.c
deleted file mode 100644
index 13932d27d..000000000
--- a/1.4.23-rc4/funcs/func_db.c
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2005-2006, Russell Bryant <russelb@clemson.edu>
- *
- * func_db.c adapted from the old app_db.c, copyright by the following people
- * Copyright (C) 2005, Mark Spencer <markster@digium.com>
- * Copyright (C) 2003, Jefferson Noxon <jeff@debian.org>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Functions for interaction with the Asterisk database
- *
- * \author Russell Bryant <russelb@clemson.edu>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <regex.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/options.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/astdb.h"
-
-static int function_db_read(struct ast_channel *chan, char *cmd,
- char *parse, char *buf, size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(family);
- AST_APP_ARG(key);
- );
-
- buf[0] = '\0';
-
- if (ast_strlen_zero(parse)) {
- ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)\n");
- return -1;
- }
-
- AST_NONSTANDARD_APP_ARGS(args, parse, '/');
-
- if (args.argc < 2) {
- ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)\n");
- return -1;
- }
-
- if (ast_db_get(args.family, args.key, buf, len - 1)) {
- ast_log(LOG_DEBUG, "DB: %s/%s not found in database.\n", args.family,
- args.key);
- } else
- pbx_builtin_setvar_helper(chan, "DB_RESULT", buf);
-
- return 0;
-}
-
-static int function_db_write(struct ast_channel *chan, char *cmd, char *parse,
- const char *value)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(family);
- AST_APP_ARG(key);
- );
-
- if (ast_strlen_zero(parse)) {
- ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)=<value>\n");
- return -1;
- }
-
- AST_NONSTANDARD_APP_ARGS(args, parse, '/');
-
- if (args.argc < 2) {
- ast_log(LOG_WARNING, "DB requires an argument, DB(<family>/<key>)=value\n");
- return -1;
- }
-
- if (ast_db_put(args.family, args.key, (char *) value))
- ast_log(LOG_WARNING, "DB: Error writing value to database.\n");
-
- return 0;
-}
-
-static struct ast_custom_function db_function = {
- .name = "DB",
- .synopsis = "Read from or write to the Asterisk database",
- .syntax = "DB(<family>/<key>)",
- .desc =
-"This function will read from or write a value to the Asterisk database. On a\n"
-"read, this function returns the corresponding value from the database, or blank\n"
-"if it does not exist. Reading a database value will also set the variable\n"
-"DB_RESULT. If you wish to find out if an entry exists, use the DB_EXISTS\n"
-"function.\n",
- .read = function_db_read,
- .write = function_db_write,
-};
-
-static int function_db_exists(struct ast_channel *chan, char *cmd,
- char *parse, char *buf, size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(family);
- AST_APP_ARG(key);
- );
-
- buf[0] = '\0';
-
- if (ast_strlen_zero(parse)) {
- ast_log(LOG_WARNING, "DB_EXISTS requires an argument, DB(<family>/<key>)\n");
- return -1;
- }
-
- AST_NONSTANDARD_APP_ARGS(args, parse, '/');
-
- if (args.argc < 2) {
- ast_log(LOG_WARNING, "DB_EXISTS requires an argument, DB(<family>/<key>)\n");
- return -1;
- }
-
- if (ast_db_get(args.family, args.key, buf, len - 1))
- strcpy(buf, "0");
- else {
- pbx_builtin_setvar_helper(chan, "DB_RESULT", buf);
- strcpy(buf, "1");
- }
-
- return 0;
-}
-
-static struct ast_custom_function db_exists_function = {
- .name = "DB_EXISTS",
- .synopsis = "Check to see if a key exists in the Asterisk database",
- .syntax = "DB_EXISTS(<family>/<key>)",
- .desc =
- "This function will check to see if a key exists in the Asterisk\n"
- "database. If it exists, the function will return \"1\". If not,\n"
- "it will return \"0\". Checking for existence of a database key will\n"
- "also set the variable DB_RESULT to the key's value if it exists.\n",
- .read = function_db_exists,
-};
-
-static int function_db_delete(struct ast_channel *chan, char* cmd,
- char *parse, char *buf, size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(family);
- AST_APP_ARG(key);
- );
-
- buf[0] = '\0';
-
- if (ast_strlen_zero(parse)) {
- ast_log(LOG_WARNING, "DB_DELETE requires an argument, DB_DELETE(<family>/<key>)\n");
- return -1;
- }
-
- AST_NONSTANDARD_APP_ARGS(args, parse, '/');
-
- if (args.argc < 2) {
- ast_log(LOG_WARNING, "DB_DELETE requires an argument, DB_DELETE(<family>/<key>)\n");
- return -1;
- }
-
- if (ast_db_get(args.family, args.key, buf, len - 1)) {
- ast_log(LOG_DEBUG, "DB_DELETE: %s/%s not found in database.\n", args.family, args.key);
- } else {
- if (ast_db_del(args.family, args.key)) {
- ast_log(LOG_DEBUG, "DB_DELETE: %s/%s could not be deleted from the database\n",
- args.family, args.key);
- }
- }
- pbx_builtin_setvar_helper(chan, "DB_RESULT", buf);
-
- return 0;
-}
-
-
-static struct ast_custom_function db_delete_function = {
- .name = "DB_DELETE",
- .synopsis = "Return a value from the database and delete it",
- .syntax = "DB_DELETE(<family>/<key>)",
- .desc =
- "This function will retrieve a value from the Asterisk database\n"
- " and then remove that key from the database. DB_RESULT\n"
- "will be set to the key's value if it exists.\n",
- .read = function_db_delete,
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&db_function);
- res |= ast_custom_function_unregister(&db_exists_function);
- res |= ast_custom_function_unregister(&db_delete_function);
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&db_function);
- res |= ast_custom_function_register(&db_exists_function);
- res |= ast_custom_function_register(&db_delete_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Database (astdb) related dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_enum.c b/1.4.23-rc4/funcs/func_enum.c
deleted file mode 100644
index 01d96449f..000000000
--- a/1.4.23-rc4/funcs/func_enum.c
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006
- *
- * Mark Spencer <markster@digium.com>
- * Oleksiy Krivoshey <oleksiyk@gmail.com>
- * Russell Bryant <russelb@clemson.edu>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief ENUM Functions
- *
- * \author Mark Spencer <markster@digium.com>
- * \author Oleksiy Krivoshey <oleksiyk@gmail.com>
- * \author Russell Bryant <russelb@clemson.edu>
- *
- * \arg See also AstENUM
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/utils.h"
-#include "asterisk/lock.h"
-#include "asterisk/file.h"
-#include "asterisk/logger.h"
-#include "asterisk/pbx.h"
-#include "asterisk/options.h"
-#include "asterisk/enum.h"
-#include "asterisk/app.h"
-
- static char *synopsis = "Syntax: ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])\n";
-
-static int function_enum(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(number);
- AST_APP_ARG(tech);
- AST_APP_ARG(options);
- AST_APP_ARG(record);
- AST_APP_ARG(zone);
- );
- int res = 0;
- char tech[80];
- char dest[256] = "", tmp[2] = "", num[AST_MAX_EXTENSION] = "";
- struct ast_module_user *u;
- char *s, *p;
- unsigned int record = 1;
-
- buf[0] = '\0';
-
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "%s", synopsis);
- return -1;
- }
-
- AST_STANDARD_APP_ARGS(args, data);
-
- if (args.argc < 1) {
- ast_log(LOG_WARNING, "%s", synopsis);
- return -1;
- }
-
- u = ast_module_user_add(chan);
-
- ast_copy_string(tech, args.tech ? args.tech : "sip", sizeof(tech));
-
- if (!args.zone)
- args.zone = "e164.arpa";
-
- if (!args.options)
- args.options = "";
-
- if (args.record)
- record = atoi(args.record);
-
- /* strip any '-' signs from number */
- for (s = p = args.number; *s; s++) {
- if (*s != '-') {
- snprintf(tmp, sizeof(tmp), "%c", *s);
- strncat(num, tmp, sizeof(num) - strlen(num) - 1);
- }
-
- }
-
- res = ast_get_enum(chan, num, dest, sizeof(dest), tech, sizeof(tech), args.zone,
- args.options, record);
-
- p = strchr(dest, ':');
- if (p && strcasecmp(tech, "ALL"))
- ast_copy_string(buf, p + 1, len);
- else
- ast_copy_string(buf, dest, len);
-
- ast_module_user_remove(u);
-
- return 0;
-}
-
-static struct ast_custom_function enum_function = {
- .name = "ENUMLOOKUP",
- .synopsis =
- "ENUMLOOKUP allows for general or specific querying of NAPTR records"
- " or counts of NAPTR types for ENUM or ENUM-like DNS pointers",
- .syntax =
- "ENUMLOOKUP(number[|Method-type[|options[|record#[|zone-suffix]]]])",
- .desc =
- "Option 'c' returns an integer count of the number of NAPTRs of a certain RR type.\n"
- "Combination of 'c' and Method-type of 'ALL' will return a count of all NAPTRs for the record.\n"
- "Defaults are: Method-type=sip, no options, record=1, zone-suffix=e164.arpa\n\n"
- "For more information, see doc/enum.txt",
- .read = function_enum,
-};
-
-static int function_txtcidname(struct ast_channel *chan, char *cmd,
- char *data, char *buf, size_t len)
-{
- int res;
- char tech[80];
- char txt[256] = "";
- char dest[80];
- struct ast_module_user *u;
-
- buf[0] = '\0';
-
-
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "TXTCIDNAME requires an argument (number)\n");
- return -1;
- }
-
- u = ast_module_user_add(chan);
-
- res = ast_get_txt(chan, data, dest, sizeof(dest), tech, sizeof(tech), txt,
- sizeof(txt));
-
- if (!ast_strlen_zero(txt))
- ast_copy_string(buf, txt, len);
-
- ast_module_user_remove(u);
-
- return 0;
-}
-
-static struct ast_custom_function txtcidname_function = {
- .name = "TXTCIDNAME",
- .synopsis = "TXTCIDNAME looks up a caller name via DNS",
- .syntax = "TXTCIDNAME(<number>)",
- .desc =
- "This function looks up the given phone number in DNS to retrieve\n"
- "the caller id name. The result will either be blank or be the value\n"
- "found in the TXT record in DNS.\n",
- .read = function_txtcidname,
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&enum_function);
- res |= ast_custom_function_unregister(&txtcidname_function);
-
- ast_module_user_hangup_all();
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&enum_function);
- res |= ast_custom_function_register(&txtcidname_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "ENUM related dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_env.c b/1.4.23-rc4/funcs/func_env.c
deleted file mode 100644
index 01ec4958d..000000000
--- a/1.4.23-rc4/funcs/func_env.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Environment related dialplan functions
- *
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int env_read(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- char *ret = NULL;
-
- *buf = '\0';
-
- if (data)
- ret = getenv(data);
-
- if (ret)
- ast_copy_string(buf, ret, len);
-
- return 0;
-}
-
-static int env_write(struct ast_channel *chan, char *cmd, char *data,
- const char *value)
-{
- if (!ast_strlen_zero(data)) {
- if (!ast_strlen_zero(value)) {
- setenv(data, value, 1);
- } else {
- unsetenv(data);
- }
- }
-
- return 0;
-}
-
-static int stat_read(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- char *action;
- struct stat s;
-
- ast_copy_string(buf, "0", len);
-
- action = strsep(&data, "|");
- if (stat(data, &s)) {
- return 0;
- } else {
- switch (*action) {
- case 'e':
- strcpy(buf, "1");
- break;
- case 's':
- snprintf(buf, len, "%d", (unsigned int) s.st_size);
- break;
- case 'f':
- snprintf(buf, len, "%d", S_ISREG(s.st_mode) ? 1 : 0);
- break;
- case 'd':
- snprintf(buf, len, "%d", S_ISDIR(s.st_mode) ? 1 : 0);
- break;
- case 'M':
- snprintf(buf, len, "%d", (int) s.st_mtime);
- break;
- case 'A':
- snprintf(buf, len, "%d", (int) s.st_mtime);
- break;
- case 'C':
- snprintf(buf, len, "%d", (int) s.st_ctime);
- break;
- case 'm':
- snprintf(buf, len, "%o", (int) s.st_mode);
- break;
- }
- }
-
- return 0;
-}
-
-static struct ast_custom_function env_function = {
- .name = "ENV",
- .synopsis = "Gets or sets the environment variable specified",
- .syntax = "ENV(<envname>)",
- .read = env_read,
- .write = env_write,
-};
-
-static struct ast_custom_function stat_function = {
- .name = "STAT",
- .synopsis = "Does a check on the specified file",
- .syntax = "STAT(<flag>,<filename>)",
- .read = stat_read,
- .desc =
- "flag may be one of the following:\n"
- " d - Checks if the file is a directory\n"
- " e - Checks if the file exists\n"
- " f - Checks if the file is a regular file\n"
- " m - Returns the file mode (in octal)\n"
- " s - Returns the size (in bytes) of the file\n"
- " A - Returns the epoch at which the file was last accessed\n"
- " C - Returns the epoch at which the inode was last changed\n"
- " M - Returns the epoch at which the file was last modified\n",
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&env_function);
- res |= ast_custom_function_unregister(&stat_function);
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&env_function);
- res |= ast_custom_function_register(&stat_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Environment/filesystem dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_global.c b/1.4.23-rc4/funcs/func_global.c
deleted file mode 100644
index 50a84afde..000000000
--- a/1.4.23-rc4/funcs/func_global.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2006, Tilghman Lesher
- *
- * Tilghman Lesher <func_global__200605@the-tilghman.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Global variable dialplan functions
- *
- * \author Tilghman Lesher <func_global__200605@the-tilghman.com>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/utils.h"
-
-static int global_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
- const char *var = pbx_builtin_getvar_helper(NULL, data);
-
- *buf = '\0';
-
- if (var)
- ast_copy_string(buf, var, len);
-
- return 0;
-}
-
-static int global_write(struct ast_channel *chan, char *cmd, char *data, const char *value)
-{
- pbx_builtin_setvar_helper(NULL, data, value);
-
- return 0;
-}
-
-static struct ast_custom_function global_function = {
- .name = "GLOBAL",
- .synopsis = "Gets or sets the global variable specified",
- .syntax = "GLOBAL(<varname>)",
- .read = global_read,
- .write = global_write,
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&global_function);
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&global_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Global variable dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_groupcount.c b/1.4.23-rc4/funcs/func_groupcount.c
deleted file mode 100644
index 7f6f8937b..000000000
--- a/1.4.23-rc4/funcs/func_groupcount.c
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Channel group related dialplan functions
- *
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int group_count_function_read(struct ast_channel *chan, char *cmd,
- char *data, char *buf, size_t len)
-{
- int ret = -1;
- int count = -1;
- char group[80] = "", category[80] = "";
-
- ast_app_group_split_group(data, group, sizeof(group), category,
- sizeof(category));
-
- /* If no group has been provided let's find one */
- if (ast_strlen_zero(group)) {
- struct ast_group_info *gi = NULL;
-
- ast_app_group_list_lock();
- for (gi = ast_app_group_list_head(); gi; gi = AST_LIST_NEXT(gi, list)) {
- if (gi->chan != chan)
- continue;
- if (ast_strlen_zero(category) || (!ast_strlen_zero(gi->category) && !strcasecmp(gi->category, category)))
- break;
- }
- if (gi) {
- ast_copy_string(group, gi->group, sizeof(group));
- if (!ast_strlen_zero(gi->category))
- ast_copy_string(category, gi->category, sizeof(category));
- }
- ast_app_group_list_unlock();
- }
-
- if ((count = ast_app_group_get_count(group, category)) == -1) {
- ast_log(LOG_NOTICE, "No group could be found for channel '%s'\n", chan->name);
- } else {
- snprintf(buf, len, "%d", count);
- ret = 0;
- }
-
- return ret;
-}
-
-static struct ast_custom_function group_count_function = {
- .name = "GROUP_COUNT",
- .syntax = "GROUP_COUNT([groupname][@category])",
- .synopsis = "Counts the number of channels in the specified group",
- .desc =
- "Calculates the group count for the specified group, or uses the\n"
- "channel's current group if not specifed (and non-empty).\n",
- .read = group_count_function_read,
-};
-
-static int group_match_count_function_read(struct ast_channel *chan,
- char *cmd, char *data, char *buf,
- size_t len)
-{
- int count;
- char group[80] = "";
- char category[80] = "";
-
- ast_app_group_split_group(data, group, sizeof(group), category,
- sizeof(category));
-
- if (!ast_strlen_zero(group)) {
- count = ast_app_group_match_get_count(group, category);
- snprintf(buf, len, "%d", count);
- return 0;
- }
-
- return -1;
-}
-
-static struct ast_custom_function group_match_count_function = {
- .name = "GROUP_MATCH_COUNT",
- .syntax = "GROUP_MATCH_COUNT(groupmatch[@category])",
- .synopsis =
- "Counts the number of channels in the groups matching the specified pattern",
- .desc =
- "Calculates the group count for all groups that match the specified pattern.\n"
- "Uses standard regular expression matching (see regex(7)).\n",
- .read = group_match_count_function_read,
- .write = NULL,
-};
-
-static int group_function_read(struct ast_channel *chan, char *cmd,
- char *data, char *buf, size_t len)
-{
- int ret = -1;
- struct ast_group_info *gi = NULL;
-
- ast_app_group_list_lock();
-
- for (gi = ast_app_group_list_head(); gi; gi = AST_LIST_NEXT(gi, list)) {
- if (gi->chan != chan)
- continue;
- if (ast_strlen_zero(data))
- break;
- if (!ast_strlen_zero(gi->category) && !strcasecmp(gi->category, data))
- break;
- }
-
- if (gi) {
- ast_copy_string(buf, gi->group, len);
- ret = 0;
- }
-
- ast_app_group_list_unlock();
-
- return ret;
-}
-
-static int group_function_write(struct ast_channel *chan, char *cmd,
- char *data, const char *value)
-{
- char grpcat[256];
-
- if (!ast_strlen_zero(data)) {
- snprintf(grpcat, sizeof(grpcat), "%s@%s", value, data);
- } else {
- ast_copy_string(grpcat, value, sizeof(grpcat));
- }
-
- if (ast_app_group_set_channel(chan, grpcat))
- ast_log(LOG_WARNING,
- "Setting a group requires an argument (group name)\n");
-
- return 0;
-}
-
-static struct ast_custom_function group_function = {
- .name = "GROUP",
- .syntax = "GROUP([category])",
- .synopsis = "Gets or sets the channel group.",
- .desc = "Gets or sets the channel group.\n",
- .read = group_function_read,
- .write = group_function_write,
-};
-
-static int group_list_function_read(struct ast_channel *chan, char *cmd,
- char *data, char *buf, size_t len)
-{
- struct ast_group_info *gi = NULL;
- char tmp1[1024] = "";
- char tmp2[1024] = "";
-
- if (!chan)
- return -1;
-
- ast_app_group_list_lock();
-
- for (gi = ast_app_group_list_head(); gi; gi = AST_LIST_NEXT(gi, list)) {
- if (gi->chan != chan)
- continue;
- if (!ast_strlen_zero(tmp1)) {
- ast_copy_string(tmp2, tmp1, sizeof(tmp2));
- if (!ast_strlen_zero(gi->category))
- snprintf(tmp1, sizeof(tmp1), "%s %s@%s", tmp2, gi->group, gi->category);
- else
- snprintf(tmp1, sizeof(tmp1), "%s %s", tmp2, gi->group);
- } else {
- if (!ast_strlen_zero(gi->category))
- snprintf(tmp1, sizeof(tmp1), "%s@%s", gi->group, gi->category);
- else
- snprintf(tmp1, sizeof(tmp1), "%s", gi->group);
- }
- }
-
- ast_app_group_list_unlock();
-
- ast_copy_string(buf, tmp1, len);
-
- return 0;
-}
-
-static struct ast_custom_function group_list_function = {
- .name = "GROUP_LIST",
- .syntax = "GROUP_LIST()",
- .synopsis = "Gets a list of the groups set on a channel.",
- .desc = "Gets a list of the groups set on a channel.\n",
- .read = group_list_function_read,
- .write = NULL,
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&group_count_function);
- res |= ast_custom_function_unregister(&group_match_count_function);
- res |= ast_custom_function_unregister(&group_list_function);
- res |= ast_custom_function_unregister(&group_function);
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&group_count_function);
- res |= ast_custom_function_register(&group_match_count_function);
- res |= ast_custom_function_register(&group_list_function);
- res |= ast_custom_function_register(&group_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Channel group dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_language.c b/1.4.23-rc4/funcs/func_language.c
deleted file mode 100644
index 43b368f4f..000000000
--- a/1.4.23-rc4/funcs/func_language.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Language related dialplan functions
- *
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/stringfields.h"
-
-static int depwarning = 0;
-
-static int language_read(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- if (!depwarning) {
- depwarning = 1;
- ast_log(LOG_WARNING,
- "LANGUAGE() is deprecated; use CHANNEL(language) instead.\n");
- }
-
- ast_copy_string(buf, chan ? chan->language : "", len);
-
- return 0;
-}
-
-static int language_write(struct ast_channel *chan, char *cmd, char *data,
- const char *value)
-{
- if (!depwarning) {
- depwarning = 1;
- ast_log(LOG_WARNING,
- "LANGUAGE() is deprecated; use CHANNEL(language) instead.\n");
- }
-
- if (chan && value)
- ast_string_field_set(chan, language, value);
-
- return 0;
-}
-
-static struct ast_custom_function language_function = {
- .name = "LANGUAGE",
- .synopsis = "Gets or sets the channel's language.",
- .syntax = "LANGUAGE()",
- .desc = "Deprecated. Use CHANNEL(language) instead.\n",
- .read = language_read,
- .write = language_write,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&language_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&language_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Channel language dialplan function");
diff --git a/1.4.23-rc4/funcs/func_logic.c b/1.4.23-rc4/funcs/func_logic.c
deleted file mode 100644
index ef972c969..000000000
--- a/1.4.23-rc4/funcs/func_logic.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- * Portions Copyright (C) 2005, Anthony Minessale II
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Conditional logic dialplan functions
- *
- * \author Anthony Minessale II
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int isnull(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- strcpy(buf, data && *data ? "0" : "1");
-
- return 0;
-}
-
-static int exists(struct ast_channel *chan, char *cmd, char *data, char *buf,
- size_t len)
-{
- strcpy(buf, data && *data ? "1" : "0");
-
- return 0;
-}
-
-static int iftime(struct ast_channel *chan, char *cmd, char *data, char *buf,
- size_t len)
-{
- struct ast_timing timing;
- char *expr;
- char *iftrue;
- char *iffalse;
-
- data = ast_strip_quoted(data, "\"", "\"");
- expr = strsep(&data, "?");
- iftrue = strsep(&data, ":");
- iffalse = data;
-
- if (ast_strlen_zero(expr) || !(iftrue || iffalse)) {
- ast_log(LOG_WARNING,
- "Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
- return -1;
- }
-
- if (!ast_build_timing(&timing, expr)) {
- ast_log(LOG_WARNING, "Invalid Time Spec.\n");
- return -1;
- }
-
- if (iftrue)
- iftrue = ast_strip_quoted(iftrue, "\"", "\"");
- if (iffalse)
- iffalse = ast_strip_quoted(iffalse, "\"", "\"");
-
- ast_copy_string(buf, ast_check_timing(&timing) ? S_OR(iftrue, "") : S_OR(iffalse, ""), len);
-
- return 0;
-}
-
-static int acf_if(struct ast_channel *chan, char *cmd, char *data, char *buf,
- size_t len)
-{
- AST_DECLARE_APP_ARGS(args1,
- AST_APP_ARG(expr);
- AST_APP_ARG(remainder);
- );
- AST_DECLARE_APP_ARGS(args2,
- AST_APP_ARG(iftrue);
- AST_APP_ARG(iffalse);
- );
- args2.iftrue = args2.iffalse = NULL; /* you have to set these, because if there is nothing after the '?',
- then args1.remainder will be NULL, not a pointer to a null string, and
- then any garbage in args2.iffalse will not be cleared, and you'll crash.
- -- and if you mod the ast_app_separate_args func instead, you'll really
- mess things up badly, because the rest of everything depends on null args
- for non-specified stuff. */
-
- AST_NONSTANDARD_APP_ARGS(args1, data, '?');
- AST_NONSTANDARD_APP_ARGS(args2, args1.remainder, ':');
-
- if (ast_strlen_zero(args1.expr) || !(args2.iftrue || args2.iffalse)) {
- ast_log(LOG_WARNING, "Syntax IF(<expr>?[<true>][:<false>]) (expr must be non-null, and either <true> or <false> must be non-null)\n");
- ast_log(LOG_WARNING, " In this case, <expr>='%s', <true>='%s', and <false>='%s'\n", args1.expr, args2.iftrue, args2.iffalse);
- return -1;
- }
-
- args1.expr = ast_strip(args1.expr);
- if (args2.iftrue)
- args2.iftrue = ast_strip(args2.iftrue);
- if (args2.iffalse)
- args2.iffalse = ast_strip(args2.iffalse);
-
- ast_copy_string(buf, pbx_checkcondition(args1.expr) ? (S_OR(args2.iftrue, "")) : (S_OR(args2.iffalse, "")), len);
-
- return 0;
-}
-
-static int set(struct ast_channel *chan, char *cmd, char *data, char *buf,
- size_t len)
-{
- char *varname;
- char *val;
-
- varname = strsep(&data, "=");
- val = data;
-
- if (ast_strlen_zero(varname) || !val) {
- ast_log(LOG_WARNING, "Syntax SET(<varname>=[<value>])\n");
- return -1;
- }
-
- varname = ast_strip(varname);
- val = ast_strip(val);
- pbx_builtin_setvar_helper(chan, varname, val);
- ast_copy_string(buf, val, len);
-
- return 0;
-}
-
-static struct ast_custom_function isnull_function = {
- .name = "ISNULL",
- .synopsis = "NULL Test: Returns 1 if NULL or 0 otherwise",
- .syntax = "ISNULL(<data>)",
- .read = isnull,
-};
-
-static struct ast_custom_function set_function = {
- .name = "SET",
- .synopsis = "SET assigns a value to a channel variable",
- .syntax = "SET(<varname>=[<value>])",
- .read = set,
-};
-
-static struct ast_custom_function exists_function = {
- .name = "EXISTS",
- .synopsis = "Existence Test: Returns 1 if exists, 0 otherwise",
- .syntax = "EXISTS(<data>)",
- .read = exists,
-};
-
-static struct ast_custom_function if_function = {
- .name = "IF",
- .synopsis =
- "Conditional: Returns the data following '?' if true else the data following ':'",
- .syntax = "IF(<expr>?[<true>][:<false>])",
- .read = acf_if,
-};
-
-static struct ast_custom_function if_time_function = {
- .name = "IFTIME",
- .synopsis =
- "Temporal Conditional: Returns the data following '?' if true else the data following ':'",
- .syntax = "IFTIME(<timespec>?[<true>][:<false>])",
- .read = iftime,
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&isnull_function);
- res |= ast_custom_function_unregister(&set_function);
- res |= ast_custom_function_unregister(&exists_function);
- res |= ast_custom_function_unregister(&if_function);
- res |= ast_custom_function_unregister(&if_time_function);
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&isnull_function);
- res |= ast_custom_function_register(&set_function);
- res |= ast_custom_function_register(&exists_function);
- res |= ast_custom_function_register(&if_function);
- res |= ast_custom_function_register(&if_time_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Logical dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_math.c b/1.4.23-rc4/funcs/func_math.c
deleted file mode 100644
index edded7575..000000000
--- a/1.4.23-rc4/funcs/func_math.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2004 - 2006, Andy Powell
- *
- * Updated by Mark Spencer <markster@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Math related dialplan function
- *
- * \author Andy Powell
- * \author Mark Spencer <markster@digium.com>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/config.h"
-
-enum TypeOfFunctions {
- ADDFUNCTION,
- DIVIDEFUNCTION,
- MULTIPLYFUNCTION,
- SUBTRACTFUNCTION,
- MODULUSFUNCTION,
- GTFUNCTION,
- LTFUNCTION,
- GTEFUNCTION,
- LTEFUNCTION,
- EQFUNCTION
-};
-
-enum TypeOfResult {
- FLOAT_RESULT,
- INT_RESULT,
- HEX_RESULT,
- CHAR_RESULT
-};
-
-static int math(struct ast_channel *chan, char *cmd, char *parse,
- char *buf, size_t len)
-{
- double fnum1;
- double fnum2;
- double ftmp = 0;
- char *op;
- int iaction = -1;
- int type_of_result = FLOAT_RESULT;
- char *mvalue1, *mvalue2 = NULL, *mtype_of_result;
- int negvalue1 = 0;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(argv0);
- AST_APP_ARG(argv1);
- );
-
- if (ast_strlen_zero(parse)) {
- ast_log(LOG_WARNING, "Syntax: MATH(<number1><op><number 2>[,<type_of_result>]) - missing argument!\n");
- return -1;
- }
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- if (args.argc < 1) {
- ast_log(LOG_WARNING, "Syntax: MATH(<number1><op><number 2>[,<type_of_result>]) - missing argument!\n");
- return -1;
- }
-
- mvalue1 = args.argv0;
-
- if (mvalue1[0] == '-') {
- negvalue1 = 1;
- mvalue1++;
- }
-
- if ((op = strchr(mvalue1, '*'))) {
- iaction = MULTIPLYFUNCTION;
- *op = '\0';
- } else if ((op = strchr(mvalue1, '/'))) {
- iaction = DIVIDEFUNCTION;
- *op = '\0';
- } else if ((op = strchr(mvalue1, '%'))) {
- iaction = MODULUSFUNCTION;
- *op = '\0';
- } else if ((op = strchr(mvalue1, '>'))) {
- iaction = GTFUNCTION;
- *op = '\0';
- if (*(op + 1) == '=') {
- *++op = '\0';
- iaction = GTEFUNCTION;
- }
- } else if ((op = strchr(mvalue1, '<'))) {
- iaction = LTFUNCTION;
- *op = '\0';
- if (*(op + 1) == '=') {
- *++op = '\0';
- iaction = LTEFUNCTION;
- }
- } else if ((op = strchr(mvalue1, '='))) {
- *op = '\0';
- if (*(op + 1) == '=') {
- *++op = '\0';
- iaction = EQFUNCTION;
- } else
- op = NULL;
- } else if ((op = strchr(mvalue1, '+'))) {
- iaction = ADDFUNCTION;
- *op = '\0';
- } else if ((op = strchr(mvalue1, '-'))) { /* subtraction MUST always be last, in case we have a negative first number */
- iaction = SUBTRACTFUNCTION;
- *op = '\0';
- }
-
- if (op)
- mvalue2 = op + 1;
-
- /* detect wanted type of result */
- mtype_of_result = args.argv1;
- if (mtype_of_result) {
- if (!strcasecmp(mtype_of_result, "float")
- || !strcasecmp(mtype_of_result, "f"))
- type_of_result = FLOAT_RESULT;
- else if (!strcasecmp(mtype_of_result, "int")
- || !strcasecmp(mtype_of_result, "i"))
- type_of_result = INT_RESULT;
- else if (!strcasecmp(mtype_of_result, "hex")
- || !strcasecmp(mtype_of_result, "h"))
- type_of_result = HEX_RESULT;
- else if (!strcasecmp(mtype_of_result, "char")
- || !strcasecmp(mtype_of_result, "c"))
- type_of_result = CHAR_RESULT;
- else {
- ast_log(LOG_WARNING, "Unknown type of result requested '%s'.\n",
- mtype_of_result);
- return -1;
- }
- }
-
- if (!mvalue1 || !mvalue2) {
- ast_log(LOG_WARNING,
- "Supply all the parameters - just this once, please\n");
- return -1;
- }
-
- if (sscanf(mvalue1, "%lf", &fnum1) != 1) {
- ast_log(LOG_WARNING, "'%s' is not a valid number\n", mvalue1);
- return -1;
- }
-
- if (sscanf(mvalue2, "%lf", &fnum2) != 1) {
- ast_log(LOG_WARNING, "'%s' is not a valid number\n", mvalue2);
- return -1;
- }
-
- if (negvalue1)
- fnum1 = 0 - fnum1;
-
- switch (iaction) {
- case ADDFUNCTION:
- ftmp = fnum1 + fnum2;
- break;
- case DIVIDEFUNCTION:
- if (fnum2 <= 0)
- ftmp = 0; /* can't do a divide by 0 */
- else
- ftmp = (fnum1 / fnum2);
- break;
- case MULTIPLYFUNCTION:
- ftmp = (fnum1 * fnum2);
- break;
- case SUBTRACTFUNCTION:
- ftmp = (fnum1 - fnum2);
- break;
- case MODULUSFUNCTION:
- {
- int inum1 = fnum1;
- int inum2 = fnum2;
-
- ftmp = (inum1 % inum2);
-
- break;
- }
- case GTFUNCTION:
- ast_copy_string(buf, (fnum1 > fnum2) ? "TRUE" : "FALSE", len);
- break;
- case LTFUNCTION:
- ast_copy_string(buf, (fnum1 < fnum2) ? "TRUE" : "FALSE", len);
- break;
- case GTEFUNCTION:
- ast_copy_string(buf, (fnum1 >= fnum2) ? "TRUE" : "FALSE", len);
- break;
- case LTEFUNCTION:
- ast_copy_string(buf, (fnum1 <= fnum2) ? "TRUE" : "FALSE", len);
- break;
- case EQFUNCTION:
- ast_copy_string(buf, (fnum1 == fnum2) ? "TRUE" : "FALSE", len);
- break;
- default:
- ast_log(LOG_WARNING,
- "Something happened that neither of us should be proud of %d\n",
- iaction);
- return -1;
- }
-
- if (iaction < GTFUNCTION || iaction > EQFUNCTION) {
- if (type_of_result == FLOAT_RESULT)
- snprintf(buf, len, "%f", ftmp);
- else if (type_of_result == INT_RESULT)
- snprintf(buf, len, "%i", (int) ftmp);
- else if (type_of_result == HEX_RESULT)
- snprintf(buf, len, "%x", (unsigned int) ftmp);
- else if (type_of_result == CHAR_RESULT)
- snprintf(buf, len, "%c", (unsigned char) ftmp);
- }
-
- return 0;
-}
-
-static struct ast_custom_function math_function = {
- .name = "MATH",
- .synopsis = "Performs Mathematical Functions",
- .syntax = "MATH(<number1><op><number 2>[,<type_of_result>])",
- .desc = "Perform calculation on number 1 to number 2. Valid ops are: \n"
- " +,-,/,*,%,<,>,>=,<=,==\n"
- "and behave as their C equivalents.\n"
- "<type_of_result> - wanted type of result:\n"
- " f, float - float(default)\n"
- " i, int - integer,\n"
- " h, hex - hex,\n"
- " c, char - char\n"
- "Example: Set(i=${MATH(123%16,int)}) - sets var i=11",
- .read = math
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&math_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&math_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Mathematical dialplan function");
diff --git a/1.4.23-rc4/funcs/func_md5.c b/1.4.23-rc4/funcs/func_md5.c
deleted file mode 100644
index db6be8f7b..000000000
--- a/1.4.23-rc4/funcs/func_md5.c
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2005-2006, Digium, Inc.
- * Copyright (C) 2005, Olle E. Johansson, Edvina.net
- * Copyright (C) 2005, Russell Bryant <russelb@clemson.edu>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief MD5 digest related dialplan functions
- *
- * \author Olle E. Johansson <oej@edvina.net>
- * \author Russell Bryant <russelb@clemson.edu>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int md5(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: MD5(<data>) - missing argument!\n");
- return -1;
- }
-
- ast_md5_hash(buf, data);
- buf[32] = '\0';
-
- return 0;
-}
-
-static int checkmd5(struct ast_channel *chan, char *cmd, char *parse,
- char *buf, size_t len)
-{
- char newmd5[33];
- static int deprecated = 0;
- AST_DECLARE_APP_ARGS(args, AST_APP_ARG(digest); AST_APP_ARG(data););
-
- if (ast_strlen_zero(parse)) {
- ast_log(LOG_WARNING,
- "Syntax: CHECK_MD5(<digest>,<data>) - missing argument!\n");
- return -1;
- }
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- if (args.argc < 2) {
- ast_log(LOG_WARNING,
- "Syntax: CHECK_MD5(<digest>,<data>) - missing argument!\n");
- return -1;
- }
-
- if (!deprecated) {
- deprecated = 1;
- ast_log(LOG_WARNING, "CHECK_MD5() is deprecated in Asterisk 1.4 and later.\n");
- }
-
- ast_md5_hash(newmd5, args.data);
-
- if (!strcasecmp(newmd5, args.digest)) /* they match */
- ast_copy_string(buf, "1", len);
- else
- ast_copy_string(buf, "0", len);
-
- return 0;
-}
-
-static struct ast_custom_function md5_function = {
- .name = "MD5",
- .synopsis = "Computes an MD5 digest",
- .syntax = "MD5(<data>)",
- .read = md5,
-};
-
-static struct ast_custom_function checkmd5_function = {
- .name = "CHECK_MD5",
- .synopsis = "Checks an MD5 digest",
- .desc = "Returns 1 on a match, 0 otherwise\n",
- .syntax = "CHECK_MD5(<digest>,<data>)",
- .read = checkmd5,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&md5_function) |
- ast_custom_function_unregister(&checkmd5_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&md5_function) |
- ast_custom_function_register(&checkmd5_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "MD5 digest dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_moh.c b/1.4.23-rc4/funcs/func_moh.c
deleted file mode 100644
index 86701b161..000000000
--- a/1.4.23-rc4/funcs/func_moh.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- *
- * Russell Bryant <russelb@clemson.edu>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Functions for reading or setting the MusicOnHold class
- *
- * \author Russell Bryant <russelb@clemson.edu>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/utils.h"
-#include "asterisk/stringfields.h"
-
-static int depwarning = 0;
-
-static int moh_read(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- if (!depwarning) {
- depwarning = 1;
- ast_log(LOG_WARNING, "MUSICCLASS() is deprecated; use CHANNEL(musicclass) instead.\n");
- }
-
- ast_copy_string(buf, chan ? chan->musicclass : "", len);
-
- return 0;
-}
-
-static int moh_write(struct ast_channel *chan, char *cmd, char *data,
- const char *value)
-{
- if (!depwarning) {
- depwarning = 1;
- ast_log(LOG_WARNING, "MUSICCLASS() is deprecated; use CHANNEL(musicclass) instead.\n");
- }
-
- if (chan)
- ast_string_field_set(chan, musicclass, value);
-
- return 0;
-}
-
-static struct ast_custom_function moh_function = {
- .name = "MUSICCLASS",
- .synopsis = "Read or Set the MusicOnHold class",
- .syntax = "MUSICCLASS()",
- .desc = "Deprecated. Use CHANNEL(musicclass) instead.\n",
- .read = moh_read,
- .write = moh_write,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&moh_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&moh_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Music-on-hold dialplan function");
diff --git a/1.4.23-rc4/funcs/func_odbc.c b/1.4.23-rc4/funcs/func_odbc.c
deleted file mode 100644
index 49007d792..000000000
--- a/1.4.23-rc4/funcs/func_odbc.c
+++ /dev/null
@@ -1,672 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (c) 2005, 2006 Tilghman Lesher
- *
- * Tilghman Lesher <func_odbc__200508@the-tilghman.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*!
- * \file
- *
- * \brief ODBC lookups
- *
- * \author Tilghman Lesher <func_odbc__200508@the-tilghman.com>
- */
-
-/*** MODULEINFO
- <depend>unixodbc</depend>
- <depend>ltdl</depend>
- <depend>res_odbc</depend>
- ***/
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <sys/types.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <errno.h>
-
-#include "asterisk/module.h"
-#include "asterisk/file.h"
-#include "asterisk/logger.h"
-#include "asterisk/options.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/module.h"
-#include "asterisk/config.h"
-#include "asterisk/res_odbc.h"
-#include "asterisk/app.h"
-
-static char *config = "func_odbc.conf";
-
-enum {
- OPT_ESCAPECOMMAS = (1 << 0),
-} odbc_option_flags;
-
-struct acf_odbc_query {
- AST_LIST_ENTRY(acf_odbc_query) list;
- char dsn[30];
- char sql_read[2048];
- char sql_write[2048];
- unsigned int flags;
- struct ast_custom_function *acf;
-};
-
-AST_LIST_HEAD_STATIC(queries, acf_odbc_query);
-
-static SQLHSTMT generic_prepare(struct odbc_obj *obj, void *data)
-{
- int res;
- char *sql = data;
- SQLHSTMT stmt;
-
- res = SQLAllocHandle (SQL_HANDLE_STMT, obj->con, &stmt);
- if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
- ast_log(LOG_WARNING, "SQL Alloc Handle failed!\n");
- return NULL;
- }
-
- res = SQLPrepare(stmt, (unsigned char *)sql, SQL_NTS);
- if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
- ast_log(LOG_WARNING, "SQL Prepare failed![%s]\n", sql);
- SQLCloseCursor(stmt);
- SQLFreeHandle (SQL_HANDLE_STMT, stmt);
- return NULL;
- }
-
- return stmt;
-}
-
-/*
- * Master control routine
- */
-static int acf_odbc_write(struct ast_channel *chan, char *cmd, char *s, const char *value)
-{
- struct odbc_obj *obj;
- struct acf_odbc_query *query;
- char *t, buf[2048]="", varname[15];
- int i, bogus_chan = 0;
- AST_DECLARE_APP_ARGS(values,
- AST_APP_ARG(field)[100];
- );
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(field)[100];
- );
- SQLHSTMT stmt;
- SQLLEN rows=0;
-
- AST_LIST_LOCK(&queries);
- AST_LIST_TRAVERSE(&queries, query, list) {
- if (!strcmp(query->acf->name, cmd)) {
- break;
- }
- }
-
- if (!query) {
- ast_log(LOG_ERROR, "No such function '%s'\n", cmd);
- AST_LIST_UNLOCK(&queries);
- return -1;
- }
-
- obj = ast_odbc_request_obj(query->dsn, 0);
-
- if (!obj) {
- ast_log(LOG_ERROR, "No database handle available with the name of '%s' (check res_odbc.conf)\n", query->dsn);
- AST_LIST_UNLOCK(&queries);
- return -1;
- }
-
- if (!chan) {
- if ((chan = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Bogus/func_odbc")))
- bogus_chan = 1;
- }
-
- if (chan)
- ast_autoservice_start(chan);
-
- /* Parse our arguments */
- t = value ? ast_strdupa(value) : "";
-
- if (!s || !t) {
- ast_log(LOG_ERROR, "Out of memory\n");
- AST_LIST_UNLOCK(&queries);
- if (chan)
- ast_autoservice_stop(chan);
- if (bogus_chan)
- ast_channel_free(chan);
- return -1;
- }
-
- AST_STANDARD_APP_ARGS(args, s);
- for (i = 0; i < args.argc; i++) {
- snprintf(varname, sizeof(varname), "ARG%d", i + 1);
- pbx_builtin_pushvar_helper(chan, varname, args.field[i]);
- }
-
- /* Parse values, just like arguments */
- /* Can't use the pipe, because app Set removes them */
- AST_NONSTANDARD_APP_ARGS(values, t, ',');
- for (i = 0; i < values.argc; i++) {
- snprintf(varname, sizeof(varname), "VAL%d", i + 1);
- pbx_builtin_pushvar_helper(chan, varname, values.field[i]);
- }
-
- /* Additionally set the value as a whole (but push an empty string if value is NULL) */
- pbx_builtin_pushvar_helper(chan, "VALUE", value ? value : "");
-
- pbx_substitute_variables_helper(chan, query->sql_write, buf, sizeof(buf) - 1);
-
- /* Restore prior values */
- for (i = 0; i < args.argc; i++) {
- snprintf(varname, sizeof(varname), "ARG%d", i + 1);
- pbx_builtin_setvar_helper(chan, varname, NULL);
- }
-
- for (i = 0; i < values.argc; i++) {
- snprintf(varname, sizeof(varname), "VAL%d", i + 1);
- pbx_builtin_setvar_helper(chan, varname, NULL);
- }
- pbx_builtin_setvar_helper(chan, "VALUE", NULL);
-
- AST_LIST_UNLOCK(&queries);
-
- stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, buf);
-
- if (stmt) {
- /* Rows affected */
- SQLRowCount(stmt, &rows);
- }
-
- /* Output the affected rows, for all cases. In the event of failure, we
- * flag this as -1 rows. Note that this is different from 0 affected rows
- * which would be the case if we succeeded in our query, but the values did
- * not change. */
- snprintf(varname, sizeof(varname), "%d", (int)rows);
- pbx_builtin_setvar_helper(chan, "ODBCROWS", varname);
-
- if (stmt) {
- SQLCloseCursor(stmt);
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
- }
- if (obj)
- ast_odbc_release_obj(obj);
-
- if (chan)
- ast_autoservice_stop(chan);
- if (bogus_chan)
- ast_channel_free(chan);
-
- return 0;
-}
-
-static int acf_odbc_read(struct ast_channel *chan, char *cmd, char *s, char *buf, size_t len)
-{
- struct odbc_obj *obj;
- struct acf_odbc_query *query;
- char sql[2048] = "", varname[15];
- int res, x, buflen = 1, escapecommas, bogus_chan = 0;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(field)[100];
- );
- SQLHSTMT stmt;
- SQLSMALLINT colcount=0;
- SQLLEN indicator;
-
- AST_LIST_LOCK(&queries);
- AST_LIST_TRAVERSE(&queries, query, list) {
- if (!strcmp(query->acf->name, cmd)) {
- break;
- }
- }
-
- if (!query) {
- ast_log(LOG_ERROR, "No such function '%s'\n", cmd);
- AST_LIST_UNLOCK(&queries);
- return -1;
- }
-
- obj = ast_odbc_request_obj(query->dsn, 0);
-
- if (!obj) {
- ast_log(LOG_ERROR, "No such DSN registered (or out of connections): %s (check res_odbc.conf)\n", query->dsn);
- AST_LIST_UNLOCK(&queries);
- return -1;
- }
-
- if (!chan) {
- if ((chan = ast_channel_alloc(0, 0, "", "", "", "", "", 0, "Bogus/func_odbc")))
- bogus_chan = 1;
- }
-
- if (chan)
- ast_autoservice_start(chan);
-
- AST_STANDARD_APP_ARGS(args, s);
- for (x = 0; x < args.argc; x++) {
- snprintf(varname, sizeof(varname), "ARG%d", x + 1);
- pbx_builtin_pushvar_helper(chan, varname, args.field[x]);
- }
-
- pbx_substitute_variables_helper(chan, query->sql_read, sql, sizeof(sql) - 1);
-
- /* Restore prior values */
- for (x = 0; x < args.argc; x++) {
- snprintf(varname, sizeof(varname), "ARG%d", x + 1);
- pbx_builtin_setvar_helper(chan, varname, NULL);
- }
-
- /* Save this flag, so we can release the lock */
- escapecommas = ast_test_flag(query, OPT_ESCAPECOMMAS);
-
- AST_LIST_UNLOCK(&queries);
-
- stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, sql);
-
- if (!stmt) {
- ast_odbc_release_obj(obj);
- if (chan)
- ast_autoservice_stop(chan);
- if (bogus_chan)
- ast_channel_free(chan);
- return -1;
- }
-
- res = SQLNumResultCols(stmt, &colcount);
- if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
- ast_log(LOG_WARNING, "SQL Column Count error!\n[%s]\n\n", sql);
- SQLCloseCursor(stmt);
- SQLFreeHandle (SQL_HANDLE_STMT, stmt);
- ast_odbc_release_obj(obj);
- if (chan)
- ast_autoservice_stop(chan);
- if (bogus_chan)
- ast_channel_free(chan);
- return -1;
- }
-
- *buf = '\0';
-
- res = SQLFetch(stmt);
- if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
- int res1 = -1;
- if (res == SQL_NO_DATA) {
- if (option_verbose > 3) {
- ast_verbose(VERBOSE_PREFIX_4 "Found no rows [%s]\n", sql);
- }
- res1 = 0;
- } else if (option_verbose > 3) {
- ast_log(LOG_WARNING, "Error %d in FETCH [%s]\n", res, sql);
- }
- SQLCloseCursor(stmt);
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
- ast_odbc_release_obj(obj);
- if (chan)
- ast_autoservice_stop(chan);
- if (bogus_chan)
- ast_channel_free(chan);
- return res1;
- }
-
- for (x = 0; x < colcount; x++) {
- int i;
- char coldata[256];
-
- buflen = strlen(buf);
- res = SQLGetData(stmt, x + 1, SQL_CHAR, coldata, sizeof(coldata), &indicator);
- if (indicator == SQL_NULL_DATA) {
- coldata[0] = '\0';
- res = SQL_SUCCESS;
- }
-
- if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
- ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql);
- SQLCloseCursor(stmt);
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
- ast_odbc_release_obj(obj);
- if (chan)
- ast_autoservice_stop(chan);
- if (bogus_chan)
- ast_channel_free(chan);
- return -1;
- }
-
- /* Copy data, encoding '\' and ',' for the argument parser */
- for (i = 0; i < sizeof(coldata); i++) {
- if (escapecommas && (coldata[i] == '\\' || coldata[i] == ',')) {
- buf[buflen++] = '\\';
- }
- buf[buflen++] = coldata[i];
-
- if (buflen >= len - 2)
- break;
-
- if (coldata[i] == '\0')
- break;
- }
-
- buf[buflen - 1] = ',';
- buf[buflen] = '\0';
- }
- /* Trim trailing comma */
- buf[buflen - 1] = '\0';
-
- SQLCloseCursor(stmt);
- SQLFreeHandle(SQL_HANDLE_STMT, stmt);
- ast_odbc_release_obj(obj);
- if (chan)
- ast_autoservice_stop(chan);
- if (bogus_chan)
- ast_channel_free(chan);
- return 0;
-}
-
-static int acf_escape(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
- char *out = buf;
-
- for (; *data && out - buf < len; data++) {
- if (*data == '\'') {
- *out = '\'';
- out++;
- }
- *out++ = *data;
- }
- *out = '\0';
-
- return 0;
-}
-
-static struct ast_custom_function escape_function = {
- .name = "SQL_ESC",
- .synopsis = "Escapes single ticks for use in SQL statements",
- .syntax = "SQL_ESC(<string>)",
- .desc =
-"Used in SQL templates to escape data which may contain single ticks (') which\n"
-"are otherwise used to delimit data. For example:\n"
-"SELECT foo FROM bar WHERE baz='${SQL_ESC(${ARG1})}'\n",
- .read = acf_escape,
- .write = NULL,
-};
-
-static int init_acf_query(struct ast_config *cfg, char *catg, struct acf_odbc_query **query)
-{
- const char *tmp;
- int res;
-
- if (!cfg || !catg) {
- return -1;
- }
-
- *query = ast_calloc(1, sizeof(struct acf_odbc_query));
- if (! (*query))
- return -1;
-
- if ((tmp = ast_variable_retrieve(cfg, catg, "dsn"))) {
- ast_copy_string((*query)->dsn, tmp, sizeof((*query)->dsn));
- } else if ((tmp = ast_variable_retrieve(cfg, catg, "writehandle")) || (tmp = ast_variable_retrieve(cfg, catg, "readhandle"))) {
- ast_log(LOG_WARNING, "Separate read and write handles are not supported in this version of func_odbc.so\n");
- ast_copy_string((*query)->dsn, tmp, sizeof((*query)->dsn));
- } else {
- free(*query);
- *query = NULL;
- ast_log(LOG_ERROR, "No database handle was specified for func_odbc class '%s'\n", catg);
- return -1;
- }
-
- if ((tmp = ast_variable_retrieve(cfg, catg, "read")) || (tmp = ast_variable_retrieve(cfg, catg, "readsql"))) {
- ast_copy_string((*query)->sql_read, tmp, sizeof((*query)->sql_read));
- }
-
- if ((tmp = ast_variable_retrieve(cfg, catg, "write")) || (tmp = ast_variable_retrieve(cfg, catg, "writesql"))) {
- ast_copy_string((*query)->sql_write, tmp, sizeof((*query)->sql_write));
- }
-
- /* Allow escaping of embedded commas in fields to be turned off */
- ast_set_flag((*query), OPT_ESCAPECOMMAS);
- if ((tmp = ast_variable_retrieve(cfg, catg, "escapecommas"))) {
- if (ast_false(tmp))
- ast_clear_flag((*query), OPT_ESCAPECOMMAS);
- }
-
- (*query)->acf = ast_calloc(1, sizeof(struct ast_custom_function));
- if (! (*query)->acf) {
- free(*query);
- *query = NULL;
- return -1;
- }
-
- if ((tmp = ast_variable_retrieve(cfg, catg, "prefix")) && !ast_strlen_zero(tmp)) {
- if (asprintf((char **)&((*query)->acf->name), "%s_%s", tmp, catg) < 0) {
- ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
- }
- } else {
- if (asprintf((char **)&((*query)->acf->name), "ODBC_%s", catg) < 0) {
- ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
- }
- }
-
- if (!((*query)->acf->name)) {
- free((*query)->acf);
- free(*query);
- *query = NULL;
- return -1;
- }
-
- if (asprintf((char **)&((*query)->acf->syntax), "%s(<arg1>[...[,<argN>]])", (*query)->acf->name) < 0) {
- ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
- (*query)->acf->syntax = NULL;
- }
-
- if (!((*query)->acf->syntax)) {
- free((char *)(*query)->acf->name);
- free((*query)->acf);
- free(*query);
- *query = NULL;
- return -1;
- }
-
- res = 0;
- (*query)->acf->synopsis = "Runs the referenced query with the specified arguments";
- if (!ast_strlen_zero((*query)->sql_read) && !ast_strlen_zero((*query)->sql_write)) {
- res = asprintf((char **)&((*query)->acf->desc),
- "Runs the following query, as defined in func_odbc.conf, performing\n"
- "substitution of the arguments into the query as specified by ${ARG1},\n"
- "${ARG2}, ... ${ARGn}. When setting the function, the values are provided\n"
- "either in whole as ${VALUE} or parsed as ${VAL1}, ${VAL2}, ... ${VALn}.\n"
- "\nRead:\n%s\n\nWrite:\n%s\n",
- (*query)->sql_read,
- (*query)->sql_write);
- } else if (!ast_strlen_zero((*query)->sql_read)) {
- res = asprintf((char **)&((*query)->acf->desc),
- "Runs the following query, as defined in func_odbc.conf, performing\n"
- "substitution of the arguments into the query as specified by ${ARG1},\n"
- "${ARG2}, ... ${ARGn}. This function may only be read, not set.\n\nSQL:\n%s\n",
- (*query)->sql_read);
- } else if (!ast_strlen_zero((*query)->sql_write)) {
- res = asprintf((char **)&((*query)->acf->desc),
- "Runs the following query, as defined in func_odbc.conf, performing\n"
- "substitution of the arguments into the query as specified by ${ARG1},\n"
- "${ARG2}, ... ${ARGn}. The values are provided either in whole as\n"
- "${VALUE} or parsed as ${VAL1}, ${VAL2}, ... ${VALn}.\n"
- "This function may only be set.\nSQL:\n%s\n",
- (*query)->sql_write);
- } else {
- ast_log(LOG_ERROR, "No SQL was found for func_odbc class '%s'\n", catg);
- }
-
- if (res < 0) {
- ast_log(LOG_WARNING, "asprintf() failed: %s\n", strerror(errno));
- (*query)->acf->desc = NULL;
- }
-
- /* Could be out of memory, or could be we have neither sql_read nor sql_write */
- if (!((*query)->acf->desc)) {
- free((char *)(*query)->acf->syntax);
- free((char *)(*query)->acf->name);
- free((*query)->acf);
- free(*query);
- *query = NULL;
- return -1;
- }
-
- if (ast_strlen_zero((*query)->sql_read)) {
- (*query)->acf->read = NULL;
- } else {
- (*query)->acf->read = acf_odbc_read;
- }
-
- if (ast_strlen_zero((*query)->sql_write)) {
- (*query)->acf->write = NULL;
- } else {
- (*query)->acf->write = acf_odbc_write;
- }
-
- return 0;
-}
-
-static int free_acf_query(struct acf_odbc_query *query)
-{
- if (query) {
- if (query->acf) {
- if (query->acf->name)
- free((char *)query->acf->name);
- if (query->acf->syntax)
- free((char *)query->acf->syntax);
- if (query->acf->desc)
- free((char *)query->acf->desc);
- free(query->acf);
- }
- free(query);
- }
- return 0;
-}
-
-static int odbc_load_module(void)
-{
- int res = 0;
- struct ast_config *cfg;
- char *catg;
-
- AST_LIST_LOCK(&queries);
-
- cfg = ast_config_load(config);
- if (!cfg) {
- ast_log(LOG_NOTICE, "Unable to load config for func_odbc: %s\n", config);
- AST_LIST_UNLOCK(&queries);
- return AST_MODULE_LOAD_DECLINE;
- }
-
- for (catg = ast_category_browse(cfg, NULL);
- catg;
- catg = ast_category_browse(cfg, catg)) {
- struct acf_odbc_query *query = NULL;
-
- if (init_acf_query(cfg, catg, &query)) {
- free_acf_query(query);
- } else {
- AST_LIST_INSERT_HEAD(&queries, query, list);
- ast_custom_function_register(query->acf);
- }
- }
-
- ast_config_destroy(cfg);
- ast_custom_function_register(&escape_function);
-
- AST_LIST_UNLOCK(&queries);
- return res;
-}
-
-static int odbc_unload_module(void)
-{
- struct acf_odbc_query *query;
-
- AST_LIST_LOCK(&queries);
- while (!AST_LIST_EMPTY(&queries)) {
- query = AST_LIST_REMOVE_HEAD(&queries, list);
- ast_custom_function_unregister(query->acf);
- free_acf_query(query);
- }
-
- ast_custom_function_unregister(&escape_function);
-
- /* Allow any threads waiting for this lock to pass (avoids a race) */
- AST_LIST_UNLOCK(&queries);
- AST_LIST_LOCK(&queries);
-
- AST_LIST_UNLOCK(&queries);
- return 0;
-}
-
-static int reload(void)
-{
- int res = 0;
- struct ast_config *cfg;
- struct acf_odbc_query *oldquery;
- char *catg;
-
- AST_LIST_LOCK(&queries);
-
- while (!AST_LIST_EMPTY(&queries)) {
- oldquery = AST_LIST_REMOVE_HEAD(&queries, list);
- ast_custom_function_unregister(oldquery->acf);
- free_acf_query(oldquery);
- }
-
- cfg = ast_config_load(config);
- if (!cfg) {
- ast_log(LOG_WARNING, "Unable to load config for func_odbc: %s\n", config);
- goto reload_out;
- }
-
- for (catg = ast_category_browse(cfg, NULL);
- catg;
- catg = ast_category_browse(cfg, catg)) {
- struct acf_odbc_query *query = NULL;
-
- if (init_acf_query(cfg, catg, &query)) {
- ast_log(LOG_ERROR, "Cannot initialize query %s\n", catg);
- } else {
- AST_LIST_INSERT_HEAD(&queries, query, list);
- ast_custom_function_register(query->acf);
- }
- }
-
- ast_config_destroy(cfg);
-reload_out:
- AST_LIST_UNLOCK(&queries);
- return res;
-}
-
-static int unload_module(void)
-{
- return odbc_unload_module();
-}
-
-static int load_module(void)
-{
- return odbc_load_module();
-}
-
-/* XXX need to revise usecount - set if query_lock is set */
-
-AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "ODBC lookups",
- .load = load_module,
- .unload = unload_module,
- .reload = reload,
- );
-
diff --git a/1.4.23-rc4/funcs/func_rand.c b/1.4.23-rc4/funcs/func_rand.c
deleted file mode 100644
index 53952d341..000000000
--- a/1.4.23-rc4/funcs/func_rand.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2006, Digium, Inc.
- * Copyright (C) 2006, Claude Patry
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Generate Random Number
- *
- * \author Claude Patry <cpatry@gmail.com>
- * \author Tilghman Lesher ( http://asterisk.drunkcoder.com/ )
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int acf_rand_exec(struct ast_channel *chan, char *cmd,
- char *parse, char *buffer, size_t buflen)
-{
- struct ast_module_user *u;
- int min_int, response_int, max_int;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(min);
- AST_APP_ARG(max);
- );
-
- u = ast_module_user_add(chan);
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- if (ast_strlen_zero(args.min) || sscanf(args.min, "%d", &min_int) != 1)
- min_int = 0;
-
- if (ast_strlen_zero(args.max) || sscanf(args.max, "%d", &max_int) != 1)
- max_int = RAND_MAX;
-
- if (max_int < min_int) {
- int tmp = max_int;
-
- max_int = min_int;
- min_int = tmp;
- ast_log(LOG_DEBUG, "max<min\n");
- }
-
- response_int = min_int + (ast_random() % (max_int - min_int + 1));
- ast_log(LOG_DEBUG, "%d was the lucky number in range [%d,%d]\n",
- response_int, min_int, max_int);
- snprintf(buffer, buflen, "%d", response_int);
-
- ast_module_user_remove(u);
-
- return 0;
-}
-
-static struct ast_custom_function acf_rand = {
- .name = "RAND",
- .synopsis = "Choose a random number in a range",
- .syntax = "RAND([min][|max])",
- .desc =
- "Choose a random number between min and max. Min defaults to 0, if not\n"
- "specified, while max defaults to RAND_MAX (2147483647 on many systems).\n"
- " Example: Set(junky=${RAND(1|8)}); \n"
- " Sets junky to a random number between 1 and 8, inclusive.\n",
- .read = acf_rand_exec,
-};
-
-static int unload_module(void)
-{
- ast_custom_function_unregister(&acf_rand);
-
- return 0;
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&acf_rand);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Random number dialplan function");
diff --git a/1.4.23-rc4/funcs/func_realtime.c b/1.4.23-rc4/funcs/func_realtime.c
deleted file mode 100644
index 6941b224e..000000000
--- a/1.4.23-rc4/funcs/func_realtime.c
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2005-2006, BJ Weschke. All rights reserved.
- *
- * BJ Weschke <bweschke@btwtech.com>
- *
- * This code is released by the author with no restrictions on usage.
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- */
-
-/*! \file
- *
- * \brief REALTIME dialplan function
- *
- * \author BJ Weschke <bweschke@btwtech.com>
- *
- * \ingroup functions
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/file.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/options.h"
-#include "asterisk/config.h"
-#include "asterisk/module.h"
-#include "asterisk/lock.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int function_realtime_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
- struct ast_variable *var, *head;
- struct ast_module_user *u;
- char *results, *result_begin;
- size_t resultslen = 0;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(family);
- AST_APP_ARG(fieldmatch);
- AST_APP_ARG(value);
- AST_APP_ARG(delim1);
- AST_APP_ARG(delim2);
- );
-
-
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: REALTIME(family|fieldmatch[|value[|delim1[|delim2]]]) - missing argument!\n");
- return -1;
- }
-
- u = ast_module_user_add(chan);
-
- AST_STANDARD_APP_ARGS(args, data);
-
- if (!args.delim1)
- args.delim1 = "|";
- if (!args.delim2)
- args.delim2 = "=";
-
- if (chan)
- ast_autoservice_start(chan);
-
- head = ast_load_realtime(args.family, args.fieldmatch, args.value, NULL);
-
- if (!head) {
- ast_module_user_remove(u);
- if (chan)
- ast_autoservice_stop(chan);
- return -1;
- }
- for (var = head; var; var = var->next)
- resultslen += strlen(var->name) + strlen(var->value) + strlen(args.delim1) + strlen(args.delim2);
-
- result_begin = results = alloca(resultslen);
- for (var = head; var; var = var->next)
- ast_build_string(&results, &resultslen, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1);
- ast_copy_string(buf, result_begin, len);
-
- ast_module_user_remove(u);
-
- if (chan)
- ast_autoservice_stop(chan);
-
- return 0;
-}
-
-static int function_realtime_write(struct ast_channel *chan, char *cmd, char *data, const char *value)
-{
- struct ast_module_user *u = NULL;
- int res = 0;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(family);
- AST_APP_ARG(fieldmatch);
- AST_APP_ARG(value);
- AST_APP_ARG(field);
- );
-
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: REALTIME(family|fieldmatch|value|newcol) - missing argument!\n");
- return -1;
- }
-
- if (chan) {
- ast_autoservice_start(chan);
- u = ast_module_user_add(chan);
- }
-
- AST_STANDARD_APP_ARGS(args, data);
-
- res = ast_update_realtime(args.family, args.fieldmatch, args.value, args.field, (char *)value, NULL);
-
- if (res < 0) {
- ast_log(LOG_WARNING, "Failed to update. Check the debug log for possible data repository related entries.\n");
- }
-
- if (chan) {
- ast_module_user_remove(u);
- ast_autoservice_stop(chan);
- }
-
- return 0;
-}
-
-struct ast_custom_function realtime_function = {
- .name = "REALTIME",
- .synopsis = "RealTime Read/Write Functions",
- .syntax = "REALTIME(family|fieldmatch[|value[|delim1[|delim2]]]) on read\n"
- "REALTIME(family|fieldmatch|value|field) on write\n",
- .desc = "This function will read or write values from/to a RealTime repository.\n"
- "REALTIME(....) will read names/values from the repository, and \n"
- "REALTIME(....)= will write a new value/field to the repository. On a\n"
- "read, this function returns a delimited text string. The name/value \n"
- "pairs are delimited by delim1, and the name and value are delimited \n"
- "between each other with delim2. The default for delim1 is '|' and \n"
- "the default for delim2 is '='. If there is no match, NULL will be \n"
- "returned by the function. On a write, this function will always \n"
- "return NULL. \n",
- .read = function_realtime_read,
- .write = function_realtime_write,
-};
-
-static int unload_module(void)
-{
- int res = ast_custom_function_unregister(&realtime_function);
-
- ast_module_user_hangup_all();
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = ast_custom_function_register(&realtime_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Read/Write values from a RealTime repository");
diff --git a/1.4.23-rc4/funcs/func_sha1.c b/1.4.23-rc4/funcs/func_sha1.c
deleted file mode 100644
index 01c7eb023..000000000
--- a/1.4.23-rc4/funcs/func_sha1.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2006, Digium, Inc.
- * Copyright (C) 2006, Claude Patry
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief SHA1 digest related dialplan functions
- *
- * \author Claude Patry <cpatry@gmail.com>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-static int sha1(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- *buf = '\0';
-
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: SHA1(<data>) - missing argument!\n");
- return -1;
- }
-
- if (len >= 41)
- ast_sha1_hash(buf, data);
- else {
- ast_log(LOG_ERROR,
- "Insufficient space to produce SHA1 hash result (%d < 41)\n",
- (int) len);
- }
-
- return 0;
-}
-
-static struct ast_custom_function sha1_function = {
- .name = "SHA1",
- .synopsis = "Computes a SHA1 digest",
- .syntax = "SHA1(<data>)",
- .read = sha1,
- .desc = "Generate a SHA1 digest via the SHA1 algorythm.\n"
- " Example: Set(sha1hash=${SHA1(junky)})\n"
- " Sets the asterisk variable sha1hash to the string '60fa5675b9303eb62f99a9cd47f9f5837d18f9a0'\n"
- " which is known as his hash\n",
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&sha1_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&sha1_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "SHA-1 computation dialplan function");
diff --git a/1.4.23-rc4/funcs/func_strings.c b/1.4.23-rc4/funcs/func_strings.c
deleted file mode 100644
index 8b0d562ba..000000000
--- a/1.4.23-rc4/funcs/func_strings.c
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 2005-2006, Digium, Inc.
- * Portions Copyright (C) 2005, Tilghman Lesher. All rights reserved.
- * Portions Copyright (C) 2005, Anthony Minessale II
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief String manipulation dialplan functions
- *
- * \author Tilghman Lesher
- * \author Anothony Minessale II
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <regex.h>
-
-#include "asterisk/module.h"
-#include "asterisk/options.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/localtime.h"
-
-static int function_fieldqty(struct ast_channel *chan, char *cmd,
- char *parse, char *buf, size_t len)
-{
- char *varsubst, varval[8192] = "", *varval2 = varval;
- int fieldcount = 0;
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(varname);
- AST_APP_ARG(delim);
- );
-
- AST_STANDARD_APP_ARGS(args, parse);
- if (args.delim) {
- varsubst = alloca(strlen(args.varname) + 4);
-
- sprintf(varsubst, "${%s}", args.varname);
- pbx_substitute_variables_helper(chan, varsubst, varval, sizeof(varval) - 1);
- if (ast_strlen_zero(varval2))
- fieldcount = 0;
- else {
- while (strsep(&varval2, args.delim))
- fieldcount++;
- }
- } else {
- fieldcount = 1;
- }
- snprintf(buf, len, "%d", fieldcount);
-
- return 0;
-}
-
-static struct ast_custom_function fieldqty_function = {
- .name = "FIELDQTY",
- .synopsis = "Count the fields, with an arbitrary delimiter",
- .syntax = "FIELDQTY(<varname>|<delim>)",
- .read = function_fieldqty,
-};
-
-static int filter(struct ast_channel *chan, char *cmd, char *parse, char *buf,
- size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(allowed);
- AST_APP_ARG(string);
- );
- char *outbuf = buf;
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- if (!args.string) {
- ast_log(LOG_ERROR, "Usage: FILTER(<allowed-chars>|<string>)\n");
- return -1;
- }
-
- for (; *(args.string) && (buf + len - 1 > outbuf); (args.string)++) {
- if (strchr(args.allowed, *(args.string)))
- *outbuf++ = *(args.string);
- }
- *outbuf = '\0';
-
- return 0;
-}
-
-static struct ast_custom_function filter_function = {
- .name = "FILTER",
- .synopsis = "Filter the string to include only the allowed characters",
- .syntax = "FILTER(<allowed-chars>|<string>)",
- .read = filter,
-};
-
-static int regex(struct ast_channel *chan, char *cmd, char *parse, char *buf,
- size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(null);
- AST_APP_ARG(reg);
- AST_APP_ARG(str);
- );
- int errcode;
- regex_t regexbuf;
-
- buf[0] = '\0';
-
- AST_NONSTANDARD_APP_ARGS(args, parse, '"');
-
- if (args.argc != 3) {
- ast_log(LOG_ERROR, "Unexpected arguments: should have been in the form '\"<regex>\" <string>'\n");
- return -1;
- }
- if ((*args.str == ' ') || (*args.str == '\t'))
- args.str++;
-
- if (option_debug)
- ast_log(LOG_DEBUG, "FUNCTION REGEX (%s)(%s)\n", args.reg, args.str);
-
- if ((errcode = regcomp(&regexbuf, args.reg, REG_EXTENDED | REG_NOSUB))) {
- regerror(errcode, &regexbuf, buf, len);
- ast_log(LOG_WARNING, "Malformed input %s(%s): %s\n", cmd, parse, buf);
- return -1;
- }
-
- strcpy(buf, regexec(&regexbuf, args.str, 0, NULL, 0) ? "0" : "1");
-
- regfree(&regexbuf);
-
- return 0;
-}
-
-static struct ast_custom_function regex_function = {
- .name = "REGEX",
- .synopsis = "Regular Expression",
- .desc =
- "Returns 1 if data matches regular expression, or 0 otherwise.\n"
- "Please note that the space following the double quotes separating the regex from the data\n"
- "is optional and if present, is skipped. If a space is desired at the beginning of the data,\n"
- "then put two spaces there; the second will not be skipped.\n",
- .syntax = "REGEX(\"<regular expression>\" <data>)",
- .read = regex,
-};
-
-static int array(struct ast_channel *chan, char *cmd, char *var,
- const char *value)
-{
- AST_DECLARE_APP_ARGS(arg1,
- AST_APP_ARG(var)[100];
- );
- AST_DECLARE_APP_ARGS(arg2,
- AST_APP_ARG(val)[100];
- );
- char *value2;
- int i;
-
- value2 = ast_strdupa(value);
- if (!var || !value2)
- return -1;
-
- /* The functions this will generally be used with are SORT and ODBC_*, which
- * both return comma-delimited lists. However, if somebody uses literal lists,
- * their commas will be translated to vertical bars by the load, and I don't
- * want them to be surprised by the result. Hence, we prefer commas as the
- * delimiter, but we'll fall back to vertical bars if commas aren't found.
- */
- if (option_debug)
- ast_log(LOG_DEBUG, "array (%s=%s)\n", var, value2);
- if (strchr(var, ','))
- AST_NONSTANDARD_APP_ARGS(arg1, var, ',');
- else
- AST_STANDARD_APP_ARGS(arg1, var);
-
- if (strchr(value2, ','))
- AST_NONSTANDARD_APP_ARGS(arg2, value2, ',');
- else
- AST_STANDARD_APP_ARGS(arg2, value2);
-
- for (i = 0; i < arg1.argc; i++) {
- if (option_debug)
- ast_log(LOG_DEBUG, "array set value (%s=%s)\n", arg1.var[i],
- arg2.val[i]);
- if (i < arg2.argc) {
- pbx_builtin_setvar_helper(chan, arg1.var[i], arg2.val[i]);
- } else {
- /* We could unset the variable, by passing a NULL, but due to
- * pushvar semantics, that could create some undesired behavior. */
- pbx_builtin_setvar_helper(chan, arg1.var[i], "");
- }
- }
-
- return 0;
-}
-
-static struct ast_custom_function array_function = {
- .name = "ARRAY",
- .synopsis = "Allows setting multiple variables at once",
- .syntax = "ARRAY(var1[|var2[...][|varN]])",
- .write = array,
- .desc =
- "The comma-separated list passed as a value to which the function is set will\n"
- "be interpreted as a set of values to which the comma-separated list of\n"
- "variable names in the argument should be set.\n"
- "Hence, Set(ARRAY(var1|var2)=1\\,2) will set var1 to 1 and var2 to 2\n"
- "Note: remember to either backslash your commas in extensions.conf or quote the\n"
- "entire argument, since Set can take multiple arguments itself.\n",
-};
-
-static int acf_sprintf(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
-#define SPRINTF_FLAG 0
-#define SPRINTF_WIDTH 1
-#define SPRINTF_PRECISION 2
-#define SPRINTF_LENGTH 3
-#define SPRINTF_CONVERSION 4
- int i, state = -1, argcount = 0;
- char *formatstart = NULL, *bufptr = buf;
- char formatbuf[256] = "";
- int tmpi;
- double tmpd;
- AST_DECLARE_APP_ARGS(arg,
- AST_APP_ARG(format);
- AST_APP_ARG(var)[100];
- );
-
- AST_STANDARD_APP_ARGS(arg, data);
-
- /* Scan the format, converting each argument into the requisite format type. */
- for (i = 0; arg.format[i]; i++) {
- switch (state) {
- case SPRINTF_FLAG:
- if (strchr("#0- +'I", arg.format[i]))
- break;
- state = SPRINTF_WIDTH;
- case SPRINTF_WIDTH:
- if (arg.format[i] >= '0' && arg.format[i] <= '9')
- break;
-
- /* Next character must be a period to go into a precision */
- if (arg.format[i] == '.') {
- state = SPRINTF_PRECISION;
- } else {
- state = SPRINTF_LENGTH;
- i--;
- }
- break;
- case SPRINTF_PRECISION:
- if (arg.format[i] >= '0' && arg.format[i] <= '9')
- break;
- state = SPRINTF_LENGTH;
- case SPRINTF_LENGTH:
- if (strchr("hl", arg.format[i])) {
- if (arg.format[i + 1] == arg.format[i])
- i++;
- state = SPRINTF_CONVERSION;
- break;
- } else if (strchr("Lqjzt", arg.format[i])) {
- state = SPRINTF_CONVERSION;
- break;
- }
- state = SPRINTF_CONVERSION;
- case SPRINTF_CONVERSION:
- if (strchr("diouxXc", arg.format[i])) {
- /* Integer */
-
- /* Isolate this format alone */
- ast_copy_string(formatbuf, formatstart, sizeof(formatbuf));
- formatbuf[&arg.format[i] - formatstart + 1] = '\0';
-
- /* Convert the argument into the required type */
- if (arg.var[argcount]) {
- if (sscanf(arg.var[argcount++], "%d", &tmpi) != 1) {
- ast_log(LOG_ERROR, "Argument '%s' is not an integer number for format '%s'\n", arg.var[argcount - 1], formatbuf);
- goto sprintf_fail;
- }
- } else {
- ast_log(LOG_ERROR, "SPRINTF() has more format specifiers than arguments!\n");
- goto sprintf_fail;
- }
-
- /* Format the argument */
- snprintf(bufptr, buf + len - bufptr, formatbuf, tmpi);
-
- /* Update the position of the next parameter to print */
- bufptr = strchr(buf, '\0');
- } else if (strchr("eEfFgGaA", arg.format[i])) {
- /* Double */
-
- /* Isolate this format alone */
- ast_copy_string(formatbuf, formatstart, sizeof(formatbuf));
- formatbuf[&arg.format[i] - formatstart + 1] = '\0';
-
- /* Convert the argument into the required type */
- if (arg.var[argcount]) {
- if (sscanf(arg.var[argcount++], "%lf", &tmpd) != 1) {
- ast_log(LOG_ERROR, "Argument '%s' is not a floating point number for format '%s'\n", arg.var[argcount - 1], formatbuf);
- goto sprintf_fail;
- }
- } else {
- ast_log(LOG_ERROR, "SPRINTF() has more format specifiers than arguments!\n");
- goto sprintf_fail;
- }
-
- /* Format the argument */
- snprintf(bufptr, buf + len - bufptr, formatbuf, tmpd);
-
- /* Update the position of the next parameter to print */
- bufptr = strchr(buf, '\0');
- } else if (arg.format[i] == 's') {
- /* String */
-
- /* Isolate this format alone */
- ast_copy_string(formatbuf, formatstart, sizeof(formatbuf));
- formatbuf[&arg.format[i] - formatstart + 1] = '\0';
-
- /* Format the argument */
- snprintf(bufptr, buf + len - bufptr, formatbuf, arg.var[argcount++]);
-
- /* Update the position of the next parameter to print */
- bufptr = strchr(buf, '\0');
- } else if (arg.format[i] == '%') {
- /* Literal data to copy */
- *bufptr++ = arg.format[i];
- } else {
- /* Not supported */
-
- /* Isolate this format alone */
- ast_copy_string(formatbuf, formatstart, sizeof(formatbuf));
- formatbuf[&arg.format[i] - formatstart + 1] = '\0';
-
- ast_log(LOG_ERROR, "Format type not supported: '%s' with argument '%s'\n", formatbuf, arg.var[argcount++]);
- goto sprintf_fail;
- }
- state = -1;
- break;
- default:
- if (arg.format[i] == '%') {
- state = SPRINTF_FLAG;
- formatstart = &arg.format[i];
- break;
- } else {
- /* Literal data to copy */
- *bufptr++ = arg.format[i];
- }
- }
- }
- *bufptr = '\0';
- return 0;
-sprintf_fail:
- return -1;
-}
-
-static struct ast_custom_function sprintf_function = {
- .name = "SPRINTF",
- .synopsis = "Format a variable according to a format string",
- .syntax = "SPRINTF(<format>|<arg1>[|...<argN>])",
- .read = acf_sprintf,
- .desc =
-"Parses the format string specified and returns a string matching that format.\n"
-"Supports most options supported by sprintf(3). Returns a shortened string if\n"
-"a format specifier is not recognized.\n",
-};
-
-static int quote(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
- char *bufptr = buf, *dataptr = data;
- *bufptr++ = '"';
- for (; bufptr < buf + len - 1; dataptr++) {
- if (*dataptr == '\\') {
- *bufptr++ = '\\';
- *bufptr++ = '\\';
- } else if (*dataptr == '"') {
- *bufptr++ = '\\';
- *bufptr++ = '"';
- } else if (*dataptr == '\0') {
- break;
- } else {
- *bufptr++ = *dataptr;
- }
- }
- *bufptr++ = '"';
- *bufptr = '\0';
- return 0;
-}
-
-static struct ast_custom_function quote_function = {
- .name = "QUOTE",
- .synopsis = "Quotes a given string, escaping embedded quotes as necessary",
- .syntax = "QUOTE(<string>)",
- .read = quote,
-};
-
-
-static int len(struct ast_channel *chan, char *cmd, char *data, char *buf,
- size_t len)
-{
- int length = 0;
-
- if (data)
- length = strlen(data);
-
- snprintf(buf, len, "%d", length);
-
- return 0;
-}
-
-static struct ast_custom_function len_function = {
- .name = "LEN",
- .synopsis = "Returns the length of the argument given",
- .syntax = "LEN(<string>)",
- .read = len,
-};
-
-static int acf_strftime(struct ast_channel *chan, char *cmd, char *parse,
- char *buf, size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(epoch);
- AST_APP_ARG(timezone);
- AST_APP_ARG(format);
- );
- time_t epochi;
- struct tm tm;
-
- buf[0] = '\0';
-
- AST_STANDARD_APP_ARGS(args, parse);
-
- ast_get_time_t(args.epoch, &epochi, time(NULL), NULL);
- ast_localtime(&epochi, &tm, args.timezone);
-
- if (!args.format)
- args.format = "%c";
-
- if (!strftime(buf, len, args.format, &tm))
- ast_log(LOG_WARNING, "C function strftime() output nothing?!!\n");
-
- buf[len - 1] = '\0';
-
- return 0;
-}
-
-static struct ast_custom_function strftime_function = {
- .name = "STRFTIME",
- .synopsis = "Returns the current date/time in a specified format.",
- .syntax = "STRFTIME([<epoch>][|[timezone][|format]])",
- .read = acf_strftime,
-};
-
-static int acf_strptime(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- AST_DECLARE_APP_ARGS(args,
- AST_APP_ARG(timestring);
- AST_APP_ARG(timezone);
- AST_APP_ARG(format);
- );
- struct tm time;
-
- memset(&time, 0, sizeof(struct tm));
-
- buf[0] = '\0';
-
- if (!data) {
- ast_log(LOG_ERROR,
- "Asterisk function STRPTIME() requires an argument.\n");
- return -1;
- }
-
- AST_STANDARD_APP_ARGS(args, data);
-
- if (ast_strlen_zero(args.format)) {
- ast_log(LOG_ERROR,
- "No format supplied to STRPTIME(<timestring>|<timezone>|<format>)");
- return -1;
- }
-
- if (!strptime(args.timestring, args.format, &time)) {
- ast_log(LOG_WARNING, "C function strptime() output nothing?!!\n");
- } else {
- /* Since strptime(3) does not check DST, force ast_mktime() to calculate it. */
- time.tm_isdst = -1;
- snprintf(buf, len, "%d", (int) ast_mktime(&time, args.timezone));
- }
-
- return 0;
-}
-
-static struct ast_custom_function strptime_function = {
- .name = "STRPTIME",
- .synopsis =
- "Returns the epoch of the arbitrary date/time string structured as described in the format.",
- .syntax = "STRPTIME(<datetime>|<timezone>|<format>)",
- .desc =
- "This is useful for converting a date into an EPOCH time, possibly to pass to\n"
- "an application like SayUnixTime or to calculate the difference between two\n"
- "date strings.\n"
- "\n"
- "Example:\n"
- " ${STRPTIME(2006-03-01 07:30:35|America/Chicago|%Y-%m-%d %H:%M:%S)} returns 1141219835\n",
- .read = acf_strptime,
-};
-
-static int function_eval(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- memset(buf, 0, len);
-
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "EVAL requires an argument: EVAL(<string>)\n");
- return -1;
- }
-
- pbx_substitute_variables_helper(chan, data, buf, len - 1);
-
- return 0;
-}
-
-static struct ast_custom_function eval_function = {
- .name = "EVAL",
- .synopsis = "Evaluate stored variables.",
- .syntax = "EVAL(<variable>)",
- .desc = "Using EVAL basically causes a string to be evaluated twice.\n"
- "When a variable or expression is in the dialplan, it will be\n"
- "evaluated at runtime. However, if the result of the evaluation\n"
- "is in fact a variable or expression, using EVAL will have it\n"
- "evaluated a second time. For example, if the variable ${MYVAR}\n"
- "contains \"${OTHERVAR}\", then the result of putting ${EVAL(${MYVAR})}\n"
- "in the dialplan will be the contents of the variable, OTHERVAR.\n"
- "Normally, by just putting ${MYVAR} in the dialplan, you would be\n"
- "left with \"${OTHERVAR}\".\n",
- .read = function_eval,
-};
-
-static int keypadhash(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
-{
- char *bufptr, *dataptr;
-
- for (bufptr = buf, dataptr = data; bufptr < buf + len - 1; dataptr++) {
- if (*dataptr == '\0') {
- *bufptr++ = '\0';
- break;
- } else if (*dataptr == '1') {
- *bufptr++ = '1';
- } else if (strchr("AaBbCc2", *dataptr)) {
- *bufptr++ = '2';
- } else if (strchr("DdEeFf3", *dataptr)) {
- *bufptr++ = '3';
- } else if (strchr("GgHhIi4", *dataptr)) {
- *bufptr++ = '4';
- } else if (strchr("JjKkLl5", *dataptr)) {
- *bufptr++ = '5';
- } else if (strchr("MmNnOo6", *dataptr)) {
- *bufptr++ = '6';
- } else if (strchr("PpQqRrSs7", *dataptr)) {
- *bufptr++ = '7';
- } else if (strchr("TtUuVv8", *dataptr)) {
- *bufptr++ = '8';
- } else if (strchr("WwXxYyZz9", *dataptr)) {
- *bufptr++ = '9';
- } else if (*dataptr == '0') {
- *bufptr++ = '0';
- }
- }
- buf[len - 1] = '\0';
-
- return 0;
-}
-
-static struct ast_custom_function keypadhash_function = {
- .name = "KEYPADHASH",
- .synopsis = "Hash the letters in the string into the equivalent keypad numbers.",
- .syntax = "KEYPADHASH(<string>)",
- .read = keypadhash,
- .desc = "Example: ${KEYPADHASH(Les)} returns \"537\"\n",
-};
-
-static int unload_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_unregister(&fieldqty_function);
- res |= ast_custom_function_unregister(&filter_function);
- res |= ast_custom_function_unregister(&regex_function);
- res |= ast_custom_function_unregister(&array_function);
- res |= ast_custom_function_unregister(&quote_function);
- res |= ast_custom_function_unregister(&len_function);
- res |= ast_custom_function_unregister(&strftime_function);
- res |= ast_custom_function_unregister(&strptime_function);
- res |= ast_custom_function_unregister(&eval_function);
- res |= ast_custom_function_unregister(&keypadhash_function);
- res |= ast_custom_function_unregister(&sprintf_function);
-
- return res;
-}
-
-static int load_module(void)
-{
- int res = 0;
-
- res |= ast_custom_function_register(&fieldqty_function);
- res |= ast_custom_function_register(&filter_function);
- res |= ast_custom_function_register(&regex_function);
- res |= ast_custom_function_register(&array_function);
- res |= ast_custom_function_register(&quote_function);
- res |= ast_custom_function_register(&len_function);
- res |= ast_custom_function_register(&strftime_function);
- res |= ast_custom_function_register(&strptime_function);
- res |= ast_custom_function_register(&eval_function);
- res |= ast_custom_function_register(&keypadhash_function);
- res |= ast_custom_function_register(&sprintf_function);
-
- return res;
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "String handling dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_timeout.c b/1.4.23-rc4/funcs/func_timeout.c
deleted file mode 100644
index 5b935605a..000000000
--- a/1.4.23-rc4/funcs/func_timeout.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- *
- * Mark Spencer <markster@digium.com>
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief Channel timeout related dialplan functions
- *
- * \author Mark Spencer <markster@digium.com>
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-#include "asterisk/options.h"
-
-static int timeout_read(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- time_t myt;
-
- if (!chan)
- return -1;
-
- if (!data) {
- ast_log(LOG_ERROR, "Must specify type of timeout to get.\n");
- return -1;
- }
-
- switch (*data) {
- case 'a':
- case 'A':
- if (chan->whentohangup == 0) {
- ast_copy_string(buf, "0", len);
- } else {
- time(&myt);
- snprintf(buf, len, "%d", (int) (chan->whentohangup - myt));
- }
- break;
-
- case 'r':
- case 'R':
- if (chan->pbx) {
- snprintf(buf, len, "%d", chan->pbx->rtimeout);
- }
- break;
-
- case 'd':
- case 'D':
- if (chan->pbx) {
- snprintf(buf, len, "%d", chan->pbx->dtimeout);
- }
- break;
-
- default:
- ast_log(LOG_ERROR, "Unknown timeout type specified.\n");
- return -1;
- }
-
- return 0;
-}
-
-static int timeout_write(struct ast_channel *chan, char *cmd, char *data,
- const char *value)
-{
- int x;
- char timestr[64];
- struct tm myt;
-
- if (!chan)
- return -1;
-
- if (!data) {
- ast_log(LOG_ERROR, "Must specify type of timeout to set.\n");
- return -1;
- }
-
- if (!value)
- return -1;
-
- x = atoi(value);
- if (x < 0)
- x = 0;
-
- switch (*data) {
- case 'a':
- case 'A':
- ast_channel_setwhentohangup(chan, x);
- if (option_verbose > 2) {
- if (chan->whentohangup) {
- strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S UTC",
- gmtime_r(&chan->whentohangup, &myt));
- ast_verbose(VERBOSE_PREFIX_3 "Channel will hangup at %s.\n",
- timestr);
- } else {
- ast_verbose(VERBOSE_PREFIX_3 "Channel hangup cancelled.\n");
- }
- }
- break;
-
- case 'r':
- case 'R':
- if (chan->pbx) {
- chan->pbx->rtimeout = x;
- if (option_verbose > 2)
- ast_verbose(VERBOSE_PREFIX_3 "Response timeout set to %d\n",
- chan->pbx->rtimeout);
- }
- break;
-
- case 'd':
- case 'D':
- if (chan->pbx) {
- chan->pbx->dtimeout = x;
- if (option_verbose > 2)
- ast_verbose(VERBOSE_PREFIX_3 "Digit timeout set to %d\n",
- chan->pbx->dtimeout);
- }
- break;
-
- default:
- ast_log(LOG_ERROR, "Unknown timeout type specified.\n");
- break;
- }
-
- return 0;
-}
-
-static struct ast_custom_function timeout_function = {
- .name = "TIMEOUT",
- .synopsis = "Gets or sets timeouts on the channel.",
- .syntax = "TIMEOUT(timeouttype)",
- .desc =
- "Gets or sets various channel timeouts. The timeouts that can be\n"
- "manipulated are:\n" "\n"
- "absolute: The absolute maximum amount of time permitted for a call. A\n"
- " setting of 0 disables the timeout.\n" "\n"
- "digit: The maximum amount of time permitted between digits when the\n"
- " user is typing in an extension. When this timeout expires,\n"
- " after the user has started to type in an extension, the\n"
- " extension will be considered complete, and will be\n"
- " interpreted. Note that if an extension typed in is valid,\n"
- " it will not have to timeout to be tested, so typically at\n"
- " the expiry of this timeout, the extension will be considered\n"
- " invalid (and thus control would be passed to the 'i'\n"
- " extension, or if it doesn't exist the call would be\n"
- " terminated). The default timeout is 5 seconds.\n" "\n"
- "response: The maximum amount of time permitted after falling through a\n"
- " series of priorities for a channel in which the user may\n"
- " begin typing an extension. If the user does not type an\n"
- " extension in this amount of time, control will pass to the\n"
- " 't' extension if it exists, and if not the call would be\n"
- " terminated. The default timeout is 10 seconds.\n",
- .read = timeout_read,
- .write = timeout_write,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&timeout_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&timeout_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Channel timeout dialplan functions");
diff --git a/1.4.23-rc4/funcs/func_uri.c b/1.4.23-rc4/funcs/func_uri.c
deleted file mode 100644
index 2680dd678..000000000
--- a/1.4.23-rc4/funcs/func_uri.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Asterisk -- An open source telephony toolkit.
- *
- * Copyright (C) 1999 - 2006, Digium, Inc.
- *
- * Created by Olle E. Johansson, Edvina.net
- *
- * See http://www.asterisk.org for more information about
- * the Asterisk project. Please do not directly contact
- * any of the maintainers of this project for assistance;
- * the project provides a web site, mailing lists and IRC
- * channels for your use.
- *
- * 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.
- */
-
-/*! \file
- *
- * \brief URI encoding / decoding
- *
- * \author Olle E. Johansson <oej@edvina.net>
- *
- * \note For now this code only supports 8 bit characters, not unicode,
- which we ultimately will need to support.
- *
- */
-
-#include "asterisk.h"
-
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-
-#include "asterisk/module.h"
-#include "asterisk/channel.h"
-#include "asterisk/pbx.h"
-#include "asterisk/logger.h"
-#include "asterisk/utils.h"
-#include "asterisk/app.h"
-
-/*! \brief uriencode: Encode URL according to RFC 2396 */
-static int uriencode(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: URIENCODE(<data>) - missing argument!\n");
- return -1;
- }
-
- ast_uri_encode(data, buf, len, 1);
-
- return 0;
-}
-
-/*!\brief uridecode: Decode URI according to RFC 2396 */
-static int uridecode(struct ast_channel *chan, char *cmd, char *data,
- char *buf, size_t len)
-{
- if (ast_strlen_zero(data)) {
- ast_log(LOG_WARNING, "Syntax: URIDECODE(<data>) - missing argument!\n");
- return -1;
- }
-
- ast_copy_string(buf, data, len);
- ast_uri_decode(buf);
-
- return 0;
-}
-
-static struct ast_custom_function urldecode_function = {
- .name = "URIDECODE",
- .synopsis = "Decodes a URI-encoded string according to RFC 2396.",
- .syntax = "URIDECODE(<data>)",
- .read = uridecode,
-};
-
-static struct ast_custom_function urlencode_function = {
- .name = "URIENCODE",
- .synopsis = "Encodes a string to URI-safe encoding according to RFC 2396.",
- .syntax = "URIENCODE(<data>)",
- .read = uriencode,
-};
-
-static int unload_module(void)
-{
- return ast_custom_function_unregister(&urldecode_function)
- || ast_custom_function_unregister(&urlencode_function);
-}
-
-static int load_module(void)
-{
- return ast_custom_function_register(&urldecode_function)
- || ast_custom_function_register(&urlencode_function);
-}
-
-AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "URI encode/decode dialplan functions");