/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to plugin-runner.c

* plugin-runner.c (handle_sigchld): Loop until all exited children
                                    have been wait()ed for.

Show diffs side-by-side

added added

removed removed

Lines of Context:
199
199
 
200
200
process *process_list = NULL;
201
201
 
202
 
/* Mark a process as completed when it exits, and save its exit
 
202
/* Mark processes as completed when it exits, and save its exit
203
203
   status. */
204
204
void handle_sigchld(__attribute__((unused)) int sig){
205
205
  process *proc = process_list;
206
 
  int status;
207
 
  pid_t pid = wait(&status);
208
 
  if(pid == -1){
209
 
    perror("wait");
210
 
    return;
211
 
  }
212
 
  while(proc != NULL and proc->pid != pid){
213
 
    proc = proc->next;
214
 
  }
215
 
  if(proc == NULL){
216
 
    /* Process not found in process list */
217
 
    return;
218
 
  }
219
 
  proc->status = status;
220
 
  proc->completed = true;
 
206
  while(true){
 
207
    int status;
 
208
    pid_t pid = waitpid(-1, &status, WNOHANG);
 
209
    if(pid == 0){
 
210
      break;
 
211
    }
 
212
    if(pid == -1){
 
213
      if (errno != ECHILD){
 
214
        perror("waitpid");
 
215
      }
 
216
      return;
 
217
    }
 
218
 
 
219
    while(proc != NULL and proc->pid != pid){
 
220
      proc = proc->next;
 
221
    }
 
222
    if(proc == NULL){
 
223
      /* Process not found in process list */
 
224
      continue;
 
225
    }
 
226
    proc->status = status;
 
227
    proc->completed = true;
 
228
  }
221
229
}
222
230
 
223
231
bool print_out_password(const char *buffer, size_t length){