From 6b13c4d7d4dd81f77e0caac97b86380ba3151665 Mon Sep 17 00:00:00 2001 From: Tilghman Lesher Date: Sun, 7 Jan 2007 14:40:48 +0000 Subject: Add function to execute a shell command and return the output (Issue 8676) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@49785 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- funcs/func_shell.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 funcs/func_shell.c (limited to 'funcs/func_shell.c') diff --git a/funcs/func_shell.c b/funcs/func_shell.c new file mode 100644 index 000000000..fc155e9b3 --- /dev/null +++ b/funcs/func_shell.c @@ -0,0 +1,90 @@ +/* + * 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 + * + * \SHELL function to return the value of a system call. + * + * \ Inspiration and Guidance from Russell! Thank You! + * + * \author Brandon Kruse + */ + +#include "asterisk.h" + +ASTERISK_FILE_VERSION(__FILE__, "$Revision$") + +#include +#include +#include +#include + +#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 shell_helper(struct ast_channel *chan, char *cmd, char *data, + char *buf, size_t len) +{ + if (ast_strlen_zero(data)) { + ast_log(LOG_WARNING, "Missing Argument! Example: Set(foo=${SHELL(echo \"bar\")})\n"); + return -1; + } + + if (len >= 1) { + FILE *ptr; + char plbuff[4096]; + + ptr = popen(data, "r"); + while (fgets(plbuff, sizeof(plbuff), ptr)) { + strncat(buf, plbuff, len - strlen(buf) - 1); + } + pclose(ptr); + } + + return 0; +} + +static struct ast_custom_function shell_function = { + .name = "SHELL", + .synopsis = "Executes a command as if you were at a shell.", + .syntax = "SHELL()", + .read = shell_helper, + .desc = +"Returns the value from a system command\n" +" Example: Set(foo=${SHELL(echo \"bar\")})\n" +" Note: When using the SHELL() dialplan function, your \"SHELL\" is /bin/sh,\n" +" which may differ as to the underlying shell, depending upon your production\n" +" platform. Also keep in mind that if you are using a common path, you should\n" +" be mindful of race conditions that could result from two calls running\n" +" SHELL() simultaneously.\n", +}; + +static int unload_module(void) +{ + return ast_custom_function_unregister(&shell_function); +} + +static int load_module(void) +{ + return ast_custom_function_register(&shell_function); +} + +AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "SHELL dialplan function"); + -- cgit v1.2.3