summaryrefslogtreecommitdiffabout
path: root/src
Side-by-side diff
Diffstat (limited to 'src') (more/less context) (ignore whitespace changes)
-rw-r--r--src/process.cc14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/process.cc b/src/process.cc
index 96c874f..6d3b2a2 100644
--- a/src/process.cc
+++ b/src/process.cc
@@ -86,30 +86,32 @@ void process::launch(const string& id,configuration& config) {
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(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(!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 };
close(0); close(1); close(2);
execv("/bin/sh",argv);