1ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include <stddef.h> 2ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include <stdio.h> 3ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include <string.h> 4ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman 5ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include "dups.h" 6ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include "neverallow.h" 7ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include "perm.h" 8ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include "typecmp.h" 9a7b2c5f4ab5fc393dd75af934e5daa13e2ac70a6Stephen Smalley#include "booleans.h" 100233cd800efc7af1828bb69d236c8371ca238c66Stephen Smalley#include "attribute.h" 11ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#include "utils.h" 12ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman 13ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#define NUM_COMPONENTS (int) (sizeof(analyze_components)/sizeof(analyze_components[0])) 14ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman 15ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman#define COMP(x) { #x, sizeof(#x) - 1, x ##_usage, x ##_func } 16ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashmanstatic struct { 17ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman const char *key; 18ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman size_t keylen; 19ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman void (*usage) (void); 20ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman int (*func) (int argc, char **argv, policydb_t *policydb); 21ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman} analyze_components[] = { 22ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman COMP(dups), 23ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman COMP(neverallow), 24ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman COMP(permissive), 25a7b2c5f4ab5fc393dd75af934e5daa13e2ac70a6Stephen Smalley COMP(typecmp), 260233cd800efc7af1828bb69d236c8371ca238c66Stephen Smalley COMP(booleans), 270233cd800efc7af1828bb69d236c8371ca238c66Stephen Smalley COMP(attribute) 28ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman}; 29ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman 30ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashmanvoid usage(char *arg0) 31ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman{ 3247c14611565285a59124d9aefd1edb5ebf5bab01William Roberts int i; 3347c14611565285a59124d9aefd1edb5ebf5bab01William Roberts 34ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman fprintf(stderr, "%s must be called on a policy file with a component and the appropriate arguments specified\n", arg0); 35ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman fprintf(stderr, "%s <policy-file>:\n", arg0); 3647c14611565285a59124d9aefd1edb5ebf5bab01William Roberts for(i = 0; i < NUM_COMPONENTS; i++) { 37ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman analyze_components[i].usage(); 38ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman } 39ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman exit(1); 40ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman} 41ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman 42ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashmanint main(int argc, char **argv) 43ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman{ 44ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman char *policy; 45ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman struct policy_file pf; 46ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman policydb_t policydb; 47ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman int rc; 4847c14611565285a59124d9aefd1edb5ebf5bab01William Roberts int i; 4947c14611565285a59124d9aefd1edb5ebf5bab01William Roberts 50ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman if (argc < 3) 51ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman usage(argv[0]); 52ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman policy = argv[1]; 53ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman if(load_policy(policy, &policydb, &pf)) 54ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman exit(1); 5547c14611565285a59124d9aefd1edb5ebf5bab01William Roberts for(i = 0; i < NUM_COMPONENTS; i++) { 56ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman if (!strcmp(analyze_components[i].key, argv[2])) { 57ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman rc = analyze_components[i].func(argc - 2, argv + 2, &policydb); 58ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman if (rc && USAGE_ERROR) { 59ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman usage(argv[0]); } 60ee8b67dfd9be89455a4e30bfef05ec7bdf3083e2Andreas Gampe policydb_destroy(&policydb); 61ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman return rc; 62ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman } 63ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman } 64ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman usage(argv[0]); 6547c14611565285a59124d9aefd1edb5ebf5bab01William Roberts exit(0); 66ef4fd30672ebfeac1a0ad04f65deb7b38050b818dcashman} 67