Home | History | Annotate | Download | only in utils
      1 #include <unistd.h>
      2 #include <sys/types.h>
      3 #include <fcntl.h>
      4 #include <stdio.h>
      5 #include <stdlib.h>
      6 #include <errno.h>
      7 #include <string.h>
      8 #include <ctype.h>
      9 #include <selinux/selinux.h>
     10 
     11 static void usage(const char *name, const char *detail, int rc)
     12 {
     13 	fprintf(stderr, "usage:  %s command [ fromcon ]\n", name);
     14 	if (detail)
     15 		fprintf(stderr, "%s:  %s\n", name, detail);
     16 	exit(rc);
     17 }
     18 
     19 static char * get_selinux_proc_context(const char *command, char * execcon) {
     20 	char * fcon = NULL, *newcon = NULL;
     21 
     22 	int ret = getfilecon(command, &fcon);
     23 	if (ret < 0) goto err;
     24 	ret = security_compute_create(execcon, fcon, string_to_security_class("process"), &newcon);
     25 	if (ret < 0) goto err;
     26 
     27 err:
     28 	freecon(fcon);
     29 	return newcon;
     30 }
     31 
     32 int main(int argc, char **argv)
     33 {
     34 	int ret = -1;
     35 	char * proccon = NULL, *con = NULL;
     36 	if (argc < 2 || argc > 3)
     37 		usage(argv[0], "Invalid number of arguments", -1);
     38 
     39 	if (argc == 2) {
     40 		if (getcon(&con) < 0) {
     41 			perror(argv[0]);
     42 			return -1;
     43 		}
     44 	} else {
     45 		con = strdup(argv[2]);
     46 	}
     47 
     48 	proccon = get_selinux_proc_context(argv[1], con);
     49 	if (proccon) {
     50 		printf("%s\n", proccon);
     51 		ret = 0;
     52 	} else {
     53 		perror(argv[0]);
     54 	}
     55 
     56 	free(proccon);
     57 	free(con);
     58 	return ret;
     59 }
     60