--- smsdaemon/daemon.cpp 2008/12/07 16:31:40 145 +++ smsdaemon/daemon.cpp 2008/12/07 20:06:12 146 @@ -5,6 +5,11 @@ #include #include +#include +#include +#include + + #include "daemon.h" #include "common.h" @@ -12,28 +17,57 @@ using namespace std; - + void signal_handler(int sig) { - switch(sig) { - case SIGHUP: - Common::instance()->logMessage("hangup signal catched"); - break; - - case SIGTERM: - Common::instance()->logMessage("terminate signal catched...exiting"); - Common::instance()->mainContinue = false; - break; + switch (sig) + { + case SIGHUP: + Common::instance()->logMessage("hangup signal catched"); + break; + + case SIGTERM: + Common::instance()->logMessage("terminate signal catched...exiting"); + Common::instance()->mainContinue = false; + break; } } +void lookup_uid_values() +{ + Common* cmn = Common::instance(); + + passwd* pass = getpwnam("smsdaemon"); + if (pass != 0) + { + cmn->uid = pass->pw_uid; + } + else + { + cmn->logMessage("could not lookup userid: smsdaemon"); + exit(1); + } + + group* grp = getgrnam("smsdaemon"); + if (grp != 0) + { + cmn->gid = grp->gr_gid; + } + else + { + cmn->logMessage("could not lookup groupid: smsdaemon"); + exit(1); + } +} + + void daemonCleanup() { unlink( Common::instance()->pidfile.c_str() ); } void daemonize() -{ +{ int i, lfp; char str[10]; Common* cmn = Common::instance(); @@ -44,38 +78,38 @@ 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); - + 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) ); @@ -84,7 +118,7 @@ signal(SIGTTOU, SIG_IGN); signal(SIGTTIN, SIG_IGN); signal(SIGHUP, signal_handler); /* catch hangup signal */ - signal(SIGTERM, signal_handler); /* catch kill signal */ + signal(SIGTERM, signal_handler); /* catch kill signal */ /*this program is now a daemon*/ setegid( cmn->gid );