Annotation of embedaddon/lighttpd/src/mod_cml_funcs.c, revision 1.1.1.2

1.1.1.2 ! misho       1: #include "first.h"
        !             2: 
1.1       misho       3: #include "buffer.h"
                      4: #include "server.h"
                      5: #include "log.h"
                      6: #include "plugin.h"
                      7: #include "response.h"
                      8: 
                      9: #include "mod_cml.h"
                     10: #include "mod_cml_funcs.h"
                     11: 
                     12: #include <sys/stat.h>
                     13: #include <time.h>
                     14: 
                     15: #include <stdlib.h>
                     16: #include <string.h>
                     17: #include <errno.h>
                     18: #include <unistd.h>
                     19: #include <dirent.h>
                     20: #include <stdio.h>
                     21: 
                     22: #include "md5.h"
                     23: 
                     24: #define HASHLEN 16
                     25: typedef unsigned char HASH[HASHLEN];
                     26: #define HASHHEXLEN 32
                     27: typedef char HASHHEX[HASHHEXLEN+1];
                     28: #ifdef USE_OPENSSL
                     29: #define IN const
                     30: #else
                     31: #define IN
                     32: #endif
                     33: #define OUT
                     34: 
                     35: #ifdef HAVE_LUA_H
                     36: 
1.1.1.2 ! misho      37: #include <lauxlib.h>
        !            38: 
1.1       misho      39: int f_crypto_md5(lua_State *L) {
                     40:        li_MD5_CTX Md5Ctx;
                     41:        HASH HA1;
                     42:        char hex[33];
                     43:        int n = lua_gettop(L);
1.1.1.2 ! misho      44:        size_t s_len;
        !            45:        const char *s;
1.1       misho      46: 
                     47:        if (n != 1) {
                     48:                lua_pushstring(L, "md5: expected one argument");
                     49:                lua_error(L);
                     50:        }
                     51: 
                     52:        if (!lua_isstring(L, 1)) {
                     53:                lua_pushstring(L, "md5: argument has to be a string");
                     54:                lua_error(L);
                     55:        }
                     56: 
1.1.1.2 ! misho      57:        s = lua_tolstring(L, 1, &s_len);
        !            58: 
1.1       misho      59:        li_MD5_Init(&Md5Ctx);
1.1.1.2 ! misho      60:        li_MD5_Update(&Md5Ctx, (unsigned char *) s, (unsigned int) s_len);
1.1       misho      61:        li_MD5_Final(HA1, &Md5Ctx);
                     62: 
1.1.1.2 ! misho      63:        li_tohex(hex, sizeof(hex), (const char*) HA1, 16);
1.1       misho      64: 
1.1.1.2 ! misho      65:        lua_pushstring(L, hex);
1.1       misho      66: 
                     67:        return 1;
                     68: }
                     69: 
                     70: 
                     71: int f_file_mtime(lua_State *L) {
                     72:        struct stat st;
                     73:        int n = lua_gettop(L);
                     74: 
                     75:        if (n != 1) {
                     76:                lua_pushstring(L, "file_mtime: expected one argument");
                     77:                lua_error(L);
                     78:        }
                     79: 
                     80:        if (!lua_isstring(L, 1)) {
                     81:                lua_pushstring(L, "file_mtime: argument has to be a string");
                     82:                lua_error(L);
                     83:        }
                     84: 
                     85:        if (-1 == stat(lua_tostring(L, 1), &st)) {
                     86:                lua_pushnil(L);
                     87:                return 1;
                     88:        }
                     89: 
1.1.1.2 ! misho      90:        lua_pushinteger(L, st.st_mtime);
1.1       misho      91: 
                     92:        return 1;
                     93: }
                     94: 
                     95: static int f_dir_files_iter(lua_State *L) {
                     96:        DIR *d;
                     97:        struct dirent *de;
                     98: 
                     99:        d = lua_touserdata(L, lua_upvalueindex(1));
                    100: 
                    101:        if (NULL == (de = readdir(d))) {
                    102:                /* EOF */
                    103:                closedir(d);
                    104: 
                    105:                return 0;
                    106:        } else {
                    107:                lua_pushstring(L, de->d_name);
                    108:                return 1;
                    109:        }
                    110: }
                    111: 
                    112: int f_dir_files(lua_State *L) {
                    113:        DIR *d;
                    114:        int n = lua_gettop(L);
                    115: 
                    116:        if (n != 1) {
                    117:                lua_pushstring(L, "dir_files: expected one argument");
                    118:                lua_error(L);
                    119:        }
                    120: 
                    121:        if (!lua_isstring(L, 1)) {
                    122:                lua_pushstring(L, "dir_files: argument has to be a string");
                    123:                lua_error(L);
                    124:        }
                    125: 
                    126:        /* check if there is a valid DIR handle on the stack */
                    127:        if (NULL == (d = opendir(lua_tostring(L, 1)))) {
                    128:                lua_pushnil(L);
                    129:                return 1;
                    130:        }
                    131: 
1.1.1.2 ! misho     132:        /* push d into userdata */
1.1       misho     133:        lua_pushlightuserdata(L, d);
                    134:        lua_pushcclosure(L, f_dir_files_iter, 1);
                    135: 
                    136:        return 1;
                    137: }
                    138: 
                    139: int f_file_isreg(lua_State *L) {
                    140:        struct stat st;
                    141:        int n = lua_gettop(L);
                    142: 
                    143:        if (n != 1) {
                    144:                lua_pushstring(L, "file_isreg: expected one argument");
                    145:                lua_error(L);
                    146:        }
                    147: 
                    148:        if (!lua_isstring(L, 1)) {
                    149:                lua_pushstring(L, "file_isreg: argument has to be a string");
                    150:                lua_error(L);
                    151:        }
                    152: 
                    153:        if (-1 == stat(lua_tostring(L, 1), &st)) {
                    154:                lua_pushnil(L);
                    155:                return 1;
                    156:        }
                    157: 
1.1.1.2 ! misho     158:        lua_pushinteger(L, S_ISREG(st.st_mode));
1.1       misho     159: 
                    160:        return 1;
                    161: }
                    162: 
                    163: int f_file_isdir(lua_State *L) {
                    164:        struct stat st;
                    165:        int n = lua_gettop(L);
                    166: 
                    167:        if (n != 1) {
                    168:                lua_pushstring(L, "file_isreg: expected one argument");
                    169:                lua_error(L);
                    170:        }
                    171: 
                    172:        if (!lua_isstring(L, 1)) {
                    173:                lua_pushstring(L, "file_isreg: argument has to be a string");
                    174:                lua_error(L);
                    175:        }
                    176: 
                    177:        if (-1 == stat(lua_tostring(L, 1), &st)) {
                    178:                lua_pushnil(L);
                    179:                return 1;
                    180:        }
                    181: 
1.1.1.2 ! misho     182:        lua_pushinteger(L, S_ISDIR(st.st_mode));
1.1       misho     183: 
                    184:        return 1;
                    185: }
                    186: 
                    187: 
                    188: 
1.1.1.2 ! misho     189: #ifdef USE_MEMCACHED
1.1       misho     190: int f_memcache_exists(lua_State *L) {
1.1.1.2 ! misho     191:        size_t key_len;
        !           192:        const char *key;
        !           193:        memcached_st *memc;
1.1       misho     194: 
                    195:        if (!lua_islightuserdata(L, lua_upvalueindex(1))) {
                    196:                lua_pushstring(L, "where is my userdata ?");
                    197:                lua_error(L);
                    198:        }
                    199: 
1.1.1.2 ! misho     200:        memc = lua_touserdata(L, lua_upvalueindex(1));
1.1       misho     201: 
1.1.1.2 ! misho     202:        if (1 != lua_gettop(L)) {
1.1       misho     203:                lua_pushstring(L, "expected one argument");
                    204:                lua_error(L);
                    205:        }
                    206: 
1.1.1.2 ! misho     207:        key = luaL_checklstring(L, 1, &key_len);
        !           208:        lua_pushboolean(L, (MEMCACHED_SUCCESS == memcached_exist(memc, key, key_len)));
1.1       misho     209:        return 1;
                    210: }
                    211: 
                    212: int f_memcache_get_string(lua_State *L) {
1.1.1.2 ! misho     213:        size_t key_len, value_len;
        !           214:        char *value;
        !           215:        const char *key;
        !           216:        memcached_st *memc;
1.1       misho     217: 
                    218:        if (!lua_islightuserdata(L, lua_upvalueindex(1))) {
                    219:                lua_pushstring(L, "where is my userdata ?");
                    220:                lua_error(L);
                    221:        }
                    222: 
1.1.1.2 ! misho     223:        memc = lua_touserdata(L, lua_upvalueindex(1));
1.1       misho     224: 
1.1.1.2 ! misho     225:        if (1 != lua_gettop(L)) {
1.1       misho     226:                lua_pushstring(L, "expected one argument");
                    227:                lua_error(L);
                    228:        }
                    229: 
1.1.1.2 ! misho     230:        key = luaL_checklstring(L, 1, &key_len);
        !           231:        if (NULL == (value = memcached_get(memc, key, key_len, &value_len, NULL, NULL))) {
1.1       misho     232:                lua_pushnil(L);
                    233:                return 1;
                    234:        }
                    235: 
1.1.1.2 ! misho     236:        lua_pushlstring(L, value, value_len);
1.1       misho     237: 
1.1.1.2 ! misho     238:        free(value);
1.1       misho     239: 
                    240:        return 1;
                    241: }
                    242: 
                    243: int f_memcache_get_long(lua_State *L) {
1.1.1.2 ! misho     244:        size_t key_len, value_len;
        !           245:        char *value;
        !           246:        const char *key;
        !           247:        memcached_st *memc;
        !           248:        char *endptr;
        !           249:        long v;
1.1       misho     250: 
                    251:        if (!lua_islightuserdata(L, lua_upvalueindex(1))) {
                    252:                lua_pushstring(L, "where is my userdata ?");
                    253:                lua_error(L);
                    254:        }
                    255: 
1.1.1.2 ! misho     256:        memc = lua_touserdata(L, lua_upvalueindex(1));
1.1       misho     257: 
1.1.1.2 ! misho     258:        if (1 != lua_gettop(L)) {
1.1       misho     259:                lua_pushstring(L, "expected one argument");
                    260:                lua_error(L);
                    261:        }
                    262: 
1.1.1.2 ! misho     263:        key = luaL_checklstring(L, 1, &key_len);
        !           264:        if (NULL == (value = memcached_get(memc, key, key_len, &value_len, NULL, NULL))) {
1.1       misho     265:                lua_pushnil(L);
                    266:                return 1;
                    267:        }
                    268: 
1.1.1.2 ! misho     269:        errno = 0;
        !           270:        v = strtol(value, &endptr, 10);
        !           271:        if (0 == errno && *endptr == '\0') {
        !           272:                lua_pushinteger(L, v);
        !           273:        } else {
        !           274:                lua_pushnil(L);
        !           275:        }
1.1       misho     276: 
1.1.1.2 ! misho     277:        free(value);
1.1       misho     278: 
                    279:        return 1;
                    280: }
                    281: #endif
                    282: 
                    283: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>