1*2d543d20SAndroid Build Coastguard Worker #include <unistd.h>
2*2d543d20SAndroid Build Coastguard Worker #include <fcntl.h>
3*2d543d20SAndroid Build Coastguard Worker #include <string.h>
4*2d543d20SAndroid Build Coastguard Worker #include "selinux_internal.h"
5*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
6*2d543d20SAndroid Build Coastguard Worker #include <errno.h>
7*2d543d20SAndroid Build Coastguard Worker #include <sys/xattr.h>
8*2d543d20SAndroid Build Coastguard Worker #include "policy.h"
9*2d543d20SAndroid Build Coastguard Worker
getfilecon_raw(const char * path,char ** context)10*2d543d20SAndroid Build Coastguard Worker int getfilecon_raw(const char *path, char ** context)
11*2d543d20SAndroid Build Coastguard Worker {
12*2d543d20SAndroid Build Coastguard Worker char *buf;
13*2d543d20SAndroid Build Coastguard Worker ssize_t size;
14*2d543d20SAndroid Build Coastguard Worker ssize_t ret;
15*2d543d20SAndroid Build Coastguard Worker
16*2d543d20SAndroid Build Coastguard Worker size = INITCONTEXTLEN + 1;
17*2d543d20SAndroid Build Coastguard Worker buf = malloc(size);
18*2d543d20SAndroid Build Coastguard Worker if (!buf)
19*2d543d20SAndroid Build Coastguard Worker return -1;
20*2d543d20SAndroid Build Coastguard Worker memset(buf, 0, size);
21*2d543d20SAndroid Build Coastguard Worker
22*2d543d20SAndroid Build Coastguard Worker ret = getxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
23*2d543d20SAndroid Build Coastguard Worker if (ret < 0 && errno == ERANGE) {
24*2d543d20SAndroid Build Coastguard Worker char *newbuf;
25*2d543d20SAndroid Build Coastguard Worker
26*2d543d20SAndroid Build Coastguard Worker size = getxattr(path, XATTR_NAME_SELINUX, NULL, 0);
27*2d543d20SAndroid Build Coastguard Worker if (size < 0)
28*2d543d20SAndroid Build Coastguard Worker goto out;
29*2d543d20SAndroid Build Coastguard Worker
30*2d543d20SAndroid Build Coastguard Worker size++;
31*2d543d20SAndroid Build Coastguard Worker newbuf = realloc(buf, size);
32*2d543d20SAndroid Build Coastguard Worker if (!newbuf)
33*2d543d20SAndroid Build Coastguard Worker goto out;
34*2d543d20SAndroid Build Coastguard Worker
35*2d543d20SAndroid Build Coastguard Worker buf = newbuf;
36*2d543d20SAndroid Build Coastguard Worker memset(buf, 0, size);
37*2d543d20SAndroid Build Coastguard Worker ret = getxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
38*2d543d20SAndroid Build Coastguard Worker }
39*2d543d20SAndroid Build Coastguard Worker out:
40*2d543d20SAndroid Build Coastguard Worker if (ret == 0) {
41*2d543d20SAndroid Build Coastguard Worker /* Re-map empty attribute values to errors. */
42*2d543d20SAndroid Build Coastguard Worker errno = ENOTSUP;
43*2d543d20SAndroid Build Coastguard Worker ret = -1;
44*2d543d20SAndroid Build Coastguard Worker }
45*2d543d20SAndroid Build Coastguard Worker if (ret < 0)
46*2d543d20SAndroid Build Coastguard Worker free(buf);
47*2d543d20SAndroid Build Coastguard Worker else
48*2d543d20SAndroid Build Coastguard Worker *context = buf;
49*2d543d20SAndroid Build Coastguard Worker return ret;
50*2d543d20SAndroid Build Coastguard Worker }
51*2d543d20SAndroid Build Coastguard Worker
52*2d543d20SAndroid Build Coastguard Worker
getfilecon(const char * path,char ** context)53*2d543d20SAndroid Build Coastguard Worker int getfilecon(const char *path, char ** context)
54*2d543d20SAndroid Build Coastguard Worker {
55*2d543d20SAndroid Build Coastguard Worker int ret;
56*2d543d20SAndroid Build Coastguard Worker char * rcontext = NULL;
57*2d543d20SAndroid Build Coastguard Worker
58*2d543d20SAndroid Build Coastguard Worker *context = NULL;
59*2d543d20SAndroid Build Coastguard Worker
60*2d543d20SAndroid Build Coastguard Worker ret = getfilecon_raw(path, &rcontext);
61*2d543d20SAndroid Build Coastguard Worker
62*2d543d20SAndroid Build Coastguard Worker if (ret > 0) {
63*2d543d20SAndroid Build Coastguard Worker ret = selinux_raw_to_trans_context(rcontext, context);
64*2d543d20SAndroid Build Coastguard Worker freecon(rcontext);
65*2d543d20SAndroid Build Coastguard Worker }
66*2d543d20SAndroid Build Coastguard Worker if (ret >= 0 && *context)
67*2d543d20SAndroid Build Coastguard Worker return strlen(*context) + 1;
68*2d543d20SAndroid Build Coastguard Worker
69*2d543d20SAndroid Build Coastguard Worker return ret;
70*2d543d20SAndroid Build Coastguard Worker }
71*2d543d20SAndroid Build Coastguard Worker
72