/* -*- 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 "miav_daemon.h" #include #include #include #include #include #include "miav_config.h" #include "server.h" #include "socket.h" MiavDaemon::MiavDaemon(int port) { this->port = port; } MiavDaemon::~MiavDaemon() {} int MiavDaemon::daemon_main() { 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(miav, "Starting MIaV server v. %s", VERSION); INFO(miav, "Listening on port %d", port); Socket *socket = new Socket(port); if(socket->hasError()) { ERR(miav, "Listening socket has errors, quitting."); delete socket; return 1; } while(1) { Socket *csocket = new Socket(socket->slisten()); if(socket->hasError()) { ERR(miav, "Server socket has errors, quitting."); delete csocket; break; } if(csocket->hasError()) { ERR(miav, "Child socket has errors, quitting."); delete csocket; break; } if(!csocket->isConnected()) { ERR(miav, "Child socket is not connected, quitting."); delete csocket; break; } childpid = fork(); switch(childpid) { case -1: // fork() returns -1 on failure ERR(miav, "Fork error: %s", strerror(errno)); exit(1); case 0: // fork() returns 0 to the child process delete socket; // Close listen socket. newConnection(csocket); delete csocket; // Close communication socket. exit(0); default: // fork() returns new pid to the parent process break; } } delete socket; return 0; }