/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /*************************************************************************** * miav_daemon.cc * * Thu Jun 9 11:14:19 CEST 2005 * Copyright 2005 Bent Bisballe * deva@aasimon.org ****************************************************************************/ /* * This file is part of MIaV. * * MIaV 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. * * MIaV 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 MIaV; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ #include #include "miav_daemon.h" #include "info_console.h" #include "miav_config.h" #include "server.h" #include "socket.h" #include #include MiavDaemon::MiavDaemon() {} MiavDaemon::~MiavDaemon() {} int MiavDaemon::daemon_main() { MiavConfig cfg(ETC"/miav.conf", NULL); InfoConsole info(&cfg); config = new MiavConfig(ETC"/miav.conf", &info); int port = config->readInt("server_port"); pid_t childpid; // variable to store the child's pid signal(SIGCLD, SIG_IGN); // Ved SIGCHILD til IGNORE maa wait/waitpid ikke kaldes // (ellers kommer der kernel-brok) info.info("Starting MIaV server v. %s", VERSION); info.info("Listening on port %d", port); Socket *socket = new Socket(port, &info); if(socket->hasError()) { info.error("Listening socket has errors, quitting."); delete socket; return 1; } while(1) { Socket *csocket = new Socket(socket->slisten()); if(socket->hasError()) { info.error("Server socket has errors, quitting."); delete csocket; break; } if(csocket->hasError()) { info.error("Child socket has errors, quitting."); delete csocket; break; } if(!csocket->isConnected()) { info.error("Child socket is not connected, quitting."); delete csocket; break; } childpid = fork(); switch(childpid) { case -1: // fork() returns -1 on failure info.log("Fork error: %s", strerror(errno)); exit(1); case 0: // fork() returns 0 to the child process delete socket; // Close listen socket. newConnection(csocket, &info); delete csocket; // Close communication socket. exit(0); default: // fork() returns new pid to the parent process break; } } delete socket; return 0; }