// Copyright (C) 2000-2002 Open Source Telecom Corporation. // // 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 2 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, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include #include #include "server.h" #include #include #ifdef CCXX_NAMESPACES namespace ost { using namespace std; #endif void server(void) { const char *reason = "exiting"; char *cp, *ep; std::fstream fifo; new RTPAudio; ::signal(SIGPIPE, SIG_IGN); int fd; char buf[256]; ::remove(".phonepid"); if(daemon) { close(0); close(1); close(2); Process::detach(); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); open("/dev/null", O_RDWR); slog.open("phone", Slog::classDaemon); slog.level(Slog::levelNotice); slog(Slog::levelNotice) << "daemon mode started" << std::endl; } else { slog.open("phone", Slog::classDaemon); slog.level(Slog::levelDebug); slog(Slog::levelNotice) << "server starting..." << std::endl; } snprintf(buf, 11, "%d", getpid()); fd = ::creat(".phonepid", 0660); if(fd > -1) { ::write(fd, buf, 10); ::close(fd); } fifo.open(".phonectrl", std::ios::in | std::ios::out); if(!fifo.is_open()) { slog(Slog::levelError) << "fifo failed; exiting" << std::endl; exit(-1); } rtp->startRunning(); // we assume it's always running while(!fifo.eof()) { fifo.getline(buf, 256); cp = buf; while(isspace(*cp)) ++cp; ep = strrchr(cp, '\n'); if(ep) *ep = 0; if(!*cp) continue; slog(Slog::levelDebug) << "fifo: " << cp << std::endl; if(!strnicmp(cp, "exit", 4)) break; } rtp->exit(reason); fifo.close(); slog(Slog::levelWarning) << "server exiting..." << std::endl; exit(0); } #ifdef CCXX_NAMESPACES }; #endif