summaryrefslogtreecommitdiffhomepage
path: root/connection.c
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2020-08-24 19:42:00 +0200
committerAki <please@ignore.pl>2020-08-24 19:42:00 +0200
commitc47d4b2314b06f28cae47d4dd14ef4c9c5c1af60 (patch)
treeea5ede20a2674d865b28bbf5f121bd2da9779003 /connection.c
parentbeab4f743429525add08cd22341470c972cb01be (diff)
downloadplop-c47d4b2314b06f28cae47d4dd14ef4c9c5c1af60.zip
plop-c47d4b2314b06f28cae47d4dd14ef4c9c5c1af60.tar.gz
plop-c47d4b2314b06f28cae47d4dd14ef4c9c5c1af60.tar.bz2
Added connection stub
Diffstat (limited to 'connection.c')
-rw-r--r--connection.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/connection.c b/connection.c
new file mode 100644
index 0000000..c7dd151
--- /dev/null
+++ b/connection.c
@@ -0,0 +1,52 @@
+#include "connection.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <lauxlib.h>
+#include <lua.h>
+
+#include "request.h"
+
+/// Creates new connection.
+/// \param L Server's Lua state
+/// \param client File descriptor of client's socket
+/// \return Pointer to connection or NULL if an error occured
+struct connection * connection_new(lua_State * L, const int client)
+{
+ struct connection * c = malloc(sizeof(struct connection));
+
+ if (NULL == c)
+ {
+ return NULL;
+ }
+
+ memset(c, 0, sizeof(struct connection));
+
+ c->fd = client;
+ c->L = lua_newthread(L);
+ c->lua_ref = luaL_ref(L, LUA_REGISTRYINDEX);
+
+ return c;
+}
+
+/// Clears the state of connection readying it for new request.
+/// \param c Connection to clear
+void connection_clear(struct connection * c)
+{
+ if (NULL != c->request)
+ {
+ free_request(c->request);
+ }
+}
+
+/// Frees all resources associated with the connection.
+/// \param L Server's Lua state
+/// \param c Connection to free
+void connection_free(lua_State * L, struct connection * c)
+{
+ connection_clear(c);
+ luaL_unref(L, LUA_REGISTRYINDEX, c->lua_ref);
+ close(c->fd); // TODO: Check for errors in close()?
+ free(c);
+}