/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 plugbasedclient.c

plugbasedclient:
        Added support to disable plugins
        Added support to change plugin directory

mandosclient.c
        Fixed some funtion calls that lacked error handling
        small bugfix

Show diffs side-by-side

added added

removed removed

Lines of Context:
56
56
  char *name;           /* can be "global" and any plugin name */
57
57
  char **argv;
58
58
  int argc;
 
59
  bool disable;
59
60
  struct plugin *next;
60
61
} plugin;
61
62
 
81
82
  new_plugin->argv[0] = name;
82
83
  new_plugin->argv[1] = NULL;
83
84
  new_plugin->argc = 1;
 
85
  new_plugin->disable = false;
 
86
  new_plugin->next = *plugin_list;
84
87
  /* Append the new plugin to the list */
85
 
  new_plugin->next = *plugin_list;
86
88
  *plugin_list = new_plugin;
87
89
  return new_plugin;
88
90
}
110
112
static char args_doc[] = "";
111
113
 
112
114
int main(int argc, char *argv[]){
113
 
  char plugindir[] = "plugins.d";
114
 
  size_t d_name_len, plugindir_len = sizeof(plugindir)-1;
 
115
  const char *plugindir = "plugins.d";
 
116
  size_t d_name_len;
115
117
  DIR *dir;
116
118
  struct dirent *dirst;
117
119
  struct stat st;
118
120
  fd_set rfds_orig;
119
121
  int ret, maxfd = 0;
120
122
  process *process_list = NULL;
121
 
  
 
123
 
122
124
  /* The options we understand. */
123
125
  struct argp_option options[] = {
124
126
    { .name = "global-options", .key = 'g',
127
129
    { .name = "options-for", .key = 'o',
128
130
      .arg = "plugin:option[,option[,...]]", .flags = 0,
129
131
      .doc = "Options effecting only specified plugins" },
 
132
    { .name = "disable-plugin", .key = 'd',
 
133
      .arg = "Plugin[,Plugin[,...]]", .flags = 0,
 
134
      .doc = "Option to disable specififed plugins" },
 
135
    { .name = "plugin-dir", .key = 128,
 
136
      .arg = "Directory", .flags = 0,
 
137
      .doc = "Option to change directory to search for plugins" },
130
138
    { .name = NULL }
131
139
  };
132
140
  
155
163
        } while (p);
156
164
      }
157
165
      break;
 
166
    case 'd':
 
167
      if (arg != NULL){
 
168
        char *p = strtok(arg, ",");
 
169
        do{
 
170
          getplugin(p, plugins)->disable = true;
 
171
          p = strtok(NULL, ",");
 
172
        } while (p);
 
173
      }
 
174
      break;
 
175
    case 128:
 
176
      plugindir = arg;
 
177
      break;
158
178
    case ARGP_KEY_ARG:
159
179
      argp_usage (state);
160
180
      break;
181
201
/*   } */
182
202
  
183
203
/*   return 0; */
184
 
  
 
204
 
185
205
  dir = opendir(plugindir);
186
206
  
187
207
  if(dir == NULL){
207
227
      continue;
208
228
    }
209
229
 
210
 
    char *filename = malloc(d_name_len + plugindir_len + 2);
 
230
    char *filename = malloc(d_name_len + strlen(plugindir) + 2);
211
231
    strcpy(filename, plugindir);
212
232
    strcat(filename, "/");
213
233
    strcat(filename, dirst->d_name);    
214
234
 
215
235
    stat(filename, &st);
216
236
 
217
 
    if (S_ISREG(st.st_mode) and (access(filename, X_OK) == 0)){
 
237
    if (S_ISREG(st.st_mode)
 
238
        and (access(filename, X_OK) == 0)
 
239
        and not (getplugin(dirst->d_name, &plugin_list)->disable)){
218
240
      // Starting a new process to be watched
219
241
      process *new_process = malloc(sizeof(process));
220
 
      int pipefd[2];
 
242
      int pipefd[2]; 
221
243
      ret = pipe(pipefd);
222
244
      if (ret == -1){
223
245
        perror(argv[0]);
229
251
        closedir(dir);
230
252
        close(pipefd[0]);       /* close unused read end of pipe */
231
253
        dup2(pipefd[1], STDOUT_FILENO); /* replace our stdout */
232
 
        char *basename;
233
 
        basename = strrchr(filename, '/');
234
 
        if (basename == NULL){
235
 
          basename = filename;
236
 
        } else {
237
 
          basename++;
238
 
        }
239
 
        plugin *p = getplugin(basename, &plugin_list);
240
254
 
 
255
        plugin *p = getplugin(dirst->d_name, &plugin_list);
241
256
        plugin *g = getplugin(NULL, &plugin_list);
242
257
        for(char **a = g->argv + 1; *a != NULL; a++){
243
258
          addarguments(p, *a);