Index: funcs/func_env.c =================================================================== RCS file: /usr/cvsroot/asterisk/funcs/func_env.c,v retrieving revision 1.4 diff -u -r1.4 func_env.c --- funcs/func_env.c 14 Sep 2005 20:46:50 -0000 1.4 +++ funcs/func_env.c 13 Oct 2005 17:19:22 -0000 @@ -23,6 +23,7 @@ #include #include #include +#include #include "asterisk.h" @@ -59,6 +60,52 @@ } } +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); + data = ast_strdupa(data); + 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 +116,24 @@ .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", +}; +