summaryrefslogtreecommitdiffabout
path: root/src/process.cc
Unidiff
Diffstat (limited to 'src/process.cc') (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
@@ -66,70 +66,72 @@ void process::launch(const string& id,configuration& config) {
66 uid_t uid = (uid_t)-1; 66 uid_t uid = (uid_t)-1;
67 gid_t gid = (gid_t)-1; 67 gid_t gid = (gid_t)-1;
68 if(!user.empty()) { 68 if(!user.empty()) {
69 struct passwd *ptmp = getpwnam(user.c_str()); 69 struct passwd *ptmp = getpwnam(user.c_str());
70 if(ptmp) { 70 if(ptmp) {
71 uid = ptmp->pw_uid; 71 uid = ptmp->pw_uid;
72 gid = ptmp->pw_gid; 72 gid = ptmp->pw_gid;
73 }else{ 73 }else{
74 errno=0; 74 errno=0;
75 uid = strtol(user.c_str(),NULL,0); 75 uid = strtol(user.c_str(),NULL,0);
76 if(errno) 76 if(errno)
77 throw runtime_error("Failed to resolve User value to uid"); 77 throw runtime_error("Failed to resolve User value to uid");
78 } 78 }
79 } 79 }
80 if(!group.empty()) { 80 if(!group.empty()) {
81 struct group *gtmp = getgrnam(group.c_str()); 81 struct group *gtmp = getgrnam(group.c_str());
82 if(gtmp) { 82 if(gtmp) {
83 gid = gtmp->gr_gid; 83 gid = gtmp->gr_gid;
84 }else{ 84 }else{
85 errno = 0; 85 errno = 0;
86 gid = strtol(group.c_str(),NULL,0); 86 gid = strtol(group.c_str(),NULL,0);
87 if(errno) 87 if(errno)
88 throw runtime_error("Failed to reslove Group value to gid"); 88 throw runtime_error("Failed to reslove Group value to gid");
89 } 89 }
90 } 90 }
91 pid_t p = fork(); 91 pid_t p = fork();
92 if(p<0) 92 if(p<0)
93 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to fork()"); 93 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to fork()");
94 if(!p) { 94 if(!p) {
95 // child 95 // child
96 try { 96 try {
97 setsid(); 97 setsid();
98 if(user.empty()) { 98 if(!group.empty()) {
99 if((getgid()!=gid) && setgid(gid)) 99 if(user.empty()) {
100 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setgid()"); 100 if((getgid()!=gid) && setgid(gid))
101 }else{ 101 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setgid()");
102 if(initgroups(user.c_str(),gid)) 102 }else{
103 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to initgroups()"); 103 if(initgroups(user.c_str(),gid))
104 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to initgroups()");
105 }
104 } 106 }
105 if(!chroot.empty()) { 107 if(!chroot.empty()) {
106 if(::chroot(chroot.c_str())) 108 if(::chroot(chroot.c_str()))
107 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to chroot()"); 109 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to chroot()");
108 } 110 }
109 if(!user.empty()) { 111 if(!user.empty()) {
110 if((getuid()!=uid) && setuid(uid)) 112 if((getuid()!=uid) && setuid(uid))
111 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setuid()"); 113 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setuid()");
112 } 114 }
113 char *argv[] = { "/bin/sh", "-c", (char*)restart_cmd.c_str(), NULL }; 115 char *argv[] = { "/bin/sh", "-c", (char*)restart_cmd.c_str(), NULL };
114 close(0); close(1); close(2); 116 close(0); close(1); close(2);
115 execv("/bin/sh",argv); 117 execv("/bin/sh",argv);
116 }catch(exception& e) { 118 }catch(exception& e) {
117 syslog(LOG_ERR,"Error trying to launch process '%s': %s",id.c_str(),e.what()); 119 syslog(LOG_ERR,"Error trying to launch process '%s': %s",id.c_str(),e.what());
118 } 120 }
119 _exit(-1); 121 _exit(-1);
120 } 122 }
121 // parent 123 // parent
122 int rv; 124 int rv;
123 if(waitpid(p,&rv,0)<0) 125 if(waitpid(p,&rv,0)<0)
124 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to waitpid()"); 126 throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to waitpid()");
125} 127}
126 128
127void process::do_notify(const string& id,const string& event,const string& description,configuration& config) { 129void process::do_notify(const string& id,const string& event,const string& description,configuration& config) {
128 string the_notify; 130 string the_notify;
129 if(!notify.empty()) 131 if(!notify.empty())
130 the_notify=notify; 132 the_notify=notify;
131 else if(!config.notify.empty()) 133 else if(!config.notify.empty())
132 the_notify=config.notify; 134 the_notify=config.notify;
133 else 135 else
134 return; 136 return;
135 try { 137 try {