/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: Teddy Hogeborn
  • Date: 2008-08-27 01:18:25 UTC
  • Revision ID: teddy@fukt.bsnet.se-20080827011825-ka3ni6xvy2ehi1y8
* .bzrignore: New.

* clients.conf ([foo]): Remove Radix-64 checksum.

* mandos (AvahiService.rename, server_state_changed,
          entry_group_state_changed): Make Avahi log messages more
                                      clear that they are about
                                      Zeroconf.
  (fingerprint): Use plain "0" instead of "ctypes.c_uint(0)".

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 parsing */
258
 
    argv[1] = NULL;
259
 
  }
260
 
  *argc += 1;
261
 
  argv = realloc(argv, sizeof(char *)
262
 
                  * ((unsigned int) *argc + 1));
263
 
  if(argv == NULL){
264
 
    return NULL;
265
 
  }
266
 
  argv[*argc-1] = arg;
267
 
  argv[*argc] = NULL;
268
 
  return argv;
269
 
}
270
 
 
271
252
static void free_plugin_list(plugin *plugin_list){
272
253
  for(plugin *next; plugin_list != NULL; plugin_list = next){
273
254
    next = plugin_list->next;
284
265
}
285
266
 
286
267
int main(int argc, char *argv[]){
287
 
  const char *plugindir = "/lib/mandos/plugins.d";
288
 
  const char *argfile = ARGFILE;
 
268
  char *plugindir = NULL;
 
269
  char *argfile = NULL;
289
270
  FILE *conffp;
290
271
  size_t d_name_len;
291
272
  DIR *dir = NULL;
338
319
    { .name = "plugin-dir", .key = 128,
339
320
      .arg = "DIRECTORY",
340
321
      .doc = "Specify a different plugin directory", .group = 2 },
341
 
    { .name = "userid", .key = 129,
342
 
      .arg = "ID", .flags = 0,
343
 
      .doc = "User ID the plugins will run as", .group = 2 },
344
 
    { .name = "groupid", .key = 130,
345
 
      .arg = "ID", .flags = 0,
346
 
      .doc = "Group ID the plugins will run as", .group = 2 },
347
 
    { .name = "debug", .key = 131,
348
 
      .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 },
349
333
    { .name = NULL }
350
334
  };
351
335
  
435
419
      }
436
420
      break;
437
421
    case 128:
438
 
      plugindir = arg;
 
422
      plugindir = strdup(arg);
 
423
      if(plugindir == NULL){
 
424
        perror("strdup");
 
425
      }      
439
426
      break;
440
427
    case 129:
 
428
      argfile = strdup(arg);
 
429
      if(argfile == NULL){
 
430
        perror("strdup");
 
431
      }
 
432
      break;      
 
433
    case 130:
441
434
      uid = (uid_t)strtol(arg, NULL, 10);
442
435
      break;
443
 
    case 130:
 
436
    case 131:
444
437
      gid = (gid_t)strtol(arg, NULL, 10);
445
438
      break;
446
 
    case 131:
 
439
    case 132:
447
440
      debug = true;
448
441
      break;
449
442
    case ARGP_KEY_ARG:
470
463
    goto fallback;
471
464
  }
472
465
 
473
 
  conffp = fopen(argfile, "r");
 
466
  if (argfile == NULL){
 
467
    conffp = fopen(AFILE, "r");
 
468
  } else {
 
469
    conffp = fopen(argfile, "r");
 
470
  }
 
471
  
474
472
  if(conffp != NULL){
475
473
    char *org_line = NULL;
476
474
    char *p, *arg, *new_arg, *line;
479
477
    const char whitespace_delims[] = " \r\t\f\v\n";
480
478
    const char comment_delim[] = "#";
481
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
    
482
490
    while(true){
483
491
      sret = getline(&org_line, &size, conffp);
484
492
      if(sret == -1){
492
500
          continue;
493
501
        }
494
502
        new_arg = strdup(p);
495
 
        custom_argv = add_to_argv(custom_argv, &custom_argc, new_arg);
496
 
        if (custom_argv == NULL){
497
 
          perror("add_to_argv");
498
 
          exitstatus = EXIT_FAILURE;
499
 
          goto fallback;
500
 
        }
 
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;        
501
521
      }
502
522
    }
503
523
    free(org_line);
512
532
  }
513
533
 
514
534
  if(custom_argv != NULL){
515
 
    custom_argv[0] = argv[0];
516
535
    ret = argp_parse (&argp, custom_argc, custom_argv, 0, 0, &plugin_list);
517
536
    if (ret == ARGP_ERR_UNKNOWN){
518
537
      fprintf(stderr, "Unknown error while parsing arguments\n");
544
563
  if (ret == -1){
545
564
    perror("setgid");
546
565
  }
 
566
 
 
567
  if (plugindir == NULL){
 
568
    dir = opendir(PDIR);
 
569
  } else {
 
570
    dir = opendir(plugindir);
 
571
  }
547
572
  
548
 
  dir = opendir(plugindir);
549
573
  if(dir == NULL){
550
574
    perror("Could not open plugin dir");
551
575
    exitstatus = EXIT_FAILURE;
801
825
    }
802
826
    
803
827
  }
804
 
  
 
828
 
805
829
  free_plugin_list(plugin_list);
806
830
  plugin_list = NULL;
807
831
  
945
969
  }
946
970
 
947
971
  if(custom_argv != NULL){
948
 
    for(char **arg = custom_argv; *arg != NULL; arg++){
 
972
    for(char **arg = custom_argv+1; *arg != NULL; arg++){
949
973
      free(*arg);
950
974
    }
951
975
    free(custom_argv);
976
1000
  if(errno != ECHILD){
977
1001
    perror("wait");
978
1002
  }
 
1003
 
 
1004
  free(plugindir);
 
1005
  free(argfile);
979
1006
  
980
1007
  return exitstatus;
981
1008
}