#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <selinux/selinux.h>

static void usage(const char *name, const char *detail, int rc)
{
	fprintf(stderr, "usage:  %s command [ fromcon ]\n", name);
	if (detail)
		fprintf(stderr, "%s:  %s\n", name, detail);
	exit(rc);
}

static char * get_selinux_proc_context(const char *command, char * execcon) {
	char * fcon = NULL, *newcon = NULL;

	int ret = getfilecon(command, &fcon);
	if (ret < 0) goto err;
	ret = security_compute_create(execcon, fcon, string_to_security_class("process"), &newcon);
	if (ret < 0) goto err;

err:
	freecon(fcon);
	return newcon;
}

int main(int argc, char **argv)
{
	int ret = -1;
	char * proccon = NULL, *con = NULL;
	if (argc < 2 || argc > 3)
		usage(argv[0], "Invalid number of arguments", -1);

	if (argc == 2) {
		if (getcon(&con) < 0) {
			perror(argv[0]);
			return -1;
		}
	} else {
		con = strdup(argv[2]);
	}

	proccon = get_selinux_proc_context(argv[1], con);
	if (proccon) {
		printf("%s\n", proccon);
		ret = 0;
	} else {
		perror(argv[0]);
	}

	free(proccon);
	free(con);
	return ret;
}
