diff options
author | Thomas Harning Jr <harningt@gmail.com> | 2007-09-07 00:34:10 -0400 |
---|---|---|
committer | Thomas Harning Jr <harningt@gmail.com> | 2007-09-07 00:34:10 -0400 |
commit | 90dd5e4f7e2461da3d36f5455ab2f2099f8e6c84 (patch) | |
tree | 1ac35d4681cd077e841719474b89688e366f24f7 /src | |
parent | a2741acddc500c191cdd934a6e8ce74efb9326e9 (diff) | |
download | luaevent-prosody-90dd5e4f7e2461da3d36f5455ab2f2099f8e6c84.tar.gz luaevent-prosody-90dd5e4f7e2461da3d36f5455ab2f2099f8e6c84.zip |
event_buffer learned how to read/write from/to sockets/file-descriptors
Diffstat (limited to 'src')
-rw-r--r-- | src/event_buffer.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/event_buffer.c b/src/event_buffer.c index ff3bad3..4d65273 100644 --- a/src/event_buffer.c +++ b/src/event_buffer.c @@ -2,6 +2,7 @@ * Licensed as LGPL - See doc/COPYING for details */ #include "event_buffer.h" +#include "luaevent.h" #include <lauxlib.h> #include <malloc.h> @@ -169,6 +170,46 @@ static int event_buffer_drain(lua_State* L) { return 0; } +/* LUA: buffer:write + (integer/lightuserdata fd) - Attempts to write all the data out to the FD + (socket) - Attempts to write all the data out to the socket object +*/ +static int event_buffer_write(lua_State* L) { + le_buffer* buf = event_buffer_check(L, 1); + int ret; + if(lua_isnumber(L, 2)) { + ret = evbuffer_write(buf->buffer, lua_tointeger(L, 2)); + } else if(lua_islightuserdata(L, 2)) { + ret = evbuffer_write(buf->buffer, (int)(long)lua_touserdata(L, 2)); + } else if(lua_isuserdata(L, 2)) { + ret = evbuffer_write(buf->buffer, getSocketFd(L, 2)); + } else { + luaL_argerror(L, 2, "Unexpected data type. Expects: integer/lightuserdata/socket"); + } + lua_pushinteger(L, ret); + return 1; +} + +/* LUA: buffer:read + (integer/lightuserdata fd, len) - Attempts to read up to 'len' out of the FD + (socket, len) - Attempts to read up to 'len' out of the socket object +*/ +static int event_buffer_read(lua_State* L) { + le_buffer* buf = event_buffer_check(L, 1); + int len = luaL_checkinteger(L, 3); + int ret; + if(lua_isnumber(L, 2)) { + ret = evbuffer_read(buf->buffer, lua_tointeger(L, 2), len); + } else if(lua_islightuserdata(L, 2)) { + ret = evbuffer_read(buf->buffer, (int)(long)lua_touserdata(L, 2), len); + } else if(lua_isuserdata(L, 2)) { + ret = evbuffer_read(buf->buffer, getSocketFd(L, 2), len); + } else { + luaL_argerror(L, 2, "Unexpected data type. Expects: integer/lightuserdata/socket"); + } + lua_pushinteger(L, ret); + return 1; +} static luaL_Reg buffer_funcs[] = { {"add", event_buffer_add}, {"length", event_buffer_get_length}, @@ -176,6 +217,8 @@ static luaL_Reg buffer_funcs[] = { {"readline", event_buffer_readline}, {"drain", event_buffer_drain}, {"close", event_buffer_gc}, + {"read", event_buffer_read}, + {"write", event_buffer_write}, {NULL, NULL} }; static luaL_Reg funcs[] = { |