event_buffer learned how to read/write from/to sockets/file-descriptors

Fri, 07 Sep 2007 00:34:10 -0400

author
Thomas Harning Jr <harningt@gmail.com>
date
Fri, 07 Sep 2007 00:34:10 -0400
changeset 34
64a79d8ee224
parent 33
0d750f302d66
child 35
4f81725a1e5f

event_buffer learned how to read/write from/to sockets/file-descriptors

include/luaevent.h file | annotate | diff | comparison | revisions
src/event_buffer.c file | annotate | diff | comparison | revisions
--- a/include/luaevent.h	Fri Sep 07 00:20:10 2007 -0400
+++ b/include/luaevent.h	Fri Sep 07 00:34:10 2007 -0400
@@ -15,6 +15,7 @@
 
 le_base* event_base_get(lua_State* L, int idx);
 void load_timeval(double time, struct timeval *tv);
+int getSocketFd(lua_State* L, int idx);
 
 int luaopen_luaevent(lua_State* L);
 
--- a/src/event_buffer.c	Fri Sep 07 00:20:10 2007 -0400
+++ b/src/event_buffer.c	Fri Sep 07 00:34:10 2007 -0400
@@ -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 @@
 	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 @@
 	{"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[] = {

mercurial