summaryrefslogblamecommitdiffstats
path: root/ldadp.c
blob: 9c9a57977076d96346e30ec900062f85e65e7ae9 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12











                   
                   









                                                                                
                                 




















































                                                                                                           


                                                       







                                                   
#include "types.h"
#include "epoll.h"
#include "client.h"
#include "server.h"
#include "proxy.h"
#include "ini.h"
#include "helper.h"
#include <stdio.h>
#include <socket.h>
#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>

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();
	// 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) {
		server_setHomeTemplate(section, value);
	}
	return 1;
}

static void loadConfig(char *file)
{
	ini_parse(file, &loadConfig_handler, NULL);
}