added lighty.stat() which uses the stat-cache to reduce the number of syscalls
git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.x@1377 152afb58-edef-0310-8abb-c4023f1b3aa9svn/tags/lighttpd-1.4.13
parent
0780de8bfa
commit
bf0f7832c1
|
@ -14,6 +14,7 @@
|
|||
#include "response.h"
|
||||
#include "stat_cache.h"
|
||||
#include "status_counter.h"
|
||||
#include "etag.h"
|
||||
|
||||
#ifdef HAVE_LUA_H
|
||||
#include <lua.h>
|
||||
|
@ -172,6 +173,71 @@ static int magnet_print(lua_State *L) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int magnet_stat(lua_State *L) {
|
||||
const char *s = luaL_checkstring(L, 1);
|
||||
server *srv;
|
||||
connection *con;
|
||||
buffer sb, *b;
|
||||
stat_cache_entry *sce = NULL;
|
||||
|
||||
lua_pushstring(L, "lighty.srv");
|
||||
lua_gettable(L, LUA_REGISTRYINDEX);
|
||||
srv = lua_touserdata(L, -1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
lua_pushstring(L, "lighty.con");
|
||||
lua_gettable(L, LUA_REGISTRYINDEX);
|
||||
con = lua_touserdata(L, -1);
|
||||
lua_pop(L, 1);
|
||||
|
||||
sb.ptr = (char *)s;
|
||||
sb.used = sb.size = strlen(s) + 1;
|
||||
|
||||
if (HANDLER_GO_ON != stat_cache_get_entry(srv, con, &sb, &sce)) {
|
||||
lua_pushnil(L);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
lua_newtable(L);
|
||||
lua_pushinteger(L, sce->st.st_mode);
|
||||
lua_setfield(L, -2, "st_mode");
|
||||
|
||||
lua_pushinteger(L, sce->st.st_mtime);
|
||||
lua_setfield(L, -2, "st_mtime");
|
||||
|
||||
lua_pushinteger(L, sce->st.st_ctime);
|
||||
lua_setfield(L, -2, "st_ctime");
|
||||
|
||||
lua_pushinteger(L, sce->st.st_atime);
|
||||
lua_setfield(L, -2, "st_atime");
|
||||
|
||||
lua_pushinteger(L, sce->st.st_uid);
|
||||
lua_setfield(L, -2, "st_uid");
|
||||
|
||||
lua_pushinteger(L, sce->st.st_gid);
|
||||
lua_setfield(L, -2, "st_gid");
|
||||
|
||||
lua_pushinteger(L, sce->st.st_size);
|
||||
lua_setfield(L, -2, "st_size");
|
||||
|
||||
lua_pushinteger(L, sce->st.st_ino);
|
||||
lua_setfield(L, -2, "st_ino");
|
||||
|
||||
/* we have to mutate the etag */
|
||||
|
||||
b = buffer_init();
|
||||
etag_mutate(b, sce->etag);
|
||||
|
||||
lua_pushlstring(L, b->ptr, b->used - 1);
|
||||
lua_setfield(L, -2, "etag");
|
||||
|
||||
buffer_free(b);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int magnet_atpanic(lua_State *L) {
|
||||
const char *s = luaL_checkstring(L, 1);
|
||||
server *srv;
|
||||
|
@ -297,6 +363,7 @@ static buffer *magnet_env_get_buffer(server *srv, connection *con, const char *k
|
|||
{ NULL, MAGNET_ENV_UNSET }
|
||||
};
|
||||
|
||||
UNUSED(srv);
|
||||
|
||||
/**
|
||||
* map all internal variables to lua
|
||||
|
@ -388,6 +455,7 @@ static int magnet_env_set(lua_State *L) {
|
|||
|
||||
|
||||
static int magnet_copy_response_header(server *srv, connection *con, plugin_data *p, lua_State *L) {
|
||||
UNUSED(p);
|
||||
/**
|
||||
* get the environment of the function
|
||||
*/
|
||||
|
@ -436,6 +504,7 @@ static int magnet_copy_response_header(server *srv, connection *con, plugin_data
|
|||
* return 200
|
||||
*/
|
||||
static int magnet_attach_content(server *srv, connection *con, plugin_data *p, lua_State *L) {
|
||||
UNUSED(p);
|
||||
/**
|
||||
* get the environment of the function
|
||||
*/
|
||||
|
@ -623,6 +692,9 @@ static handler_t magnet_attract(server *srv, connection *con, plugin_data *p, bu
|
|||
lua_pushinteger(L, MAGNET_RESTART_REQUEST);
|
||||
lua_setfield(L, -2, "RESTART_REQUEST");
|
||||
|
||||
lua_pushcfunction(L, magnet_stat); /* (sp += 1) */
|
||||
lua_setfield(L, -2, "stat"); /* -1 is the env we want to set (sp -= 1) */
|
||||
|
||||
lua_setfield(L, -2, "lighty"); /* lighty.* (sp -= 1) */
|
||||
|
||||
lua_newtable(L); /* the meta-table for the new env (sp += 1) */
|
||||
|
|
Loading…
Reference in New Issue