From 976707d45233f15bafb6d03f51cfd9f641583caf Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 20 Jul 2006 20:35:10 +0000 Subject: Added getopt Cleaned out the old daemon code. No need for it anymore. Added support for options using getopt - inspired by a patch supplied by Bertho Stultiens. Moved the daemon code to main, and rendered miav_damon unnecessary. --- server/Makefile.am | 2 - server/miav_daemon.cc | 110 ---------------------------------- server/miav_daemon.h | 42 ------------- server/miav_server.cc | 159 ++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 155 insertions(+), 158 deletions(-) delete mode 100644 server/miav_daemon.cc delete mode 100644 server/miav_daemon.h diff --git a/server/Makefile.am b/server/Makefile.am index c59223b..731ddce 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -14,7 +14,6 @@ miav_server_SOURCES = \ libfame_wrapper.cc \ liblame_wrapper.cc \ libmplex_wrapper.cc \ - miav_daemon.cc \ mov_encoder.cc \ mov_encoder_thread.cc \ mov_encoder_writer.cc \ @@ -36,7 +35,6 @@ EXTRA_DIST = \ libfame_wrapper.h \ liblame_wrapper.h \ libmplex_wrapper.h \ - miav_daemon.h \ mov_encoder.h \ mov_encoder_thread.h \ mov_encoder_writer.h \ diff --git a/server/miav_daemon.cc b/server/miav_daemon.cc deleted file mode 100644 index 8fc7144..0000000 --- a/server/miav_daemon.cc +++ /dev/null @@ -1,110 +0,0 @@ -/* -*- 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 Nyeng - * 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 config(ETC"/miav.conf"); - MIaV::initConfig(&config); - - InfoConsole info; - MIaV::initInfo(&info); - - int port = MIaV::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) - - MIaV::info->info("Starting MIaV server v. %s", VERSION); - MIaV::info->info("Listening on port %d", port); - Socket *socket = new Socket(port); - - if(socket->hasError()) { - MIaV::info->error("Listening socket has errors, quitting."); - delete socket; - return 1; - } - - while(1) { - Socket *csocket = new Socket(socket->slisten()); - - if(socket->hasError()) { - MIaV::info->error("Server socket has errors, quitting."); - delete csocket; - break; - } - - if(csocket->hasError()) { - MIaV::info->error("Child socket has errors, quitting."); - delete csocket; - break; - } - - if(!csocket->isConnected()) { - MIaV::info->error("Child socket is not connected, quitting."); - delete csocket; - break; - } - - childpid = fork(); - - switch(childpid) { - case -1: // fork() returns -1 on failure - MIaV::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); - delete csocket; // Close communication socket. - exit(0); - - default: // fork() returns new pid to the parent process - break; - } - } - - delete socket; - return 0; -} - diff --git a/server/miav_daemon.h b/server/miav_daemon.h deleted file mode 100644 index 6ab469e..0000000 --- a/server/miav_daemon.h +++ /dev/null @@ -1,42 +0,0 @@ -/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/*************************************************************************** - * miav_daemon.h - * - * 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 "config.h" -#ifndef __MIAV_MIAV_DAEMON_H__ -#define __MIAV_MIAV_DAEMON_H__ - -#include "daemon.h" - -class MiavDaemon: public Daemon { -public: - MiavDaemon(); - ~MiavDaemon(); - -private: - int daemon_main(); -}; - -#endif/*__MIAV_MIAV_DAEMON_H__*/ diff --git a/server/miav_server.cc b/server/miav_server.cc index 2005afd..b1dfcac 100644 --- a/server/miav_server.cc +++ b/server/miav_server.cc @@ -27,24 +27,175 @@ #include #include "miav_server.h" -#include "miav_daemon.h" #include "miav_config.h" #include "info_console.h" #include +#include + +#include "server.h" +#include "socket.h" + +#include +#include + +// For getpwent and getgrent +#include +#include +#include + +#ifdef HAVE_GETOPT_H +#include +#elif defined(HAVE_STDLIB_H) // Solaris has getopt() here +#include +#else +#error "Don't know where getopt() is prototyped" +#endif + +static const char usage_str[] = +"Usage: %s [options]\n" +"Options:\n" +" -c file Read configfile from 'file'\n" +" -i Run in interactive mode (non-background mode)\n" +" -h This message\n" +; + +static char *config_file = ETC"/miav.conf"; /** * This function starts the MIaV server. */ int main(int argc, char *argv[]) { - MiavDaemon daemon; + int optc; + int lose = 0; + bool interactive = false; + + // Parse the commandline + while((optc = getopt(argc, argv, "c:ih")) != EOF) { + switch(optc) { + case 'c': + config_file = strdup(optarg); + if(!config_file) { + fprintf(stderr, "Fatal: out of memory\n"); + return 1; + } + break; + case 'i': + interactive = true; + break; + case 'h': + fprintf(stdout, usage_str, argv[0]); + return 0; + default: + lose++; + break; + } + } + + if(lose) { + // Error message was printed by getopt + return 1; + } + + fprintf(stderr, "Using config file [%s]\n", config_file); + + MiavConfig cfg(config_file); + MIaV::initConfig(&cfg); - MiavConfig cfg(ETC"/miav.conf"); + InfoConsole info; + MIaV::initInfo(&info); string *user = cfg.readString("server_user"); string *group = cfg.readString("server_group"); + + // Fetch user id + int uid = -1; + struct passwd *p = getpwent(); + while(p) { + if(strcmp(p->pw_name, user->c_str()) == 0) uid = p->pw_uid; + p = getpwent(); + } + if(uid == -1) { + fprintf(stderr, "Could not find user \"%s\" in /etc/passwd file.\n", user->c_str()); + } + + // Fetch group id + int gid = -1; + struct group *g = getgrent(); + while(g) { + if(strcmp(g->gr_name, group->c_str()) == 0) gid = g->gr_gid; + g = getgrent(); + } + if(gid == -1) { + fprintf(stderr, "Could not find group \"%s\" in /etc/group file.\n", group->c_str()); + } + + if(!interactive) { + fprintf(stderr, "Entering daemon mode\n"); + daemon(0,0); + signal (SIGTERM, SIG_IGN); + signal (SIGINT, SIG_IGN); + signal (SIGHUP, SIG_IGN); + } else { + fprintf(stderr, "Running interactive\n"); + } + + int port = MIaV::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) + + MIaV::info->info("Starting MIaV server v. %s", VERSION); + MIaV::info->info("Listening on port %d", port); + Socket *socket = new Socket(port); + + if(socket->hasError()) { + MIaV::info->error("Listening socket has errors, quitting."); + delete socket; + return 1; + } + + while(1) { + Socket *csocket = new Socket(socket->slisten()); + + if(socket->hasError()) { + MIaV::info->error("Server socket has errors, quitting."); + delete csocket; + break; + } + + if(csocket->hasError()) { + MIaV::info->error("Child socket has errors, quitting."); + delete csocket; + break; + } + + if(!csocket->isConnected()) { + MIaV::info->error("Child socket is not connected, quitting."); + delete csocket; + break; + } + + childpid = fork(); + + switch(childpid) { + case -1: // fork() returns -1 on failure + MIaV::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); + delete csocket; // Close communication socket. + exit(0); + + default: // fork() returns new pid to the parent process + break; + } + } - return daemon.run(user->c_str(), group->c_str()); + delete socket; + return 0; } -- cgit v1.2.3