#include "asterisk.h"
#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"
Go to the source code of this file.
Data Structures | |
struct | MemoryStruct |
Functions | |
static int | acf_curl_exec (struct ast_channel *chan, char *cmd, char *info, char *buf, size_t len) |
AST_MODULE_INFO_STANDARD (ASTERISK_GPL_KEY,"Load external URL") | |
AST_THREADSTORAGE_CUSTOM (curl_instance, curl_instance_init, curl_instance_cleanup) | |
static void | curl_instance_cleanup (void *data) |
static int | curl_internal (struct MemoryStruct *chunk, char *url, char *post) |
static int | load_module (void) |
static void * | myrealloc (void *ptr, size_t size) |
static int | unload_module (void) |
static size_t | WriteMemoryCallback (void *ptr, size_t size, size_t nmemb, void *data) |
Variables | |
ast_custom_function | acf_curl |
static const char * | global_useragent = "asterisk-libcurl-agent/1.0" |
Definition in file func_curl.c.
static int acf_curl_exec | ( | struct ast_channel * | chan, | |
char * | cmd, | |||
char * | info, | |||
char * | buf, | |||
size_t | len | |||
) | [static] |
Definition at line 130 of file func_curl.c.
References AST_APP_ARG, ast_autoservice_start(), ast_autoservice_stop(), AST_DECLARE_APP_ARGS, ast_log(), ast_module_user_add, ast_module_user_remove, AST_STANDARD_APP_ARGS, ast_strlen_zero(), curl_internal(), free, LOG_ERROR, LOG_WARNING, MemoryStruct::memory, and MemoryStruct::size.
00131 { 00132 struct ast_module_user *u; 00133 struct MemoryStruct chunk = { NULL, 0 }; 00134 AST_DECLARE_APP_ARGS(args, 00135 AST_APP_ARG(url); 00136 AST_APP_ARG(postdata); 00137 ); 00138 00139 *buf = '\0'; 00140 00141 if (ast_strlen_zero(info)) { 00142 ast_log(LOG_WARNING, "CURL requires an argument (URL)\n"); 00143 return -1; 00144 } 00145 00146 u = ast_module_user_add(chan); 00147 00148 AST_STANDARD_APP_ARGS(args, info); 00149 00150 if (chan) 00151 ast_autoservice_start(chan); 00152 00153 if (!curl_internal(&chunk, args.url, args.postdata)) { 00154 if (chunk.memory) { 00155 chunk.memory[chunk.size] = '\0'; 00156 if (chunk.memory[chunk.size - 1] == 10) 00157 chunk.memory[chunk.size - 1] = '\0'; 00158 00159 ast_copy_string(buf, chunk.memory, len); 00160 free(chunk.memory); 00161 } 00162 } else { 00163 ast_log(LOG_ERROR, "Cannot allocate curl structure\n"); 00164 } 00165 00166 if (chan) 00167 ast_autoservice_stop(chan); 00168 00169 ast_module_user_remove(u); 00170 00171 return 0; 00172 }
AST_MODULE_INFO_STANDARD | ( | ASTERISK_GPL_KEY | , | |
"Load external URL" | ||||
) |
AST_THREADSTORAGE_CUSTOM | ( | curl_instance | , | |
curl_instance_init | , | |||
curl_instance_cleanup | ||||
) |
static void curl_instance_cleanup | ( | void * | data | ) | [static] |
Definition at line 87 of file func_curl.c.
References free.
00088 { 00089 CURL **curl = data; 00090 00091 curl_easy_cleanup(*curl); 00092 00093 free(data); 00094 }
static int curl_internal | ( | struct MemoryStruct * | chunk, | |
char * | url, | |||
char * | post | |||
) | [static] |
Definition at line 98 of file func_curl.c.
References WriteMemoryCallback().
Referenced by acf_curl_exec().
00099 { 00100 CURL **curl; 00101 00102 if (!(curl = ast_threadstorage_get(&curl_instance, sizeof(*curl)))) 00103 return -1; 00104 00105 if (!*curl) { 00106 if (!(*curl = curl_easy_init())) 00107 return -1; 00108 curl_easy_setopt(*curl, CURLOPT_NOSIGNAL, 1); 00109 curl_easy_setopt(*curl, CURLOPT_TIMEOUT, 180); 00110 curl_easy_setopt(*curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); 00111 curl_easy_setopt(*curl, CURLOPT_USERAGENT, global_useragent); 00112 } 00113 00114 curl_easy_setopt(*curl, CURLOPT_URL, url); 00115 curl_easy_setopt(*curl, CURLOPT_WRITEDATA, (void *) chunk); 00116 00117 if (post) { 00118 curl_easy_setopt(*curl, CURLOPT_POST, 1); 00119 curl_easy_setopt(*curl, CURLOPT_POSTFIELDS, post); 00120 } 00121 00122 curl_easy_perform(*curl); 00123 00124 if (post) 00125 curl_easy_setopt(*curl, CURLOPT_POST, 0); 00126 00127 return 0; 00128 }
static int load_module | ( | void | ) | [static] |
Definition at line 197 of file func_curl.c.
References acf_curl, ast_custom_function_register(), ast_log(), AST_MODULE_LOAD_DECLINE, and LOG_ERROR.
00198 { 00199 int res; 00200 00201 if (curl_global_init(CURL_GLOBAL_ALL)) { 00202 ast_log(LOG_ERROR, "Unable to initialize the CURL library. Cannot load func_curl\n"); 00203 return AST_MODULE_LOAD_DECLINE; 00204 } 00205 00206 res = ast_custom_function_register(&acf_curl); 00207 00208 return res; 00209 }
static void* myrealloc | ( | void * | ptr, | |
size_t | size | |||
) | [static] |
Definition at line 61 of file func_curl.c.
References ast_malloc, and ast_realloc.
Referenced by WriteMemoryCallback().
00062 { 00063 /* There might be a realloc() out there that doesn't like reallocing 00064 NULL pointers, so we take care of it here */ 00065 if (ptr) 00066 return ast_realloc(ptr, size); 00067 else 00068 return ast_malloc(size); 00069 }
static int unload_module | ( | void | ) | [static] |
Definition at line 184 of file func_curl.c.
References acf_curl, ast_custom_function_unregister(), and ast_module_user_hangup_all.
00185 { 00186 int res; 00187 00188 res = ast_custom_function_unregister(&acf_curl); 00189 00190 ast_module_user_hangup_all(); 00191 00192 curl_global_cleanup(); 00193 00194 return res; 00195 }
static size_t WriteMemoryCallback | ( | void * | ptr, | |
size_t | size, | |||
size_t | nmemb, | |||
void * | data | |||
) | [static] |
Definition at line 71 of file func_curl.c.
References MemoryStruct::memory, myrealloc(), and MemoryStruct::size.
Referenced by curl_internal().
00072 { 00073 register int realsize = size * nmemb; 00074 struct MemoryStruct *mem = (struct MemoryStruct *)data; 00075 00076 mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); 00077 if (mem->memory) { 00078 memcpy(&(mem->memory[mem->size]), ptr, realsize); 00079 mem->size += realsize; 00080 mem->memory[mem->size] = 0; 00081 } 00082 return realsize; 00083 }
struct ast_custom_function acf_curl |
const char* global_useragent = "asterisk-libcurl-agent/1.0" [static] |
Definition at line 85 of file func_curl.c.