Signed-off-by: Richard Haines <[email protected]>
---
libselinux/utils/.gitignore | 1 +
libselinux/utils/selinux_check_access.c | 52 +++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+)
create mode 100644 libselinux/utils/selinux_check_access.c
diff --git a/libselinux/utils/.gitignore b/libselinux/utils/.gitignore
index ed3bf0b..0af903d 100644
--- a/libselinux/utils/.gitignore
+++ b/libselinux/utils/.gitignore
@@ -25,3 +25,4 @@ selinuxexeccon
setenforce
setfilecon
togglesebool
+selinux_check_access
diff --git a/libselinux/utils/selinux_check_access.c
b/libselinux/utils/selinux_check_access.c
new file mode 100644
index 0000000..88762b4
--- /dev/null
+++ b/libselinux/utils/selinux_check_access.c
@@ -0,0 +1,52 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <selinux/selinux.h>
+
+static void usage(char *progname)
+{
+ fprintf(stderr, "usage: %s [-a auditdata] scon tcon class perm\n"
+ "\nWhere:\n\t"
+ "-a Optional information added to audit message.\n",
+ progname);
+ exit(1);
+}
+
+static int cb_auditinfo(void *auditdata,
+ __attribute__((unused))security_class_t class,
+ char *msgbuf, size_t msgbufsize)
+{
+ return snprintf(msgbuf, msgbufsize, "%s", (char *)auditdata);
+}
+
+int main(int argc, char **argv)
+{
+ int opt, rc;
+ char *audit_msg = NULL;
+
+ while ((opt = getopt(argc, argv, "a:")) != -1) {
+ switch (opt) {
+ case 'a':
+ audit_msg = optarg;
+ break;
+ default:
+ usage(argv[0]);
+ }
+ }
+
+ if ((argc - optind) != 4)
+ usage(argv[0]);
+
+ if (audit_msg)
+ selinux_set_callback(SELINUX_CB_AUDIT,
+ (union selinux_callback)cb_auditinfo);
+
+ rc = selinux_check_access(argv[optind], argv[optind + 1],
+ argv[optind + 2], argv[optind + 3],
+ audit_msg);
+ if (rc < 0)
+ perror("selinux_check_access");
+
+ return rc;
+}
--
2.9.3