summaryrefslogtreecommitdiffhomepage
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..af36c5d
--- /dev/null
+++ b/main.c
@@ -0,0 +1,58 @@
+#include <poll.h>
+#include <string.h>
+
+#include <lauxlib.h>
+#include <lua.h>
+#include <lualib.h>
+
+#include "plop.h"
+
+/// Standard entry point for the program.
+/// \param argc Argument count
+/// \param argv Argument array
+/// \return Error code
+int main(int argc, char ** argv)
+{
+ lua_State * L = luaL_newstate();
+ luaL_openlibs(L);
+
+ if (3 != argc)
+ {
+ return 1; // TODO: Document error codes/print usage information
+ }
+
+ if (LUA_OK != luaL_dofile(L, argv[2]))
+ {
+ return 2; // TODO: Document error codes/print usage information
+ }
+
+ static const int max_clients = 200;
+
+ int fdc = 0;
+ struct request * requests[max_clients];
+ struct pollfd fdv[max_clients];
+
+ memset(requests, 0, sizeof(requests));
+ memset(fdv, 0, sizeof(fdv));
+
+ fdv[0].fd = make_server(NULL, argv[1]);
+ fdv[0].events = POLLIN;
+ fdc++;
+
+ if (-1 == fdv[0].fd)
+ {
+ return 1; // TODO: Document error codes/print usage information
+ }
+
+ while (0 < fdc && -1 != poll(fdv, fdc, -1))
+ {
+ int shift_by = 0;
+
+ for (int i = 1; i < fdc; ++i)
+ {
+ shift_by = handle_client(L, &fdv[i], &requests[i], shift_by);
+ }
+
+ fdc = handle_server(fdv, fdc - shift_by, max_clients);
+ }
+}