/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: 2008-08-25 09:09:15 UTC
  • mfrom: (24.1.71 mandos)
  • Revision ID: teddy@fukt.bsnet.se-20080825090915-dxlxgb4pw1kqsui5
Merge.

Show diffs side-by-side

added added

removed removed

Lines of Context:
65
65
#include <errno.h>              /* errno, EBADF */
66
66
 
67
67
#define BUFFER_SIZE 256
68
 
#define ARGFILE "/conf/conf.d/mandos/plugin-runner.conf"
 
68
 
 
69
#define PDIR "/lib/mandos/plugins.d"
 
70
#define AFILE "/conf/conf.d/mandos/plugin-runner.conf"
69
71
 
70
72
const char *argp_program_version = "plugin-runner 1.0";
71
73
const char *argp_program_bug_address = "<mandos@fukt.bsnet.se>";
247
249
  return true;
248
250
}
249
251
 
250
 
char **add_to_argv(char **argv, int *argc, char *arg){
251
 
  if (argv == NULL){
252
 
    *argc = 1;
253
 
    argv = malloc(sizeof(char*) * 2);
254
 
    if(argv == NULL){
255
 
      return NULL;
256
 
    }
257
 
    argv[0] = NULL;     /* Will be set to argv[0] in main before
258
 
                           parsing */
259
 
    argv[1] = NULL;
260
 
  }
261
 
  *argc += 1;
262
 
  argv = realloc(argv, sizeof(char *)
263
 
                  * ((unsigned int) *argc + 1));
264
 
  if(argv == NULL){
265
 
    return NULL;
266
 
  }
267
 
  argv[*argc-1] = arg;
268
 
  argv[*argc] = NULL;
269
 
  return argv;
270
 
}
271
 
 
272
252
static void free_plugin_list(plugin *plugin_list){
273
253
  for(plugin *next; plugin_list != NULL; plugin_list = next){
274
254
    next = plugin_list->next;
285
265
}
286
266
 
287
267
int main(int argc, char *argv[]){
288
 
  const char *plugindir = "/lib/mandos/plugins.d";
289
 
  const char *argfile = ARGFILE;
 
268
  char *plugindir = NULL;
 
269
  char *argfile = NULL;
290
270
  FILE *conffp;
291
271
  size_t d_name_len;
292
272
  DIR *dir = NULL;
339
319
    { .name = "plugin-dir", .key = 128,
340
320
      .arg = "DIRECTORY",
341
321
      .doc = "Specify a different plugin directory", .group = 2 },
342
 
    { .name = "userid", .key = 129,
343
 
      .arg = "ID", .flags = 0,
344
 
      .doc = "User ID the plugins will run as", .group = 2 },
345
 
    { .name = "groupid", .key = 130,
346
 
      .arg = "ID", .flags = 0,
347
 
      .doc = "Group ID the plugins will run as", .group = 2 },
348
 
    { .name = "debug", .key = 131,
349
 
      .doc = "Debug mode", .group = 3 },
 
322
    { .name = "config-file", .key = 129,
 
323
      .arg = "FILE",
 
324
      .doc = "Specify a different configuration file", .group = 2 },
 
325
    { .name = "userid", .key = 130,
 
326
      .arg = "ID", .flags = 0,
 
327
      .doc = "User ID the plugins will run as", .group = 3 },
 
328
    { .name = "groupid", .key = 131,
 
329
      .arg = "ID", .flags = 0,
 
330
      .doc = "Group ID the plugins will run as", .group = 3 },
 
331
    { .name = "debug", .key = 132,
 
332
      .doc = "Debug mode", .group = 4 },
350
333
    { .name = NULL }
351
334
  };
352
335
  
436
419
      }
437
420
      break;
438
421
    case 128:
439
 
      plugindir = arg;
 
422
      plugindir = strdup(arg);
 
423
      if(plugindir == NULL){
 
424
        perror("strdup");
 
425
      }      
440
426
      break;
441
427
    case 129:
 
428
      argfile = strdup(arg);
 
429
      if(argfile == NULL){
 
430
        perror("strdup");
 
431
      }
 
432
      break;      
 
433
    case 130:
442
434
      uid = (uid_t)strtol(arg, NULL, 10);
443
435
      break;
444
 
    case 130:
 
436
    case 131:
445
437
      gid = (gid_t)strtol(arg, NULL, 10);
446
438
      break;
447
 
    case 131:
 
439
    case 132:
448
440
      debug = true;
449
441
      break;
450
442
    case ARGP_KEY_ARG:
471
463
    goto fallback;
472
464
  }
473
465
 
474
 
  conffp = fopen(argfile, "r");
 
466
  if (argfile == NULL){
 
467
    conffp = fopen(AFILE, "r");
 
468
  } else {
 
469
    conffp = fopen(argfile, "r");
 
470
  }
 
471
  
475
472
  if(conffp != NULL){
476
473
    char *org_line = NULL;
477
474
    char *p, *arg, *new_arg, *line;
480
477
    const char whitespace_delims[] = " \r\t\f\v\n";
481
478
    const char comment_delim[] = "#";
482
479
 
 
480
    custom_argc = 1;
 
481
    custom_argv = malloc(sizeof(char*) * 2);
 
482
    if(custom_argv == NULL){
 
483
      perror("malloc");
 
484
      exitstatus = EXIT_FAILURE;
 
485
      goto fallback;
 
486
    }
 
487
    custom_argv[0] = argv[0];
 
488
    custom_argv[1] = NULL;
 
489
    
483
490
    while(true){
484
491
      sret = getline(&org_line, &size, conffp);
485
492
      if(sret == -1){
493
500
          continue;
494
501
        }
495
502
        new_arg = strdup(p);
496
 
        custom_argv = add_to_argv(custom_argv, &custom_argc, new_arg);
497
 
        if (custom_argv == NULL){
498
 
          perror("add_to_argv");
499
 
          exitstatus = EXIT_FAILURE;
500
 
          goto fallback;
501
 
        }
 
503
        if(new_arg == NULL){
 
504
          perror("strdup");
 
505
          exitstatus = EXIT_FAILURE;
 
506
          free(org_line);
 
507
          goto fallback;
 
508
        }
 
509
        
 
510
        custom_argc += 1;
 
511
        custom_argv = realloc(custom_argv, sizeof(char *)
 
512
                              * ((unsigned int) custom_argc + 1));
 
513
        if(custom_argv == NULL){
 
514
          perror("realloc");
 
515
          exitstatus = EXIT_FAILURE;
 
516
          free(org_line);
 
517
          goto fallback;
 
518
        }
 
519
        custom_argv[custom_argc-1] = new_arg;
 
520
        custom_argv[custom_argc] = NULL;        
502
521
      }
503
522
    }
504
523
    free(org_line);
513
532
  }
514
533
 
515
534
  if(custom_argv != NULL){
516
 
    custom_argv[0] = argv[0];
517
 
    ret = argp_parse (&argp, custom_argc, custom_argv, 0, 0,
518
 
                      &plugin_list);
 
535
    ret = argp_parse (&argp, custom_argc, custom_argv, 0, 0, &plugin_list);
519
536
    if (ret == ARGP_ERR_UNKNOWN){
520
537
      fprintf(stderr, "Unknown error while parsing arguments\n");
521
538
      exitstatus = EXIT_FAILURE;
546
563
  if (ret == -1){
547
564
    perror("setgid");
548
565
  }
 
566
 
 
567
  if (plugindir == NULL){
 
568
    dir = opendir(PDIR);
 
569
  } else {
 
570
    dir = opendir(plugindir);
 
571
  }
549
572
  
550
 
  dir = opendir(plugindir);
551
573
  if(dir == NULL){
552
574
    perror("Could not open plugin dir");
553
575
    exitstatus = EXIT_FAILURE;
803
825
    }
804
826
    
805
827
  }
806
 
  
 
828
 
807
829
  free_plugin_list(plugin_list);
808
830
  plugin_list = NULL;
809
831
  
947
969
  }
948
970
 
949
971
  if(custom_argv != NULL){
950
 
    for(char **arg = custom_argv; *arg != NULL; arg++){
 
972
    for(char **arg = custom_argv+1; *arg != NULL; arg++){
951
973
      free(*arg);
952
974
    }
953
975
    free(custom_argv);
978
1000
  if(errno != ECHILD){
979
1001
    perror("wait");
980
1002
  }
 
1003
 
 
1004
  free(plugindir);
 
1005
  free(argfile);
981
1006
  
982
1007
  return exitstatus;
983
1008
}