/mandos/release

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

« back to all changes in this revision

Viewing changes to plugin-runner.c

  • Committer: Björn Påhlsson
  • Date: 2008-08-24 23:13:57 UTC
  • mto: (237.7.1 mandos) (24.1.154 mandos)
  • mto: This revision was merged to the branch mainline in revision 102.
  • Revision ID: belorn@braxen-20080824231357-e304pw7ls2dnnvw5
* 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:
105
105
  if (new_plugin == NULL){
106
106
    return NULL;
107
107
  }
108
 
  char *copy_name = strdup(name);
109
 
  if(copy_name == NULL){
110
 
    return NULL;
 
108
  char *copy_name = NULL;
 
109
  if(name != NULL){
 
110
    copy_name = strdup(name);
 
111
    if(copy_name == NULL){
 
112
      return NULL;
 
113
    }
111
114
  }
112
115
  
113
116
  *new_plugin = (plugin) { .name = copy_name,
118
121
  
119
122
  new_plugin->argv = malloc(sizeof(char *) * 2);
120
123
  if (new_plugin->argv == NULL){
 
124
    free(copy_name);
121
125
    free(new_plugin);
122
126
    return NULL;
123
127
  }
126
130
 
127
131
  new_plugin->environ = malloc(sizeof(char *));
128
132
  if(new_plugin->environ == NULL){
 
133
    free(copy_name);
129
134
    free(new_plugin->argv);
130
135
    free(new_plugin);
131
136
    return NULL;
194
199
 
195
200
process *process_list = NULL;
196
201
 
197
 
/* Mark a process as completed when it exits, and save its exit
 
202
/* Mark processes as completed when it exits, and save its exit
198
203
   status. */
199
204
void handle_sigchld(__attribute__((unused)) int sig){
200
205
  process *proc = process_list;
201
 
  int status;
202
 
  pid_t pid = wait(&status);
203
 
  if(pid == -1){
204
 
    perror("wait");
205
 
    return;
206
 
  }
207
 
  while(proc != NULL and proc->pid != pid){
208
 
    proc = proc->next;
209
 
  }
210
 
  if(proc == NULL){
211
 
    /* Process not found in process list */
212
 
    return;
213
 
  }
214
 
  proc->status = status;
215
 
  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
  }
216
229
}
217
230
 
218
231
bool print_out_password(const char *buffer, size_t length){
247
260
    return NULL;
248
261
  }
249
262
  argv[*argc-1] = arg;
250
 
  argv[*argc] = NULL;   
 
263
  argv[*argc] = NULL;
251
264
  return argv;
252
265
}
253
266
 
254
267
static void free_plugin_list(plugin *plugin_list){
255
 
  for(plugin *next = plugin_list; plugin_list != NULL; plugin_list = next){
 
268
  for(plugin *next; plugin_list != NULL; plugin_list = next){
256
269
    next = plugin_list->next;
257
 
    free(plugin_list->name);
258
270
    for(char **arg = plugin_list->argv; *arg != NULL; arg++){
259
271
      free(*arg);
260
 
    }    
 
272
    }
261
273
    free(plugin_list->argv);
262
274
    for(char **env = plugin_list->environ; *env != NULL; env++){
263
275
      free(*env);
264
276
    }
265
277
    free(plugin_list->environ);
266
278
    free(plugin_list);
267
 
  }  
 
279
  }
268
280
}
269
281
 
270
282
int main(int argc, char *argv[]){
298
310
  ret = sigaction(SIGCHLD, &sigchld_action, &old_sigchld_action);
299
311
  if(ret == -1){
300
312
    perror("sigaction");
301
 
    exitstatus = EXIT_FAILURE;    
 
313
    exitstatus = EXIT_FAILURE;
302
314
    goto fallback;
303
315
  }
304
316
  
680
692
      }
681
693
    }
682
694
    
683
 
    int pipefd[2]; 
 
695
    int pipefd[2];
684
696
    ret = pipe(pipefd);
685
697
    if (ret == -1){
686
698
      perror("pipe");
787
799
  }
788
800
  
789
801
  free_plugin_list(plugin_list);
 
802
  plugin_list = NULL;
790
803
  
791
804
  closedir(dir);
792
805
  dir = NULL;