Subversion Repositories public

Rev

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