Rev 45 | Rev 51 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 45 | Rev 47 | ||
---|---|---|---|
Line 15... | Line 15... | ||
15 | 15 | ||
16 | 16 | ||
17 | #include <pwd.h>
|
17 | #include <pwd.h>
|
18 | #include <syslog.h>
|
18 | #include <syslog.h>
|
19 | #include <errno.h>
|
19 | #include <errno.h>
|
- | 20 | #include <sys/wait.h>
|
|
20 | 21 | ||
21 | #include "usertable.h"
|
22 | #include "usertable.h"
|
22 | 23 | ||
23 | 24 | ||
- | 25 | PROC_LIST UserTable::s_procList; |
|
- | 26 | ||
- | 27 | ||
- | 28 | void on_proc_done(InotifyWatch* pW) |
|
- | 29 | {
|
|
- | 30 | pW->SetEnabled(true); |
|
- | 31 | }
|
|
- | 32 | ||
- | 33 | ||
24 | EventDispatcher::EventDispatcher(Inotify* pIn) |
34 | EventDispatcher::EventDispatcher(Inotify* pIn) |
25 | {
|
35 | {
|
26 | m_pIn = pIn; |
36 | m_pIn = pIn; |
27 | }
|
37 | }
|
28 | 38 | ||
Line 102... | Line 112... | ||
102 | 112 | ||
103 | int cnt = m_tab.GetCount(); |
113 | int cnt = m_tab.GetCount(); |
104 | for (int i=0; i<cnt; i++) { |
114 | for (int i=0; i<cnt; i++) { |
105 | InCronTabEntry& rE = m_tab.GetEntry(i); |
115 | InCronTabEntry& rE = m_tab.GetEntry(i); |
106 | InotifyWatch* pW = new InotifyWatch(rE.GetPath(), rE.GetMask()); |
116 | InotifyWatch* pW = new InotifyWatch(rE.GetPath(), rE.GetMask()); |
- | 117 | try { |
|
107 | m_pIn->Add(pW); |
118 | m_pIn->Add(pW); |
108 | m_pEd->Register(pW, this); |
119 | m_pEd->Register(pW, this); |
109 | m_map.insert(IWCE_MAP::value_type(pW, &rE)); |
120 | m_map.insert(IWCE_MAP::value_type(pW, &rE)); |
- | 121 | } catch (InotifyException e) { |
|
- | 122 | syslog(LOG_ERR, "cannot create watch for user %s", m_user.c_str()); |
|
- | 123 | delete pW; |
|
- | 124 | }
|
|
110 | }
|
125 | }
|
111 | }
|
126 | }
|
112 | 127 | ||
113 | void UserTable::Dispose() |
128 | void UserTable::Dispose() |
114 | {
|
129 | {
|
Line 173... | Line 188... | ||
173 | return; |
188 | return; |
174 | }
|
189 | }
|
175 | 190 | ||
176 | syslog(LOG_INFO, "(%s) CMD (%s)", m_user.c_str(), cmd.c_str()); |
191 | syslog(LOG_INFO, "(%s) CMD (%s)", m_user.c_str(), cmd.c_str()); |
177 | 192 | ||
- | 193 | if (pE->IsNoLoop()) |
|
- | 194 | pW->SetEnabled(false); |
|
- | 195 | ||
- | 196 | ProcData_t pd;
|
|
178 | pid_t pid = fork(); |
197 | pd.pid = fork(); |
179 | if (pid == 0) { |
198 | if (pd.pid == 0) { |
180 | 199 | ||
181 | struct passwd* pwd = getpwnam(m_user.c_str()); |
200 | struct passwd* pwd = getpwnam(m_user.c_str()); |
182 | if (pwd == NULL) |
201 | if (pwd == NULL) |
183 | _exit(1); |
202 | _exit(1); |
184 | 203 | ||
Line 187... | Line 206... | ||
187 | 206 | ||
188 | if (execvp(argv[0], argv) != 0) { |
207 | if (execvp(argv[0], argv) != 0) { |
189 | _exit(1); |
208 | _exit(1); |
190 | }
|
209 | }
|
191 | }
|
210 | }
|
192 | else if (pid > 0) { |
211 | else if (pd.pid > 0) { |
- | 212 | if (pE->IsNoLoop()) { |
|
- | 213 | pd.onDone = on_proc_done; |
|
- | 214 | pd.pWatch = pW; |
|
- | 215 | }
|
|
- | 216 | else { |
|
- | 217 | pd.onDone = NULL; |
|
- | 218 | pd.pWatch = NULL; |
|
- | 219 | }
|
|
193 | 220 | ||
- | 221 | s_procList.push_back(pd); |
|
194 | }
|
222 | }
|
195 | else { |
223 | else { |
- | 224 | if (pE->IsNoLoop()) |
|
- | 225 | pW->SetEnabled(true); |
|
- | 226 | ||
196 | syslog(LOG_ERR, "cannot fork process: %s", strerror(errno)); |
227 | syslog(LOG_ERR, "cannot fork process: %s", strerror(errno)); |
197 | }
|
228 | }
|
198 | }
|
229 | }
|
199 | 230 | ||
200 | InCronTabEntry* UserTable::FindEntry(InotifyWatch* pWatch) |
231 | InCronTabEntry* UserTable::FindEntry(InotifyWatch* pWatch) |
Line 232... | Line 263... | ||
232 | }
|
263 | }
|
233 | 264 | ||
234 | return true; |
265 | return true; |
235 | }
|
266 | }
|
236 | 267 | ||
- | 268 | void UserTable::FinishDone() |
|
- | 269 | {
|
|
- | 270 | PROC_LIST::iterator it = s_procList.begin(); |
|
- | 271 | while (it != s_procList.end()) { |
|
- | 272 | ProcData_t& pd = *it; |
|
- | 273 | int status = 0; |
|
- | 274 | int res = waitpid(pd.pid, &status, WNOHANG); |
|
- | 275 | if (res == pd.pid && (WIFEXITED(status) || WIFSIGNALED(status))) { |
|
- | 276 | if (pd.onDone != NULL) |
|
- | 277 | (*pd.onDone)(pd.pWatch); |
|
- | 278 | it = s_procList.erase(it); |
|
- | 279 | }
|
|
- | 280 | else { |
|
- | 281 | it++; |
|
- | 282 | }
|
|
- | 283 | }
|
|
- | 284 | }
|
|
- | 285 | ||
- | 286 |