1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <getopt.h>
5 #include <errno.h>
6 #include <stdbool.h>
7 #include <selinux/selinux.h>
8 #include <selinux/label.h>
9
usage(const char * progname)10 static void usage(const char *progname)
11 {
12 fprintf(stderr,
13 "usage: %s [-v] -p <path> [-f file]\n\n"
14 "Where:\n\t"
15 "-v Validate file_contxts entries against loaded policy.\n\t"
16 "-p Path to check if a match or partial match is possible\n\t"
17 " against a regex entry in the file_contexts file.\n\t"
18 "-f Optional file_contexts file (defaults to current policy).\n\n"
19 "Example:\n\t"
20 "%s -p /sys/devices/system/cpu/online\n\t"
21 " Check if a match or partial match is possible against\n\t"
22 " the path \"/sys/devices/system/cpu/online\", returning\n\t"
23 " TRUE or FALSE.\n\n", progname, progname);
24 exit(1);
25 }
26
main(int argc,char ** argv)27 int main(int argc, char **argv)
28 {
29 int opt;
30 bool partial_match;
31 char *validate = NULL, *path = NULL, *file = NULL;
32
33 struct selabel_handle *hnd;
34 struct selinux_opt selabel_option[] = {
35 { SELABEL_OPT_PATH, file },
36 { SELABEL_OPT_VALIDATE, validate }
37 };
38
39 if (argc < 2)
40 usage(argv[0]);
41
42 while ((opt = getopt(argc, argv, "f:vp:")) > 0) {
43 switch (opt) {
44 case 'f':
45 file = optarg;
46 break;
47 case 'v':
48 validate = (char *)1;
49 break;
50 case 'p':
51 path = optarg;
52 break;
53 default:
54 usage(argv[0]);
55 }
56 }
57
58 selabel_option[0].value = file;
59 selabel_option[1].value = validate;
60
61 hnd = selabel_open(SELABEL_CTX_FILE, selabel_option, 2);
62 if (!hnd) {
63 fprintf(stderr, "ERROR: selabel_open - Could not obtain "
64 "handle.\n");
65 return -1;
66 }
67
68 partial_match = selabel_partial_match(hnd, path);
69
70 printf("Match or Partial match: %s\n",
71 partial_match == 1 ? "TRUE" : "FALSE");
72
73 selabel_close(hnd);
74 return partial_match;
75 }
76