summaryrefslogblamecommitdiffstats
path: root/ldadp.c
blob: 4d481df819fc34c329f5b22d4614df34caf70558 (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>
#include <unistd.h>

static void listen_callback(void *data, int haveIn, int haveOut, int doCleanup);
static void loadConfig(char *file);

static int localPort = 1234;

int main(int argc, char **argv)
{
	BOOL isdaemon = TRUE;
	if (argc < 2) {
		printf("Nö\n");
		exit(1);
	}
	signal(SIGPIPE, SIG_IGN);
	if (strcmp(argv[1], "-n") == 0 && argc > 2) {
		isdaemon = FALSE;
		argv++;
		argc--;
	}
	loadConfig(argv[1]);
	if (localPort < 1 || localPort > 65535) bail("Invalid port given in config");
	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, localPort) == -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
	if (!server_initServers())
		exit(1);
	// Daeaeaemon
	if (isdaemon && 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);
	}
	if (strcmp(key, "port") == 0) {
		localPort = atoi(value);
	}
	return 1;
}

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