2009-10-11 14:31:42 +00:00
|
|
|
#include "buffer.h"
|
|
|
|
#include "server.h"
|
|
|
|
#include "log.h"
|
|
|
|
#include "plugin.h"
|
|
|
|
#include "response.h"
|
|
|
|
|
|
|
|
#include "mod_cml.h"
|
|
|
|
#include "mod_cml_funcs.h"
|
|
|
|
|
2005-07-06 11:58:19 +00:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <unistd.h>
|
2005-07-24 06:58:03 +00:00
|
|
|
#include <dirent.h>
|
2005-07-06 11:58:19 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2005-07-11 10:59:39 +00:00
|
|
|
#ifdef USE_OPENSSL
|
|
|
|
# include <openssl/md5.h>
|
|
|
|
#else
|
|
|
|
# include "md5.h"
|
2011-04-24 16:14:54 +00:00
|
|
|
|
|
|
|
typedef li_MD5_CTX MD5_CTX;
|
|
|
|
#define MD5_Init li_MD5_Init
|
|
|
|
#define MD5_Update li_MD5_Update
|
|
|
|
#define MD5_Final li_MD5_Final
|
|
|
|
|
2005-07-11 10:59:39 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#define HASHLEN 16
|
|
|
|
typedef unsigned char HASH[HASHLEN];
|
|
|
|
#define HASHHEXLEN 32
|
|
|
|
typedef char HASHHEX[HASHHEXLEN+1];
|
|
|
|
#ifdef USE_OPENSSL
|
|
|
|
#define IN const
|
|
|
|
#else
|
2006-10-04 13:26:23 +00:00
|
|
|
#define IN
|
2005-07-11 10:59:39 +00:00
|
|
|
#endif
|
|
|
|
#define OUT
|
2005-07-06 11:58:19 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
#ifdef HAVE_LUA_H
|
2005-07-06 11:58:19 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
int f_crypto_md5(lua_State *L) {
|
|
|
|
MD5_CTX Md5Ctx;
|
|
|
|
HASH HA1;
|
|
|
|
buffer b;
|
|
|
|
char hex[33];
|
|
|
|
int n = lua_gettop(L);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
b.ptr = hex;
|
|
|
|
b.used = 0;
|
|
|
|
b.size = sizeof(hex);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (n != 1) {
|
2005-07-26 08:27:08 +00:00
|
|
|
lua_pushstring(L, "md5: expected one argument");
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_error(L);
|
2005-07-06 11:58:19 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
2005-07-26 08:27:08 +00:00
|
|
|
lua_pushstring(L, "md5: argument has to be a string");
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_error(L);
|
2005-07-06 11:58:19 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
MD5_Init(&Md5Ctx);
|
|
|
|
MD5_Update(&Md5Ctx, (unsigned char *)lua_tostring(L, 1), lua_strlen(L, 1));
|
|
|
|
MD5_Final(HA1, &Md5Ctx);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
buffer_copy_string_hex(&b, (char *)HA1, 16);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushstring(L, b.ptr);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
return 1;
|
2005-07-11 10:59:39 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
int f_file_mtime(lua_State *L) {
|
|
|
|
struct stat st;
|
|
|
|
int n = lua_gettop(L);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (n != 1) {
|
2005-07-24 06:58:03 +00:00
|
|
|
lua_pushstring(L, "file_mtime: expected one argument");
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_error(L);
|
2005-07-11 10:59:39 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
2005-07-24 06:58:03 +00:00
|
|
|
lua_pushstring(L, "file_mtime: argument has to be a string");
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_error(L);
|
2005-07-11 10:59:39 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (-1 == stat(lua_tostring(L, 1), &st)) {
|
2005-07-24 06:58:03 +00:00
|
|
|
lua_pushnil(L);
|
|
|
|
return 1;
|
2005-07-15 17:46:13 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushnumber(L, st.st_mtime);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
return 1;
|
2005-07-11 10:59:39 +00:00
|
|
|
}
|
|
|
|
|
2009-03-07 21:05:37 +00:00
|
|
|
static int f_dir_files_iter(lua_State *L) {
|
2005-07-24 06:58:03 +00:00
|
|
|
DIR *d;
|
|
|
|
struct dirent *de;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
d = lua_touserdata(L, lua_upvalueindex(1));
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
if (NULL == (de = readdir(d))) {
|
|
|
|
/* EOF */
|
|
|
|
closedir(d);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
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);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
if (n != 1) {
|
|
|
|
lua_pushstring(L, "dir_files: expected one argument");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
|
|
|
lua_pushstring(L, "dir_files: argument has to be a string");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
|
|
|
/* check if there is a valid DIR handle on the stack */
|
2005-07-24 06:58:03 +00:00
|
|
|
if (NULL == (d = opendir(lua_tostring(L, 1)))) {
|
|
|
|
lua_pushnil(L);
|
|
|
|
return 1;
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
/* push d into registry */
|
|
|
|
lua_pushlightuserdata(L, d);
|
|
|
|
lua_pushcclosure(L, f_dir_files_iter, 1);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int f_file_isreg(lua_State *L) {
|
|
|
|
struct stat st;
|
|
|
|
int n = lua_gettop(L);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
if (n != 1) {
|
|
|
|
lua_pushstring(L, "file_isreg: expected one argument");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
|
|
|
lua_pushstring(L, "file_isreg: argument has to be a string");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
if (-1 == stat(lua_tostring(L, 1), &st)) {
|
|
|
|
lua_pushnil(L);
|
|
|
|
return 1;
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
lua_pushnumber(L, S_ISREG(st.st_mode));
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2005-08-31 23:06:59 +00:00
|
|
|
int f_file_isdir(lua_State *L) {
|
|
|
|
struct stat st;
|
|
|
|
int n = lua_gettop(L);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-08-31 23:06:59 +00:00
|
|
|
if (n != 1) {
|
|
|
|
lua_pushstring(L, "file_isreg: expected one argument");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-08-31 23:06:59 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
|
|
|
lua_pushstring(L, "file_isreg: argument has to be a string");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-08-31 23:06:59 +00:00
|
|
|
if (-1 == stat(lua_tostring(L, 1), &st)) {
|
|
|
|
lua_pushnil(L);
|
|
|
|
return 1;
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-08-31 23:06:59 +00:00
|
|
|
lua_pushnumber(L, S_ISDIR(st.st_mode));
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-08-31 23:06:59 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-07-24 06:58:03 +00:00
|
|
|
|
2005-07-09 20:17:07 +00:00
|
|
|
#ifdef HAVE_MEMCACHE_H
|
2005-07-15 17:46:13 +00:00
|
|
|
int f_memcache_exists(lua_State *L) {
|
2005-07-09 20:17:07 +00:00
|
|
|
char *r;
|
2005-07-15 17:46:13 +00:00
|
|
|
int n = lua_gettop(L);
|
|
|
|
struct memcache *mc;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_islightuserdata(L, lua_upvalueindex(1))) {
|
|
|
|
lua_pushstring(L, "where is my userdata ?");
|
|
|
|
lua_error(L);
|
2005-07-11 10:59:39 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
mc = lua_touserdata(L, lua_upvalueindex(1));
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (n != 1) {
|
|
|
|
lua_pushstring(L, "expected one argument");
|
|
|
|
lua_error(L);
|
2005-07-06 11:58:19 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
|
|
|
lua_pushstring(L, "argument has to be a string");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
|
|
|
if (NULL == (r = mc_aget(mc,
|
2009-03-07 21:05:21 +00:00
|
|
|
(char*) lua_tostring(L, 1), lua_strlen(L, 1)))) {
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushboolean(L, 0);
|
|
|
|
return 1;
|
2005-07-09 20:17:07 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-09 20:17:07 +00:00
|
|
|
free(r);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushboolean(L, 1);
|
|
|
|
return 1;
|
2005-07-06 11:58:19 +00:00
|
|
|
}
|
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
int f_memcache_get_string(lua_State *L) {
|
2005-07-09 20:17:07 +00:00
|
|
|
char *r;
|
2005-07-15 17:46:13 +00:00
|
|
|
int n = lua_gettop(L);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
struct memcache *mc;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_islightuserdata(L, lua_upvalueindex(1))) {
|
|
|
|
lua_pushstring(L, "where is my userdata ?");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
mc = lua_touserdata(L, lua_upvalueindex(1));
|
2006-10-04 13:26:23 +00:00
|
|
|
|
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (n != 1) {
|
|
|
|
lua_pushstring(L, "expected one argument");
|
|
|
|
lua_error(L);
|
2005-07-06 11:58:19 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
|
|
|
lua_pushstring(L, "argument has to be a string");
|
|
|
|
lua_error(L);
|
2005-07-11 10:59:39 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
|
|
|
if (NULL == (r = mc_aget(mc,
|
2009-03-07 21:05:21 +00:00
|
|
|
(char*) lua_tostring(L, 1), lua_strlen(L, 1)))) {
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushnil(L);
|
|
|
|
return 1;
|
2005-07-09 20:17:07 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushstring(L, r);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-09 20:17:07 +00:00
|
|
|
free(r);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
return 1;
|
2005-07-09 20:17:07 +00:00
|
|
|
}
|
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
int f_memcache_get_long(lua_State *L) {
|
2005-07-09 20:17:07 +00:00
|
|
|
char *r;
|
2005-07-15 17:46:13 +00:00
|
|
|
int n = lua_gettop(L);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
struct memcache *mc;
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_islightuserdata(L, lua_upvalueindex(1))) {
|
|
|
|
lua_pushstring(L, "where is my userdata ?");
|
|
|
|
lua_error(L);
|
2005-07-09 20:17:07 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
mc = lua_touserdata(L, lua_upvalueindex(1));
|
2006-10-04 13:26:23 +00:00
|
|
|
|
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (n != 1) {
|
|
|
|
lua_pushstring(L, "expected one argument");
|
|
|
|
lua_error(L);
|
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
if (!lua_isstring(L, 1)) {
|
|
|
|
lua_pushstring(L, "argument has to be a string");
|
|
|
|
lua_error(L);
|
2005-07-11 10:59:39 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
|
|
|
if (NULL == (r = mc_aget(mc,
|
2009-03-07 21:05:21 +00:00
|
|
|
(char*) lua_tostring(L, 1), lua_strlen(L, 1)))) {
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushnil(L);
|
|
|
|
return 1;
|
2005-07-09 20:17:07 +00:00
|
|
|
}
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
lua_pushnumber(L, strtol(r, NULL, 10));
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-09 20:17:07 +00:00
|
|
|
free(r);
|
2006-10-04 13:26:23 +00:00
|
|
|
|
2005-07-15 17:46:13 +00:00
|
|
|
return 1;
|
2005-07-06 11:58:19 +00:00
|
|
|
}
|
2005-07-09 20:17:07 +00:00
|
|
|
#endif
|
2005-07-15 17:46:13 +00:00
|
|
|
|
|
|
|
#endif
|