00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
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