#include #include #include #include #include #include #include #include #include #include "ConfigFile.h" #include "daemon.h" #include "common.h" #include "Logger.h" using namespace std; void signal_handler(int sig) { switch (sig) { case SIGHUP: Logger::logMessage("hangup signal catched"); break; case SIGTERM: Logger::logMessage("terminate signal catched...exiting"); Common::instance()->mainContinue = false; break; default: std::stringstream ss; ss << "Received unknown signal: " << sig; Logger::logMessage(ss.str()); break; } } void lookup_uid_values() { Common* cmn = Common::instance(); std::string userstr = cmn->GetConfigfile()->GetValue("smsdaemon","user"); std::string groupstr = cmn->GetConfigfile()->GetValue("smsdaemon","group"); passwd* pass = getpwnam(userstr.c_str()); if (pass != 0) { cmn->uid = pass->pw_uid; } else { Logger::logMessage( string("could not lookup userid: ") + userstr ); exit(1); } group* grp = getgrnam(groupstr.c_str() ); if (grp != 0) { cmn->gid = grp->gr_gid; } else { Logger::logMessage( string("could not lookup groupid: ") + groupstr ); exit(1); } } void daemonCleanup() { unlink( Common::instance()->pidfile.c_str() ); } void daemonize() { int i, lfp; char str[10]; Common* cmn = Common::instance(); if (getuid() != 0) { cout << "Please start this daemon as root\n" << endl; daemon_shutdown(0); } if (getppid() == 1) /* already a daemon */ return; i=fork(); if (i<0) /* fork error */ daemon_shutdown(FORK_ERROR); if (i>0) /* parent exits */ daemon_shutdown(0); /* child daemon continues */ setsid(); /* obtain a new process group */ for (i=getdtablesize(); i>=0; --i) close(i); /*close all descriptors*/ i=open("/dev/null", O_RDWR); /* handle std. io */ dup(i); dup(i); umask(027); /* set newly created file permissions */ chdir("/tmp"); /* change running directory*/ /*attempt to create lockfile and put a file-lock on it*/ lfp=open(cmn->pidfile.c_str(), O_RDWR|O_CREAT, 0640); if (lfp<0) /* can not open */ daemon_shutdown(CANT_OPEN_LOCK); if (lockf(lfp,F_TLOCK,0) < 0) /* can not lock */ daemon_shutdown(ALREADY_LOCKED); /* first instance continues */ sprintf(str, "%d\n", getpid() ); /* record pid to lockfile */ write(lfp, str, strlen(str) ); //signal(SIGCHLD, SIG_IGN); /* ignore child */ signal(SIGTSTP, SIG_IGN); /* ignore tty signals */ signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGHUP, signal_handler); /* catch hangup signal */ signal(SIGTERM, signal_handler); /* catch kill signal */ signal(SIGINT, signal_handler); /* keyboard interrupt */ signal(SIGQUIT, signal_handler); /* QUIT */ /*this program is now a daemon*/ setegid( cmn->gid ); seteuid( cmn->uid ); }