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