1#include <unistd.h> 2#include <fcntl.h> 3#include <string.h> 4#include <stdlib.h> 5#include <errno.h> 6#include <sys/xattr.h> 7#include "selinux_internal.h" 8#include "policy.h" 9 10int setfilecon_raw(const char *path, const char * context) 11{ 12 int rc = setxattr(path, XATTR_NAME_SELINUX, context, strlen(context) + 1, 13 0); 14 if (rc < 0 && errno == ENOTSUP) { 15 char * ccontext = NULL; 16 int err = errno; 17 if ((getfilecon_raw(path, &ccontext) >= 0) && 18 (strcmp(context,ccontext) == 0)) { 19 rc = 0; 20 } else { 21 errno = err; 22 } 23 freecon(ccontext); 24 } 25 return rc; 26} 27 28hidden_def(setfilecon_raw) 29 30int setfilecon(const char *path, const char *context) 31{ 32 int ret; 33 char * rcontext; 34 35 if (selinux_trans_to_raw_context(context, &rcontext)) 36 return -1; 37 38 ret = setfilecon_raw(path, rcontext); 39 40 freecon(rcontext); 41 42 return ret; 43} 44