-rw-r--r-- | src/process.cc | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/process.cc b/src/process.cc index fda35e8..bfab311 100644 --- a/src/process.cc +++ b/src/process.cc | |||
@@ -49,64 +49,67 @@ void process::check(const string& id,configuration& config) { | |||
49 | do_notify(id,"Giving up", | 49 | do_notify(id,"Giving up", |
50 | "After a number of attempts to relaunch the named process\n" | 50 | "After a number of attempts to relaunch the named process\n" |
51 | "It still seems to be down. Dudki is giving up attempts\n" | 51 | "It still seems to be down. Dudki is giving up attempts\n" |
52 | "to revive the process for a while.\n", | 52 | "to revive the process for a while.\n", |
53 | config); | 53 | config); |
54 | } | 54 | } |
55 | patience++; | 55 | patience++; |
56 | } | 56 | } |
57 | } | 57 | } |
58 | } | 58 | } |
59 | 59 | ||
60 | void process::launch(const string& id,configuration& config) { | 60 | void process::launch(const string& id,configuration& config) { |
61 | uid_t uid = 0; | 61 | uid_t uid = (uid_t)-1; |
62 | gid_t gid = (gid_t)-1; | ||
62 | if(!user.empty()) { | 63 | if(!user.empty()) { |
63 | struct passwd *ptmp = getpwnam(user.c_str()); | 64 | struct passwd *ptmp = getpwnam(user.c_str()); |
64 | if(ptmp) { | 65 | if(ptmp) { |
65 | uid = ptmp->pw_uid; | 66 | uid = ptmp->pw_uid; |
67 | gid = ptmp->pw_gid; | ||
66 | }else{ | 68 | }else{ |
67 | errno=0; | 69 | errno=0; |
68 | uid = strtol(user.c_str(),NULL,0); | 70 | uid = strtol(user.c_str(),NULL,0); |
69 | if(errno) | 71 | if(errno) |
70 | throw runtime_error("Failed to resolve User value to uid"); | 72 | throw runtime_error("Failed to resolve User value to uid"); |
71 | } | 73 | } |
72 | } | 74 | } |
73 | gid_t gid = 0; | ||
74 | if(!group.empty()) { | 75 | if(!group.empty()) { |
75 | struct group *gtmp = getgrnam(group.c_str()); | 76 | struct group *gtmp = getgrnam(group.c_str()); |
76 | if(gtmp) { | 77 | if(gtmp) { |
77 | gid = gtmp->gr_gid; | 78 | gid = gtmp->gr_gid; |
78 | }else{ | 79 | }else{ |
79 | errno = 0; | 80 | errno = 0; |
80 | gid = strtol(group.c_str(),NULL,0); | 81 | gid = strtol(group.c_str(),NULL,0); |
81 | if(errno) | 82 | if(errno) |
82 | throw runtime_error("Failed to reslove Group value to gid"); | 83 | throw runtime_error("Failed to reslove Group value to gid"); |
83 | } | 84 | } |
84 | } | 85 | } |
85 | pid_t p = fork(); | 86 | pid_t p = fork(); |
86 | if(p<0) | 87 | if(p<0) |
87 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to fork()"); | 88 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to fork()"); |
88 | if(!p) { | 89 | if(!p) { |
89 | // child | 90 | // child |
90 | try { | 91 | try { |
91 | setsid(); | 92 | setsid(); |
93 | if(user.empty()) { | ||
94 | if((getgid()!=gid) && setgid(gid)) | ||
95 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setgid()"); | ||
96 | }else{ | ||
97 | if(initgroups(user.c_str(),gid)) | ||
98 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to initgroups()"); | ||
99 | } | ||
92 | if(!chroot.empty()) { | 100 | if(!chroot.empty()) { |
93 | if(::chroot(chroot.c_str())) | 101 | if(::chroot(chroot.c_str())) |
94 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to chroot()"); | 102 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to chroot()"); |
95 | } | 103 | } |
96 | if(!group.empty()) { | ||
97 | // TODO: initgroups()? | ||
98 | if((getgid()!=gid) && setgid(gid)) | ||
99 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setgid()"); | ||
100 | } | ||
101 | if(!user.empty()) { | 104 | if(!user.empty()) { |
102 | if((getuid()!=uid) && setuid(uid)) | 105 | if((getuid()!=uid) && setuid(uid)) |
103 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setuid()"); | 106 | throw runtime_error(string(__PRETTY_FUNCTION__)+": failed to setuid()"); |
104 | } | 107 | } |
105 | char *argv[] = { "/bin/sh", "-c", (char*)restart_cmd.c_str(), NULL }; | 108 | char *argv[] = { "/bin/sh", "-c", (char*)restart_cmd.c_str(), NULL }; |
106 | close(0); close(1); close(2); | 109 | close(0); close(1); close(2); |
107 | execv("/bin/sh",argv); | 110 | execv("/bin/sh",argv); |
108 | }catch(exception& e) { | 111 | }catch(exception& e) { |
109 | syslog(LOG_ERR,"Error trying to launch process '%s': %s",id.c_str(),e.what()); | 112 | syslog(LOG_ERR,"Error trying to launch process '%s': %s",id.c_str(),e.what()); |
110 | } | 113 | } |
111 | _exit(-1); | 114 | _exit(-1); |
112 | } | 115 | } |