#include "types.h" #include "epoll.h" #include "client.h" #include "server.h" #include "proxy.h" #include "ini.h" #include "helper.h" #include #include #include #include #include #include #include static void listen_callback(void *data, int haveIn, int haveOut, int doCleanup); static void loadConfig(char *file); int main(int argc, char **argv) { if (argc < 2) { printf("Nö\n"); exit(1); } signal(SIGPIPE, SIG_IGN); loadConfig(argv[1]); proxy_init(); char listen_addr[4] = {0, 0, 0, 0}; // Setup socket epoll_listen_t lsn; lsn.callback = &listen_callback; lsn.fd = socket_tcp4(); if (lsn.fd == -1) bail("Could not create listen socket"); if (socket_bind4_reuse(lsn.fd, listen_addr, 1234) == -1) bail("Could not bind to listening port"); if (socket_listen(lsn.fd, 10) == -1) bail("Could not listen"); // Setup epoll if (ePoll_init() == -1) bail("epoll_create failed"); // Add listener if (ePoll_add(EPOLLIN, (epoll_item_t*)&lsn) == -1) bail("Could not add listen socket to epoll fd"); // Init AD uplinks server_initServers(); // Daeaeaemon if (daemon(1, 0) == -1) bail("daemon() failed."); // Do the mainloop for (;;) { if (ePoll_wait(-1) == -1) bail("ePoll wait failed."); } return 0; } static void listen_callback(void *data, int haveIn, int haveOut, int doCleanup) { if (doCleanup) bail("doCleanup on Listen socket set."); if (!haveIn) return; epoll_listen_t *listen = (epoll_listen_t *)data; char remote[4]; uint16 port; int sock = socket_accept4(listen->fd, remote, &port); if (sock < 0) { printf("Error accepting new connection.\n"); return; } printf("Accepted connection.\n"); epoll_client_t *client = calloc(1, sizeof(epoll_client_t)); client->fd = sock; client->callback = &client_callback; ePoll_add(EPOLLIN | EPOLLOUT | EPOLLET, (epoll_item_t*)client); } static int loadConfig_handler(void *stuff, const char *section, const char *key, const char *value) { if (strcmp(key, "binddn") == 0) { server_setBind(section, value); } if (strcmp(key, "bindpw") == 0) { server_setPassword(section, value); } if (strcmp(key, "base") == 0) { server_setBase(section, value); } if (strcmp(key, "home") == 0 && *value != '\0') { server_setHomeTemplate(section, value); } return 1; } static void loadConfig(char *file) { ini_parse(file, &loadConfig_handler, NULL); }