/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * server.cc * * Wed Aug 22 12:16:03 CEST 2007 * Copyright 2007 Bent Bisballe Nyeng, Lars Bisballe Jensen and Peter Skaarup * deva@aasimon.org, elsenator@gmail.com and piparum@piparum.dk ****************************************************************************/ /* * This file is part of Pracro. * * Pracro 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 2 of the License, or * (at your option) any later version. * * Pracro 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 Pracro; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include "server.h" #include "tcpsocket.h" #include #include // For fork #include #include #include "configuration.h" static void connection(Pentominos::TCPSocket &socket) { printf("Got connection...\n"); } void server() { int port; try { port = Pentominos::config()->lookup("port"); } catch( ... ) { fprintf(stderr, "Could not read port."); return; } Pentominos::TCPSocket *socket; try { socket = new Pentominos::TCPSocket(); socket->listen(port); } catch (Pentominos::Exception &e) { fprintf(stderr, "Error during parsing:\n%s\n", e.what()); delete socket; return; } while(socket->connected()) { { // Reload if new port i assigned. int old_port = port; try { port = Pentominos::config()->lookup("port"); } catch( ... ) { fprintf(stderr, "Could not read port."); return; } if(port != old_port) { // Start listening on the new port delete socket; socket = new Pentominos::TCPSocket(); socket->listen(port); } } Pentominos::TCPSocket child = socket->accept(); if(child.connected()) { switch(fork()) { case -1: // error fprintf(stderr, "Could not fork: %s\n", strerror(errno)); break; case 0: // child socket->disconnect(); connection(child); delete socket; return; default: // parent break; } } } delete socket; fprintf(stderr, "Oups... dropped out of the main loop\n"); }