Chris PeBenito 473ea7
/*
Chris PeBenito 473ea7
 * Author: Trusted Computer Solutions, Inc. <chanson@trustedcs.com>
Chris PeBenito 473ea7
 */
Chris PeBenito 473ea7
Chris PeBenito 473ea7
#include <unistd.h>
Chris PeBenito 473ea7
#include <fcntl.h>
Chris PeBenito 473ea7
#include <string.h>
Chris PeBenito 473ea7
#include "selinux_internal.h"
Chris PeBenito 473ea7
Chris PeBenito 473ea7
int setcon_raw(security_context_t context)
Chris PeBenito 473ea7
{
Chris PeBenito 473ea7
	int fd;
Chris PeBenito 473ea7
	ssize_t ret;
Chris PeBenito 473ea7
Chris PeBenito 473ea7
	fd = open("/proc/self/attr/current", O_RDWR);
Chris PeBenito 473ea7
	if (fd < 0)
Chris PeBenito 473ea7
		return -1;
Chris PeBenito 473ea7
	if (context) 
Chris PeBenito 473ea7
		ret = write(fd, context, strlen(context)+1);
Chris PeBenito 473ea7
	else
Chris PeBenito 473ea7
		ret = -1; /* we can not clear this one */
Chris PeBenito 473ea7
	close(fd);
Chris PeBenito 473ea7
	if (ret < 0)
Chris PeBenito 473ea7
		return -1;
Chris PeBenito 473ea7
	else
Chris PeBenito 473ea7
		return 0;
Chris PeBenito 473ea7
}
Chris PeBenito 473ea7
hidden_def(setcon_raw)
Chris PeBenito 473ea7
Chris PeBenito 473ea7
int setcon(char *context)
Chris PeBenito 473ea7
{
Chris PeBenito 473ea7
	int ret;
Chris PeBenito 473ea7
	security_context_t rcontext = context;
Chris PeBenito 473ea7
Chris PeBenito 473ea7
	if (context_translations && trans_to_raw_context(context, &rcontext))
Chris PeBenito 473ea7
		return -1;
Chris PeBenito 473ea7
Chris PeBenito 473ea7
 	ret = setcon_raw(rcontext);
Chris PeBenito 473ea7
Chris PeBenito 473ea7
	if (context_translations)
Chris PeBenito 473ea7
		freecon(rcontext);
Chris PeBenito 473ea7
Chris PeBenito 473ea7
	return ret;
Chris PeBenito 473ea7
}