lighttpd1.4/src/mod_cml_funcs.c

261 lines
4.6 KiB
C

#include "first.h"
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <dirent.h>
#include <lauxlib.h>
#include "sys-crypto-md.h"
#include "mod_cml_funcs.h"
#include "mod_cml.h"
#include "buffer.h"
#include "log.h"
#include "plugin.h"
int f_crypto_md5(lua_State *L) {
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);
char HA1[MD5_DIGEST_LENGTH];
MD5_once((unsigned char *)HA1, s, s_len);
char hex[MD5_DIGEST_LENGTH*2+1];
li_tohex(hex, sizeof(hex), HA1, sizeof(HA1));
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