1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <selinux/selinux.h> 6 7 static __attribute__ ((__noreturn__)) void usage(const char *progname) 8 { 9 fprintf(stderr, "usage: %s [-a auditdata] scon tcon class perm\n" 10 "\nWhere:\n\t" 11 "-a Optional information added to audit message.\n", 12 progname); 13 exit(1); 14 } 15 16 static int cb_auditinfo(void *auditdata, 17 __attribute__((unused))security_class_t class, 18 char *msgbuf, size_t msgbufsize) 19 { 20 return snprintf(msgbuf, msgbufsize, "%s", (char *)auditdata); 21 } 22 23 int main(int argc, char **argv) 24 { 25 int opt, rc; 26 char *audit_msg = NULL; 27 28 while ((opt = getopt(argc, argv, "a:")) != -1) { 29 switch (opt) { 30 case 'a': 31 audit_msg = optarg; 32 break; 33 default: 34 usage(argv[0]); 35 } 36 } 37 38 if ((argc - optind) != 4) 39 usage(argv[0]); 40 41 if (audit_msg) 42 selinux_set_callback(SELINUX_CB_AUDIT, 43 (union selinux_callback)cb_auditinfo); 44 45 rc = selinux_check_access(argv[optind], argv[optind + 1], 46 argv[optind + 2], argv[optind + 3], 47 audit_msg); 48 if (rc < 0) 49 perror("selinux_check_access"); 50 51 return rc; 52 } 53