1f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <unistd.h>
2f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <sys/types.h>
3f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <fcntl.h>
4f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <stdlib.h>
5f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <stdio.h>
6f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <errno.h>
7f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <string.h>
8f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include "selinux_internal.h"
9f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include "policy.h"
10f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#include <limits.h>
11f074036424618c130dacb3464465a8b40bffef5Stephen Smalley
12f074036424618c130dacb3464465a8b40bffef5Stephen Smalley#define SELINUX_INITCON_DIR "/initial_contexts/"
13f074036424618c130dacb3464465a8b40bffef5Stephen Smalley
14ab40ea9bfd71b50138f1482c4764a65ac17d8cafStephen Smalleyint security_get_initial_context(const char * name, char ** con)
15f074036424618c130dacb3464465a8b40bffef5Stephen Smalley{
16f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	char path[PATH_MAX];
17f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	char *buf;
18f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	size_t size;
19f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	int fd, ret;
20f074036424618c130dacb3464465a8b40bffef5Stephen Smalley
21f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	if (!selinux_mnt) {
22f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		errno = ENOENT;
23f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		return -1;
24f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	}
25f074036424618c130dacb3464465a8b40bffef5Stephen Smalley
26f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	snprintf(path, sizeof path, "%s%s%s",
27f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		 selinux_mnt, SELINUX_INITCON_DIR, name);
28f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	fd = open(path, O_RDONLY);
29f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	if (fd < 0)
30f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		return -1;
31f074036424618c130dacb3464465a8b40bffef5Stephen Smalley
32f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	size = selinux_page_size;
33f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	buf = malloc(size);
34f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	if (!buf) {
35f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		ret = -1;
36f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		goto out;
37f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	}
38f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	memset(buf, 0, size);
39f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	ret = read(fd, buf, size - 1);
40f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	if (ret < 0)
41f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		goto out2;
42f074036424618c130dacb3464465a8b40bffef5Stephen Smalley
43f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	*con = strdup(buf);
44f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	if (!(*con)) {
45f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		ret = -1;
46f074036424618c130dacb3464465a8b40bffef5Stephen Smalley		goto out2;
47f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	}
48f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	ret = 0;
49f074036424618c130dacb3464465a8b40bffef5Stephen Smalley      out2:
50f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	free(buf);
51f074036424618c130dacb3464465a8b40bffef5Stephen Smalley      out:
52f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	close(fd);
53f074036424618c130dacb3464465a8b40bffef5Stephen Smalley	return ret;
54f074036424618c130dacb3464465a8b40bffef5Stephen Smalley}
55f074036424618c130dacb3464465a8b40bffef5Stephen Smalley
56