From 0451792a46747d19f7d5c7035591a5c2801be4dd Mon Sep 17 00:00:00 2001 From: markster Date: Thu, 23 Dec 2004 02:55:53 +0000 Subject: Add app_curl from tilghman (bug #3131) git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4539 f38db490-d61c-443f-a65b-d21fe96a405b --- apps/Makefile | 8 ++++ apps/app_curl.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100755 apps/app_curl.c diff --git a/apps/Makefile b/apps/Makefile index 48dfdedd7..17d2b44e1 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -51,6 +51,11 @@ APPS+=$(shell if [ -f /usr/include/linux/zaptel.h ]; then echo "app_zapras.so ap APPS+=$(shell if [ -f /usr/local/include/zaptel.h ]; then echo "app_zapras.so app_meetme.so app_flash.so app_zapbarge.so app_zapscan.so" ; fi) APPS+=$(shell if [ -f /usr/include/osp/osp.h ]; then echo "app_osplookup.so" ; fi) +CURLLIBS=$(shell curl-config --libs) +ifneq (${CURLLIBS},) + APPS+=app_curl.so +endif + CFLAGS+=-fPIC # # If you have MySQL 4.1 or later you can use ODBC @@ -74,6 +79,9 @@ install: all rm -f $(DESTDIR)$(MODULES_DIR)/app_datetime.so rm -f $(DESTDIR)$(MODULES_DIR)/app_qcall.so +app_curl.so: app_curl.o + $(CC) $(SOLINK) -o $@ $< $(CURLLIBS) + app_voicemail.so : app_voicemail.o ifeq ($(USE_MYSQL_VM_INTERFACE),1) $(CC) $(SOLINK) -o $@ $(MLFLAGS) $< -L/usr/lib/mysql -lmysqlclient -lz diff --git a/apps/app_curl.c b/apps/app_curl.c new file mode 100755 index 000000000..6d47da444 --- /dev/null +++ b/apps/app_curl.c @@ -0,0 +1,144 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * Curl - App to load a URL + * + * Copyright (C) 2004, Tilghman Lesher + * + * Tilghman Lesher + * + * app_curl.c is distributed with no restrictions on usage or + * redistribution. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static char *tdesc = "Load external URL"; + +static char *app = "Curl"; + +static char *synopsis = "Load an external URL"; + +static char *descrip = +" Curl(URL): Requests the URL. Mainly used for signalling external\n" +"applications of an event. Returns 0 or -1 on fatal error. Also sets\n" +"CURL variable with the resulting page.\n"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + +extern int errno; + +struct MemoryStruct { + char *memory; + size_t size; +}; + +static void *myrealloc(void *ptr, size_t size) +{ + /* There might be a realloc() out there that doesn't like reallocing + NULL pointers, so we take care of it here */ + if (ptr) + return realloc(ptr, size); + else + return malloc(size); +} + +static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data) +{ + register int realsize = size * nmemb; + struct MemoryStruct *mem = (struct MemoryStruct *)data; + + mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1); + if (mem->memory) { + memcpy(&(mem->memory[mem->size]), ptr, realsize); + mem->size += realsize; + mem->memory[mem->size] = 0; + } + return realsize; +} + +static int curl_exec(struct ast_channel *chan, void *data) +{ + int res = 0; + struct localuser *u; + CURL *curl; + + if (!data || !strlen((char *)data)) { + ast_log(LOG_WARNING, "Curl requires an argument (URL)\n"); + return -1; + } + + LOCAL_USER_ADD(u); + + curl_global_init(CURL_GLOBAL_ALL); + curl = curl_easy_init(); + + if (curl) { + struct MemoryStruct chunk; + + chunk.memory=NULL; /* we expect realloc(NULL, size) to work */ + chunk.size = 0; /* no data at this point */ + + curl_easy_setopt(curl, CURLOPT_URL, (char *)data); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "asterisk-libcurl-agent/1.0"); + + curl_easy_perform(curl); + curl_easy_cleanup(curl); + + chunk.memory[chunk.size] = '\0'; + if (chunk.memory[chunk.size - 1] == 10) + chunk.memory[chunk.size - 1] = '\0'; + + pbx_builtin_setvar_helper(chan, "CURL", chunk.memory); + + free(chunk.memory); + } else { + ast_log(LOG_ERROR, "Cannot allocate curl structure\n"); + res = -1; + } + + LOCAL_USER_REMOVE(u); + return res; +} + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app); +} + +int load_module(void) +{ + return ast_register_application(app, curl_exec, synopsis, descrip); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} + +char *key() +{ + return ASTERISK_GPL_KEY; +} -- cgit v1.2.3