From: Tilghman Lesher Date: Wed, 21 Dec 2005 17:09:54 +0000 (+0000) Subject: Bug 5440 - Add STAT() dialplan function X-Git-Tag: 1.4.0-beta1~3160 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6c3eda3e5fc8bf2bdf2f9a6edd03769f3936c358;p=thirdparty%2Fasterisk.git Bug 5440 - Add STAT() dialplan function git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@7575 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/funcs/func_env.c b/funcs/func_env.c index 4906c7d112..a4a5162d6f 100644 --- a/funcs/func_env.c +++ b/funcs/func_env.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "asterisk.h" @@ -59,6 +60,51 @@ static void builtin_function_env_write(struct ast_channel *chan, char *cmd, char } } +static char *builtin_function_stat_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) +{ + char *action; + struct stat s; + + ast_copy_string(buf, "0", len); + if (!data) { + ast_log(LOG_ERROR, "Out of memory\n"); + return buf; + } + + action = strsep(&data, "|"); + if (stat(data, &s)) { + return buf; + } else { + switch (*action) { + case 'e': + ast_copy_string(buf, "1", len); + break; + case 's': + snprintf(buf, len, "%d", (unsigned int)s.st_size); + break; + case 'f': + snprintf(buf, len, "%d", S_ISREG(s.st_mode) ? 1 : 0); + break; + case 'd': + snprintf(buf, len, "%d", S_ISDIR(s.st_mode) ? 1 : 0); + break; + case 'M': + snprintf(buf, len, "%d", (int)s.st_mtime); + break; + case 'A': + snprintf(buf, len, "%d", (int)s.st_mtime); + break; + case 'C': + snprintf(buf, len, "%d", (int)s.st_ctime); + break; + case 'm': + snprintf(buf, len, "%o", (int)s.st_mode); + break; + } + } + return buf; +} + #ifndef BUILTIN_FUNC static #endif @@ -69,3 +115,24 @@ struct ast_custom_function env_function = { .read = builtin_function_env_read, .write = builtin_function_env_write, }; + +#ifndef BUILTIN_FUNC +static +#endif +struct ast_custom_function stat_function = { + .name = "STAT", + .synopsis = "Does a check on the specified file", + .syntax = "STAT(,)", + .read = builtin_function_stat_read, + .desc = +"flag may be one of the following:\n" +" d - Checks if the file is a directory\n" +" e - Checks if the file exists\n" +" f - Checks if the file is a regular file\n" +" m - Returns the file mode (in octal)\n" +" s - Returns the size (in bytes) of the file\n" +" A - Returns the epoch at which the file was last accessed\n" +" C - Returns the epoch at which the inode was last changed\n" +" M - Returns the epoch at which the file was last modified\n", +}; +