Sat Mar 10 01:54:18 2012

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 /*** MODULEINFO
00029    <support_level>core</support_level>
00030  ***/
00031 
00032 #include "asterisk.h"
00033 
00034 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 331575 $")
00035 
00036 #include "asterisk/module.h"
00037 #include "asterisk/channel.h"
00038 #include "asterisk/pbx.h"
00039 #include "asterisk/utils.h"
00040 #include "asterisk/app.h"
00041 
00042 static int shell_helper(struct ast_channel *chan, const char *cmd, char *data,
00043                                char *buf, size_t len)
00044 {
00045    int res = 0;
00046 
00047    if (ast_strlen_zero(data)) {
00048       ast_log(LOG_WARNING, "Missing Argument!  Example:  Set(foo=${SHELL(echo \"bar\")})\n");
00049       return -1;
00050    }
00051 
00052    if (chan) {
00053       ast_autoservice_start(chan);
00054    }
00055 
00056    if (len >= 1) {
00057       FILE *ptr;
00058       char plbuff[4096];
00059 
00060       ptr = popen(data, "r");
00061       if (ptr) {
00062          while (fgets(plbuff, sizeof(plbuff), ptr)) {
00063             strncat(buf, plbuff, len - strlen(buf) - 1);
00064          }
00065          pclose(ptr);
00066       } else {
00067          ast_log(LOG_WARNING, "Failed to execute shell command '%s'\n", data);
00068          res = -1;
00069       }
00070    }
00071 
00072    if (chan) {
00073       ast_autoservice_stop(chan);
00074    }
00075 
00076    return res;
00077 }
00078 
00079 /*** DOCUMENTATION
00080    <function name="SHELL" language="en_US">
00081       <synopsis>
00082          Executes a command as if you were at a shell.
00083       </synopsis>
00084       <syntax>
00085          <parameter name="command" required="true">
00086             <para>This is the argument to the function, the command you want to pass to the shell.</para>
00087          </parameter>
00088       </syntax>
00089       <description>
00090          <para>Returns the value from a system command</para>
00091          <para>Example:  <literal>Set(foo=${SHELL(echo \bar\)})</literal></para>
00092          <note><para>When using the SHELL() dialplan function, your \SHELL\ is /bin/sh,
00093          which may differ as to the underlying shell, depending upon your production
00094          platform.  Also keep in mind that if you are using a common path, you should
00095          be mindful of race conditions that could result from two calls running
00096          SHELL() simultaneously.</para></note>
00097       </description>
00098  
00099    </function>
00100  ***/
00101 static struct ast_custom_function shell_function = {
00102    .name = "SHELL",
00103    .read = shell_helper,
00104 };
00105 
00106 static int unload_module(void)
00107 {
00108    return ast_custom_function_unregister(&shell_function);
00109 }
00110 
00111 static int load_module(void)
00112 {
00113    return ast_custom_function_register(&shell_function);
00114 }
00115 
00116 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Returns the output of a shell command");
00117 

Generated on Sat Mar 10 01:54:18 2012 for Asterisk - The Open Source Telephony Project by  doxygen 1.4.7