#include #include #include #include #include #include "plop.h" /// Prints program usage to standard error. /// \param name Name of the executable from argv static void usage(char * name) { // TODO: Extend command line interface with e.g. getopt. dprintf(2, "Usage: %s \n", name); } /// 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) { usage(argv[0]); return 1; // TODO: Handle errors properly in main(). } if (LUA_OK != load_handler(L, argv[2])) { return 2; } const int efd = epoll_create1(0); if (-1 == efd) { return 3; } struct epoll_event e; e.events = EPOLLIN; e.data.ptr = NULL; // TODO: Consider putting server's Lua state in here? const int server = make_server(NULL, argv[1]); // TODO: Check server's fd before ctl? if (-1 == epoll_ctl(efd, EPOLL_CTL_ADD, server, &e)) { return 4; } static const int MAX_EVENTS = 20; struct epoll_event events[MAX_EVENTS]; while (1) { int evc = epoll_wait(efd, events, MAX_EVENTS, -1); if (-1 == evc) { return 5; } for (int i = 0; i < evc; ++i) { if (NULL == events[i].data.ptr) { if (-1 == handle_server(L, efd, server)) { return 6; } } else { if (-1 == handle_client(L, &events[i])) { return 7; } } } } }