/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

  • Committer: Teddy Hogeborn
  • Date: 2009-09-06 05:37:34 UTC
  • Revision ID: teddy@fukt.bsnet.se-20090906053734-uf180lq30ivv4nfy
* plugin-runner.c (getplugin, add_environment, main): Handle EINTR
                                                      properly.

* plugins.d/mandos-client.c (start_mandos_communication): Bug fix:
  move out "decrypted_buffer_size" to where it is needed.

* plugins.d/splashy.c (termination_handler): Save signal received.
  (main): Check return value from "sigaddset()".

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
#include <fcntl.h>              /* fcntl(), F_GETFD, F_SETFD,
55
55
                                   FD_CLOEXEC */
56
56
#include <string.h>             /* strsep, strlen(), asprintf(),
57
 
                                   strsignal(), strcmp(), strncmp() */
 
57
                                   strsignal() */
58
58
#include <errno.h>              /* errno */
59
59
#include <argp.h>               /* struct argp_option, struct
60
60
                                   argp_state, struct argp,
111
111
  }
112
112
  /* Create a new plugin */
113
113
  plugin *new_plugin = NULL;
114
 
  do {
 
114
  do{
115
115
    new_plugin = malloc(sizeof(plugin));
116
 
  } while(new_plugin == NULL and errno == EINTR);
 
116
  }while(new_plugin == NULL and errno == EINTR);
117
117
  if(new_plugin == NULL){
118
118
    return NULL;
119
119
  }
120
120
  char *copy_name = NULL;
121
121
  if(name != NULL){
122
 
    do {
 
122
    do{
123
123
      copy_name = strdup(name);
124
 
    } while(copy_name == NULL and errno == EINTR);
 
124
    }while(copy_name == NULL and errno == EINTR);
125
125
    if(copy_name == NULL){
126
126
      free(new_plugin);
127
127
      return NULL;
133
133
                          .disabled = false,
134
134
                          .next = plugin_list };
135
135
  
136
 
  do {
 
136
  do{
137
137
    new_plugin->argv = malloc(sizeof(char *) * 2);
138
 
  } while(new_plugin->argv == NULL and errno == EINTR);
 
138
  }while(new_plugin->argv == NULL and errno == EINTR);
139
139
  if(new_plugin->argv == NULL){
140
140
    free(copy_name);
141
141
    free(new_plugin);
144
144
  new_plugin->argv[0] = copy_name;
145
145
  new_plugin->argv[1] = NULL;
146
146
  
147
 
  do {
 
147
  do{
148
148
    new_plugin->environ = malloc(sizeof(char *));
149
 
  } while(new_plugin->environ == NULL and errno == EINTR);
 
149
  }while(new_plugin->environ == NULL and errno == EINTR);
150
150
  if(new_plugin->environ == NULL){
151
151
    free(copy_name);
152
152
    free(new_plugin->argv);
164
164
static bool add_to_char_array(const char *new, char ***array,
165
165
                              int *len){
166
166
  /* Resize the pointed-to array to hold one more pointer */
167
 
  do {
 
167
  do{
168
168
    *array = realloc(*array, sizeof(char *)
169
169
                     * (size_t) ((*len) + 2));
170
 
  } while(*array == NULL and errno == EINTR);
 
170
  }while(*array == NULL and errno == EINTR);
171
171
  /* Malloc check */
172
172
  if(*array == NULL){
173
173
    return false;
174
174
  }
175
175
  /* Make a copy of the new string */
176
176
  char *copy;
177
 
  do {
 
177
  do{
178
178
    copy = strdup(new);
179
 
  } while(copy == NULL and errno == EINTR);
 
179
  }while(copy == NULL and errno == EINTR);
180
180
  if(copy == NULL){
181
181
    return false;
182
182
  }
209
209
      /* It already exists */
210
210
      if(replace){
211
211
        char *new;
212
 
        do {
 
212
        do{
213
213
          new = realloc(*e, strlen(def) + 1);
214
 
        } while(new == NULL and errno == EINTR);
 
214
        }while(new == NULL and errno == EINTR);
215
215
        if(new == NULL){
216
216
          return false;
217
217
        }
634
634
        custom_argv[custom_argc] = NULL;
635
635
      }
636
636
    }
637
 
    do {
 
637
    do{
638
638
      ret = fclose(conffp);
639
 
    } while(ret == EOF and errno == EINTR);
 
639
    }while(ret == EOF and errno == EINTR);
640
640
    if(ret == EOF){
641
641
      perror("fclose");
642
642
      exitstatus = EXIT_FAILURE;
726
726
  
727
727
  /* Read and execute any executable in the plugin directory*/
728
728
  while(true){
729
 
    do {
 
729
    do{
730
730
      dirst = readdir(dir);
731
 
    } while(dirst == NULL and errno == EINTR);
 
731
    }while(dirst == NULL and errno == EINTR);
732
732
    
733
733
    /* All directory entries have been processed */
734
734
    if(dirst == NULL){
770
770
      for(const char **suf = bad_suffixes; *suf != NULL; suf++){
771
771
        size_t suf_len = strlen(*suf);
772
772
        if((d_name_len >= suf_len)
773
 
           and (strcmp((dirst->d_name) + d_name_len-suf_len, *suf)
 
773
           and (strcmp((dirst->d_name)+d_name_len-suf_len, *suf)
774
774
                == 0)){
775
775
          if(debug){
776
776
            fprintf(stderr, "Ignoring plugin dir entry \"%s\""
890
890
    }
891
891
    /* Starting a new process to be watched */
892
892
    pid_t pid;
893
 
    do {
 
893
    do{
894
894
      pid = fork();
895
 
    } while(pid == -1 and errno == EINTR);
 
895
    }while(pid == -1 and errno == EINTR);
896
896
    if(pid == -1){
897
897
      perror("fork");
898
898
      exitstatus = EXIT_FAILURE;
1159
1159
  }
1160
1160
  
1161
1161
  /* Wait for any remaining child processes to terminate */
1162
 
  do {
 
1162
  do{
1163
1163
    ret = wait(NULL);
1164
1164
  } while(ret >= 0);
1165
1165
  if(errno != ECHILD){