#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include "selinux_internal.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <regex.h>
#include <stdarg.h>

int matchmediacon(const char *media, char ** con)
{
	const char *path = selinux_media_context_path();
	FILE *infile;
	char *ptr, *ptr2 = NULL;
	int found = 0;
	char current_line[PATH_MAX];
	if ((infile = fopen(path, "re")) == NULL)
		return -1;
	while (!feof_unlocked(infile)) {
		if (!fgets_unlocked(current_line, sizeof(current_line), infile)) {
			return -1;
		}
		if (current_line[strlen(current_line) - 1])
			current_line[strlen(current_line) - 1] = 0;
		/* Skip leading whitespace before the partial context. */
		ptr = current_line;
		while (*ptr && isspace(*ptr))
			ptr++;

		if (!(*ptr))
			continue;

		/* Find the end of the media context. */
		ptr2 = ptr;
		while (*ptr2 && !isspace(*ptr2))
			ptr2++;
		if (!(*ptr2))
			continue;

		*ptr2++ = 0;
		if (strcmp(media, ptr) == 0) {
			found = 1;
			break;
		}
	}
	fclose(infile);
	if (!found)
		return -1;

	/* Skip whitespace. */
	while (*ptr2 && isspace(*ptr2))
		ptr2++;
	if (!(*ptr2)) {
		return -1;
	}

	if (selinux_raw_to_trans_context(ptr2, con)) {
		*con = NULL;
		return -1;
	}

	return 0;
}
