summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--src/dudki.cc2
-rw-r--r--src/process.cc3
2 files changed, 4 insertions, 1 deletions
diff --git a/src/dudki.cc b/src/dudki.cc
index 91a3342..1f95be4 100644
--- a/src/dudki.cc
+++ b/src/dudki.cc
@@ -1,39 +1,41 @@
#include <unistd.h>
#include <signal.h>
#include <syslog.h>
#include <errno.h>
#include <iostream>
#include <fstream>
#include <stdexcept>
+#include <cstring>
+#include <stdlib.h>
using namespace std;
#include "configuration.h"
#include "util.h"
#include "config.h"
#ifdef HAVE_GETOPT_H
# include <getopt.h>
#endif
#ifndef DEFAULT_CONF_FILE
# define DEFAULT_CONF_FILE "/etc/dudki.conf"
#endif
#define PHEADER PACKAGE " Version " VERSION
#define PCOPY "Copyright (c) 2004-2006 Klever Group"
bool finishing = false;
bool restarting = false;
static char **_argv = NULL;
static void lethal_signal_handler(int signum) {
syslog(LOG_NOTICE,"Lethal signal received. Terminating.");
finishing = true;
}
static void sighup_handler(int signum) {
syslog(LOG_NOTICE,"SUGHUP received, reloading.");
restarting = finishing = true;
}
void check_herd(configuration& config) {
process::prepare_herd();
for(processes_t::iterator i=config.processes.begin();i!=config.processes.end();++i)
diff --git a/src/process.cc b/src/process.cc
index 4807b98..3e9cc2b 100644
--- a/src/process.cc
+++ b/src/process.cc
@@ -1,41 +1,42 @@
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <pwd.h>
#include <grp.h>
#include <dirent.h>
#include <sys/wait.h>
#include <syslog.h>
+#include <stdlib.h>
#include <errno.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdexcept>
#include <string>
#include <vector>
using namespace std;
#include "process.h"
#include "configuration.h"
static multimap<string,pid_t> procpids;
void process::check() const {
if(!pidfile.empty()) {
signal(0);
}else if(!process_name.empty()) {
if(procpids.empty())
gather_proc_info();
if(procpids.find(process_name)==procpids.end())
throw runtime_error("no such process");
} // XXX: or else?
}
void process::check(const string& id,configuration& config) {
try {
check();
patience = 0;
}catch(exception& e) {
if(patience>60) { // TODO: configurable
patience = 0;
}else{
if(patience<10) { // TODO: configurable
@@ -83,65 +84,65 @@ void process::launch(const string& id,configuration& config) {
gid = gtmp->gr_gid;
}else{
errno = 0;
gid = strtol(group.c_str(),NULL,0);
if(errno)
throw runtime_error("Failed to reslove Group value to gid");
}
}
pid_t p = fork();
if(p<0)
throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to fork()");
if(!p) {
// child
try {
setsid();
if(!group.empty()) {
if(user.empty()) {
if((getgid()!=gid) && setgid(gid))
throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setgid()");
}else{
if(initgroups(user.c_str(),gid))
throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to initgroups()");
}
}
if(!chroot.empty()) {
if(::chroot(chroot.c_str()))
throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to chroot()");
}
if(!user.empty()) {
if((getuid()!=uid) && setuid(uid))
throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setuid()");
}
- char *argv[] = { "/bin/sh", "-c", (char*)restart_cmd.c_str(), NULL };
+ char *argv[] = { const_cast<char*>("/bin/sh"), const_cast<char*>("-c"), (char*)restart_cmd.c_str(), NULL };
close(0); close(1); close(2);
execv("/bin/sh",argv);
}catch(exception& e) {
syslog(LOG_ERR,"Error trying to launch process '%s': %s",id.c_str(),e.what());
}
_exit(-1);
}
// parent
int rv;
if(waitpid(p,&rv,0)<0)
throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to waitpid()");
}
void process::do_notify(const string& id,const string& event,const string& description,configuration& config) {
string the_notify;
if(!notify.empty())
the_notify=notify;
else if(!config.notify.empty())
the_notify=config.notify;
else
return;
try {
string::size_type colon = the_notify.find(':');
if(colon==string::npos)
throw runtime_error("invalid notify action specification");
string nschema = the_notify.substr(0,colon);
string ntarget = the_notify.substr(colon+1);
if(nschema=="mailto") {
notify_mailto(ntarget,id,event,description,config);
}else
throw runtime_error("unrecognized notification schema");
}catch(exception& e) {