From 85a0e13c7303dfcf423eedace00ddaf372cfe732 Mon Sep 17 00:00:00 2001 From: Mark Spencer Date: Sun, 27 Feb 2005 19:07:46 +0000 Subject: Merge mog's ReadFile application (bug #3670) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5099 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- Makefile | 1 + app.c | 34 +++++++++++++++ apps/Makefile | 2 +- apps/app_readfile.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++++ include/asterisk/app.h | 3 ++ 5 files changed, 155 insertions(+), 1 deletion(-) create mode 100755 apps/app_readfile.c diff --git a/Makefile b/Makefile index a26f11e01..378a935f3 100755 --- a/Makefile +++ b/Makefile @@ -407,6 +407,7 @@ bininstall: all mkdir -p $(DESTDIR)$(ASTSBINDIR) mkdir -p $(DESTDIR)$(ASTVARRUNDIR) mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/voicemail + mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/system mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp install -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/ install -m 755 contrib/scripts/astgenkey $(DESTDIR)$(ASTSBINDIR)/ diff --git a/app.c b/app.c index ebda3f765..d740b9d1a 100755 --- a/app.c +++ b/app.c @@ -1393,3 +1393,37 @@ int ast_ivr_menu_run(struct ast_channel *chan, struct ast_ivr_menu *menu, void * res = 0; return res; } + +char *ast_read_textfile(const char *filename) +{ + int fd; + char *output=NULL; + struct stat filesize; + int count=0; + int res; + if(stat(filename,&filesize)== -1){ + ast_log(LOG_WARNING,"Error can't stat %s\n", filename); + return NULL; + } + count=filesize.st_size + 1; + fd = open(filename, O_RDONLY); + if (fd < 0) { + ast_log(LOG_WARNING, "Cannot open file '%s' for reading: %s\n", filename, strerror(errno)); + return NULL; + } + output=(char *)malloc(count); + if (output) { + res = read(fd, output, count - 1); + if (res == count - 1) { + output[res] = '\0'; + } else { + ast_log(LOG_WARNING, "Short read of %s (%d of %d): %s\n", filename, res, count - 1, strerror(errno)); + free(output); + output = NULL; + } + } else + ast_log(LOG_WARNING, "Out of memory!\n"); + close(fd); + return output; +} + diff --git a/apps/Makefile b/apps/Makefile index 7b527d343..f37aadab7 100755 --- a/apps/Makefile +++ b/apps/Makefile @@ -31,7 +31,7 @@ APPS=app_dial.so app_playback.so app_voicemail.so app_directory.so app_mp3.so\ app_talkdetect.so app_alarmreceiver.so app_userevent.so app_verbose.so \ app_test.so app_forkcdr.so app_math.so app_realtime.so \ app_dumpchan.so app_waitforsilence.so app_while.so app_setrdnis.so \ - app_md5.so + app_md5.so app_readfile.so ifneq (${OSARCH},Darwin) ifneq (${OSARCH},SunOS) diff --git a/apps/app_readfile.c b/apps/app_readfile.c new file mode 100755 index 000000000..3adc79a9c --- /dev/null +++ b/apps/app_readfile.c @@ -0,0 +1,116 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * ReadFile application -- Reads in a File for you. + * + * Copyright (C) 2005 Digium, Inc. + * + * Matt O'Gorman + * + * This program is free software, distributed under the terms of + * the GNU General Public License + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static char *tdesc = "Stores output of file into a variable"; + +static char *app_readfile = "ReadFile"; + +static char *readfile_synopsis = "ReadFile(varname=file,length)"; + +static char *readfile_descrip = +"ReadFile(varname=file,length)\n" +" Varname - Result stored here.\n" +" File - The name of the file to read.\n" +" Length - Maximum number of lines to capture.\n"; + +STANDARD_LOCAL_USER; + +LOCAL_USER_DECL; + + +static int readfile_exec(struct ast_channel *chan, void *data) +{ + int res=0; + struct localuser *u; + char *s, *varname=NULL, *file=NULL, *length=NULL, *returnvar=NULL; + int len=0; + + + s = ast_strdupa(data); + if (!s) { + ast_log(LOG_ERROR, "Out of memory\n"); + return -1; + } + + varname = strsep(&s, "="); + file = strsep(&s, "|"); + length = s; + + if (!varname || !file) { + ast_log(LOG_ERROR, "No file or variable specified!\n"); + return -1; + } + + LOCAL_USER_ADD(u); + if (length) { + if ((sscanf(length, "%d", &len) != 1) || (len < 0)) { + ast_log(LOG_WARNING, "%s is not a positive number, defaulting length to max\n", length); + len = 0; + } + } + + + returnvar = ast_read_textfile(file); + if(len > 0){ + if(len < strlen(returnvar)) + returnvar[len]='\0'; + else + ast_log(LOG_WARNING,"%s is longer than %i, and %i \n",file,len,strlen(returnvar)); + } + pbx_builtin_setvar_helper(chan, varname, returnvar); + free(returnvar); + LOCAL_USER_REMOVE(u); + return res; +} + + +int unload_module(void) +{ + STANDARD_HANGUP_LOCALUSERS; + return ast_unregister_application(app_readfile); +} + +int load_module(void) +{ + return ast_register_application(app_readfile, readfile_exec, readfile_synopsis, readfile_descrip); +} + +char *description(void) +{ + return tdesc; +} + +int usecount(void) +{ + int res; + STANDARD_USECOUNT(res); + return res; +} + +char *key() +{ + return ASTERISK_GPL_KEY; +} diff --git a/include/asterisk/app.h b/include/asterisk/app.h index 222dbaeb4..5dc5fbc51 100755 --- a/include/asterisk/app.h +++ b/include/asterisk/app.h @@ -132,6 +132,9 @@ int ast_lock_path(const char *path); /* Unlock a path */ int ast_unlock_path(const char *path); +/*Read a file into asterisk*/ +char *ast_read_textfile(const char *file); + #define GROUP_CATEGORY_PREFIX "GROUP" /*! Split a group string into group and category, returning a default category if none is provided. */ -- cgit v1.2.3