diff options
Diffstat (limited to 'data/lighttpd/lighttpd-1.4.53/src/mod_cml_funcs.c')
-rw-r--r-- | data/lighttpd/lighttpd-1.4.53/src/mod_cml_funcs.c | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/data/lighttpd/lighttpd-1.4.53/src/mod_cml_funcs.c b/data/lighttpd/lighttpd-1.4.53/src/mod_cml_funcs.c new file mode 100644 index 000000000..cc674a2f0 --- /dev/null +++ b/data/lighttpd/lighttpd-1.4.53/src/mod_cml_funcs.c @@ -0,0 +1,269 @@ +#include "first.h" + +#include <sys/stat.h> +#include <time.h> + +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <dirent.h> + +#include <lauxlib.h> + +#include "mod_cml_funcs.h" +#include "mod_cml.h" + +#include "buffer.h" +#include "log.h" +#include "plugin.h" + +#include "md5.h" + +#define HASHLEN 16 +typedef unsigned char HASH[HASHLEN]; +#define HASHHEXLEN 32 +typedef char HASHHEX[HASHHEXLEN+1]; + +int f_crypto_md5(lua_State *L) { + li_MD5_CTX Md5Ctx; + HASH HA1; + char hex[33]; + int n = lua_gettop(L); + size_t s_len; + const char *s; + + if (n != 1) { + lua_pushstring(L, "md5: expected one argument"); + lua_error(L); + } + + if (!lua_isstring(L, 1)) { + lua_pushstring(L, "md5: argument has to be a string"); + lua_error(L); + } + + s = lua_tolstring(L, 1, &s_len); + + li_MD5_Init(&Md5Ctx); + li_MD5_Update(&Md5Ctx, (unsigned char *) s, (unsigned int) s_len); + li_MD5_Final(HA1, &Md5Ctx); + + li_tohex(hex, sizeof(hex), (const char*) HA1, 16); + + lua_pushstring(L, hex); + + return 1; +} + + +int f_file_mtime(lua_State *L) { + struct stat st; + int n = lua_gettop(L); + + if (n != 1) { + lua_pushstring(L, "file_mtime: expected one argument"); + lua_error(L); + } + + if (!lua_isstring(L, 1)) { + lua_pushstring(L, "file_mtime: argument has to be a string"); + lua_error(L); + } + + if (-1 == stat(lua_tostring(L, 1), &st)) { + lua_pushnil(L); + return 1; + } + + lua_pushinteger(L, st.st_mtime); + + return 1; +} + +static int f_dir_files_iter(lua_State *L) { + DIR *d; + struct dirent *de; + + d = lua_touserdata(L, lua_upvalueindex(1)); + + if (NULL == (de = readdir(d))) { + /* EOF */ + closedir(d); + + return 0; + } else { + lua_pushstring(L, de->d_name); + return 1; + } +} + +int f_dir_files(lua_State *L) { + DIR *d; + int n = lua_gettop(L); + + if (n != 1) { + lua_pushstring(L, "dir_files: expected one argument"); + lua_error(L); + } + + if (!lua_isstring(L, 1)) { + lua_pushstring(L, "dir_files: argument has to be a string"); + lua_error(L); + } + + /* check if there is a valid DIR handle on the stack */ + if (NULL == (d = opendir(lua_tostring(L, 1)))) { + lua_pushnil(L); + return 1; + } + + /* push d into userdata */ + lua_pushlightuserdata(L, d); + lua_pushcclosure(L, f_dir_files_iter, 1); + + return 1; +} + +int f_file_isreg(lua_State *L) { + struct stat st; + int n = lua_gettop(L); + + if (n != 1) { + lua_pushstring(L, "file_isreg: expected one argument"); + lua_error(L); + } + + if (!lua_isstring(L, 1)) { + lua_pushstring(L, "file_isreg: argument has to be a string"); + lua_error(L); + } + + if (-1 == stat(lua_tostring(L, 1), &st)) { + lua_pushnil(L); + return 1; + } + + lua_pushinteger(L, S_ISREG(st.st_mode)); + + return 1; +} + +int f_file_isdir(lua_State *L) { + struct stat st; + int n = lua_gettop(L); + + if (n != 1) { + lua_pushstring(L, "file_isreg: expected one argument"); + lua_error(L); + } + + if (!lua_isstring(L, 1)) { + lua_pushstring(L, "file_isreg: argument has to be a string"); + lua_error(L); + } + + if (-1 == stat(lua_tostring(L, 1), &st)) { + lua_pushnil(L); + return 1; + } + + lua_pushinteger(L, S_ISDIR(st.st_mode)); + + return 1; +} + + + +#ifdef USE_MEMCACHED +int f_memcache_exists(lua_State *L) { + size_t key_len; + const char *key; + memcached_st *memc; + + if (!lua_islightuserdata(L, lua_upvalueindex(1))) { + lua_pushstring(L, "where is my userdata ?"); + lua_error(L); + } + + memc = lua_touserdata(L, lua_upvalueindex(1)); + + if (1 != lua_gettop(L)) { + lua_pushstring(L, "expected one argument"); + lua_error(L); + } + + key = luaL_checklstring(L, 1, &key_len); + lua_pushboolean(L, (MEMCACHED_SUCCESS == memcached_exist(memc, key, key_len))); + return 1; +} + +int f_memcache_get_string(lua_State *L) { + size_t key_len, value_len; + char *value; + const char *key; + memcached_st *memc; + + if (!lua_islightuserdata(L, lua_upvalueindex(1))) { + lua_pushstring(L, "where is my userdata ?"); + lua_error(L); + } + + memc = lua_touserdata(L, lua_upvalueindex(1)); + + if (1 != lua_gettop(L)) { + lua_pushstring(L, "expected one argument"); + lua_error(L); + } + + key = luaL_checklstring(L, 1, &key_len); + if (NULL == (value = memcached_get(memc, key, key_len, &value_len, NULL, NULL))) { + lua_pushnil(L); + return 1; + } + + lua_pushlstring(L, value, value_len); + + free(value); + + return 1; +} + +int f_memcache_get_long(lua_State *L) { + size_t key_len, value_len; + char *value; + const char *key; + memcached_st *memc; + char *endptr; + long v; + + if (!lua_islightuserdata(L, lua_upvalueindex(1))) { + lua_pushstring(L, "where is my userdata ?"); + lua_error(L); + } + + memc = lua_touserdata(L, lua_upvalueindex(1)); + + if (1 != lua_gettop(L)) { + lua_pushstring(L, "expected one argument"); + lua_error(L); + } + + key = luaL_checklstring(L, 1, &key_len); + if (NULL == (value = memcached_get(memc, key, key_len, &value_len, NULL, NULL))) { + lua_pushnil(L); + return 1; + } + + errno = 0; + v = strtol(value, &endptr, 10); + if (0 == errno && *endptr == '\0') { + lua_pushinteger(L, v); + } else { + lua_pushnil(L); + } + + free(value); + + return 1; +} +#endif |