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
14int security_get_initial_context(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