#include #include #include #include #include #include #include #include #include #include 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 security_context_t get_selinux_proc_context(const char *command, security_context_t execcon) { security_context_t fcon = NULL, newcon = NULL; int ret = getfilecon(command, &fcon); if (ret < 0) goto err; ret = security_compute_create(execcon, fcon, SECCLASS_PROCESS, &newcon); if (ret < 0) goto err; err: freecon(fcon); return newcon; } int main(int argc, char **argv) { int ret = -1; security_context_t 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; }