Thu Apr 28 2011 17:13:33

Asterisk developer's documentation


func_shell.c

Go to the documentation of this file.
00001 /*
00002  * Asterisk -- An open source telephony toolkit.
00003  *
00004  * Copyright (C) 2006, Digium, Inc.
00005  *
00006  * See http://www.asterisk.org for more information about
00007  * the Asterisk project. Please do not directly contact
00008  * any of the maintainers of this project for assistance;
00009  * the project provides a web site, mailing lists and IRC
00010  * channels for your use.
00011  *
00012  * This program is free software, distributed under the terms of
00013  * the GNU General Public License Version 2. See the LICENSE file
00014  * at the top of the source tree.
00015  */
00016 
00017 /*! \file
00018  *
00019  * SHELL function to return the value of a system call.
00020  * 
00021  * \note Inspiration and Guidance from Russell! Thank You! 
00022  *
00023  * \author Brandon Kruse <bkruse@digium.com>
00024  *
00025  * \ingroup functions
00026  */
00027 
00028 #include "asterisk.h"
00029 
00030 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 153365 $")
00031 
00032 #include "asterisk/module.h"
00033 #include "asterisk/channel.h"
00034 #include "asterisk/pbx.h"
00035 #include "asterisk/utils.h"
00036 #include "asterisk/app.h"
00037 
00038 static int shell_helper(struct ast_channel *chan, const char *cmd, char *data,
00039                                char *buf, size_t len)
00040 {
00041    if (ast_strlen_zero(data)) {
00042       ast_log(LOG_WARNING, "Missing Argument!  Example:  Set(foo=${SHELL(echo \"bar\")})\n");
00043       return -1;
00044    }
00045 
00046    if (chan)
00047       ast_autoservice_start(chan);
00048 
00049    if (len >= 1) {
00050       FILE *ptr;
00051       char plbuff[4096];
00052 
00053       ptr = popen(data, "r");
00054       while (fgets(plbuff, sizeof(plbuff), ptr)) {
00055          strncat(buf, plbuff, len - strlen(buf) - 1);
00056       }
00057       pclose(ptr);
00058    }
00059 
00060    if (chan)
00061       ast_autoservice_stop(chan);
00062 
00063    return 0;
00064 }
00065 
00066 /*** DOCUMENTATION
00067    <function name="SHELL" language="en_US">
00068       <synopsis>
00069          Executes a command as if you were at a shell.
00070       </synopsis>
00071       <syntax>
00072          <parameter name="command" required="true">
00073             <para>This is the argument to the function, the command you want to pass to the shell.</para>
00074          </parameter>
00075       </syntax>
00076       <description>
00077          <para>Returns the value from a system command</para>
00078          <para>Example:  <literal>Set(foo=${SHELL(echo \bar\)})</literal></para>
00079          <note><para>When using the SHELL() dialplan function, your \SHELL\ is /bin/sh,
00080          which may differ as to the underlying shell, depending upon your production
00081          platform.  Also keep in mind that if you are using a common path, you should
00082          be mindful of race conditions that could result from two calls running
00083          SHELL() simultaneously.</para></note>
00084       </description>
00085  
00086    </function>
00087  ***/
00088 static struct ast_custom_function shell_function = {
00089    .name = "SHELL",
00090    .read = shell_helper,
00091 };
00092 
00093 static int unload_module(void)
00094 {
00095    return ast_custom_function_unregister(&shell_function);
00096 }
00097 
00098 static int load_module(void)
00099 {
00100    return ast_custom_function_register(&shell_function);
00101 }
00102 
00103 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Returns the output of a shell command");
00104