Home | History | Annotate | Download | only in src
      1 #include <unistd.h>
      2 #include <sys/types.h>
      3 #include <fcntl.h>
      4 #include <stdlib.h>
      5 #include <stdio.h>
      6 #include <errno.h>
      7 #include <string.h>
      8 #include "selinux_internal.h"
      9 #include "policy.h"
     10 #include <limits.h>
     11 
     12 #define SELINUX_INITCON_DIR "/initial_contexts/"
     13 
     14 int security_get_initial_context_raw(const char * name, char ** con)
     15 {
     16 	char path[PATH_MAX];
     17 	char *buf;
     18 	size_t size;
     19 	int fd, ret;
     20 
     21 	if (!selinux_mnt) {
     22 		errno = ENOENT;
     23 		return -1;
     24 	}
     25 
     26 	snprintf(path, sizeof path, "%s%s%s",
     27 		 selinux_mnt, SELINUX_INITCON_DIR, name);
     28 	fd = open(path, O_RDONLY);
     29 	if (fd < 0)
     30 		return -1;
     31 
     32 	size = selinux_page_size;
     33 	buf = malloc(size);
     34 	if (!buf) {
     35 		ret = -1;
     36 		goto out;
     37 	}
     38 	memset(buf, 0, size);
     39 	ret = read(fd, buf, size - 1);
     40 	if (ret < 0)
     41 		goto out2;
     42 
     43 	*con = strdup(buf);
     44 	if (!(*con)) {
     45 		ret = -1;
     46 		goto out2;
     47 	}
     48 	ret = 0;
     49       out2:
     50 	free(buf);
     51       out:
     52 	close(fd);
     53 	return ret;
     54 }
     55 
     56 hidden_def(security_get_initial_context_raw)
     57 
     58 int security_get_initial_context(const char * name, char ** con)
     59 {
     60 	int ret;
     61 	char * rcon;
     62 
     63 	ret = security_get_initial_context_raw(name, &rcon);
     64 	if (!ret) {
     65 		ret = selinux_raw_to_trans_context(rcon, con);
     66 		freecon(rcon);
     67 	}
     68 
     69 	return ret;
     70 }
     71 
     72 hidden_def(security_get_initial_context)
     73