/** * \file * * \author Georg Hopp * * \copyright * Copyright (C) 2012 Georg Hopp * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include "class.h" #include "server.h" #include "socket.h" #include "logger.h" #include "interface/class.h" #include "utils/memory.h" static int serverCtor(void * _this, va_list * params) { Server this = _this; in_port_t port; unsigned int backlog; int flags; this->max_fds = sysconf(_SC_OPEN_MAX); if (this->max_fds <= 10) { // reserve 10 handles for internal use. /** * \todo some logging would be appropriate :) */ return -1; } this->max_fds -= 10; this->logger = va_arg(* params, Logger); this->worker = va_arg(* params, void *); port = va_arg(* params, int); backlog = va_arg(* params, unsigned int); this->fds = calloc(sizeof(struct pollfd), this->max_fds); this->conns = calloc(sizeof(struct conns), this->max_fds); this->sock = new(Sock, this->logger, port); flags = fcntl(this->sock->handle, F_GETFL, 0); fcntl(this->sock->handle, F_SETFL, flags | O_NONBLOCK); socketListen(this->sock, backlog); (this->fds)[0].fd = this->sock->handle; (this->fds)[0].events = POLLIN; this->nfds = 1; return 0; } static void serverDtor(void * _this) { Server this = _this; int i; for (i=0; infds; i++) { if (this->sock->handle != (this->fds)[i].fd) { delete((this->conns[(this->fds)[i].fd]).sock); delete((this->conns[(this->fds)[i].fd]).worker); } } FREE(this->fds); FREE(this->conns); delete(this->sock); } INIT_IFACE(Class, serverCtor, serverDtor, NULL); CREATE_CLASS(Server, NULL, IFACE(Class)); // vim: set ts=4 sw=4: