noexec: set comm field for noexecs
[oweals/busybox.git] / selinux / matchpathcon.c
1 /* matchpathcon  -  get the default security context for the specified
2  *                  path from the file contexts configuration.
3  *                  based on libselinux-1.32
4  * Port to busybox: KaiGai Kohei <kaigai@kaigai.gr.jp>
5  *
6  * Licensed under GPLv2, see file LICENSE in this source tree.
7  */
8 //config:config MATCHPATHCON
9 //config:       bool "matchpathcon (6.1 kb)"
10 //config:       default n
11 //config:       depends on SELINUX
12 //config:       help
13 //config:       Enable support to get default security context of the
14 //config:       specified path from the file contexts configuration.
15
16 //applet:IF_MATCHPATHCON(APPLET(matchpathcon, BB_DIR_USR_SBIN, BB_SUID_DROP))
17
18 //kbuild:lib-$(CONFIG_MATCHPATHCON) += matchpathcon.o
19
20 //usage:#define matchpathcon_trivial_usage
21 //usage:       "[-n] [-N] [-f file_contexts_file] [-p prefix] [-V]"
22 //usage:#define matchpathcon_full_usage "\n\n"
23 //usage:       "        -n      Don't display path"
24 //usage:     "\n        -N      Don't use translations"
25 //usage:     "\n        -f      Use alternate file_context file"
26 //usage:     "\n        -p      Use prefix to speed translations"
27 //usage:     "\n        -V      Verify file context on disk matches defaults"
28
29 #include "libbb.h"
30
31 static int print_matchpathcon(char *path, int noprint)
32 {
33         char *buf;
34         int rc = matchpathcon(path, 0, &buf);
35         if (rc < 0) {
36                 bb_perror_msg("matchpathcon(%s) failed", path);
37                 return 1;
38         }
39         if (!noprint)
40                 printf("%s\t%s\n", path, buf);
41         else
42                 puts(buf);
43
44         freecon(buf);
45         return 0;
46 }
47
48 #define OPT_NOT_PRINT   (1<<0)  /* -n */
49 #define OPT_NOT_TRANS   (1<<1)  /* -N */
50 #define OPT_FCONTEXT    (1<<2)  /* -f */
51 #define OPT_PREFIX      (1<<3)  /* -p */
52 #define OPT_VERIFY      (1<<4)  /* -V */
53
54 int matchpathcon_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
55 int matchpathcon_main(int argc UNUSED_PARAM, char **argv)
56 {
57         int error = 0;
58         unsigned opts;
59         char *fcontext, *prefix, *path;
60
61         opt_complementary = "-1" /* at least one param reqd */
62                 ":?:f--p:p--f"; /* mutually exclusive */
63         opts = getopt32(argv, "nNf:p:V", &fcontext, &prefix);
64         argv += optind;
65
66         if (opts & OPT_NOT_TRANS) {
67                 set_matchpathcon_flags(MATCHPATHCON_NOTRANS);
68         }
69         if (opts & OPT_FCONTEXT) {
70                 if (matchpathcon_init(fcontext))
71                         bb_perror_msg_and_die("error while processing %s", fcontext);
72         }
73         if (opts & OPT_PREFIX) {
74                 if (matchpathcon_init_prefix(NULL, prefix))
75                         bb_perror_msg_and_die("error while processing %s", prefix);
76         }
77
78         while ((path = *argv++) != NULL) {
79                 security_context_t con;
80                 int rc;
81
82                 if (!(opts & OPT_VERIFY)) {
83                         error += print_matchpathcon(path, opts & OPT_NOT_PRINT);
84                         continue;
85                 }
86
87                 if (selinux_file_context_verify(path, 0)) {
88                         printf("%s verified\n", path);
89                         continue;
90                 }
91
92                 if (opts & OPT_NOT_TRANS)
93                         rc = lgetfilecon_raw(path, &con);
94                 else
95                         rc = lgetfilecon(path, &con);
96
97                 if (rc >= 0) {
98                         printf("%s has context %s, should be ", path, con);
99                         error += print_matchpathcon(path, 1);
100                         freecon(con);
101                         continue;
102                 }
103                 printf("actual context unknown: %s, should be ", strerror(errno));
104                 error += print_matchpathcon(path, 1);
105         }
106         matchpathcon_fini();
107         return error;
108 }