blob: d1fb821b23ef0eb2dd9235bbcf401d82b5cf5ad5 [file] [log] [blame]
Joshua Brindle13cd4c82008-08-19 15:30:36 -04001#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
Stephen Smalley9eb9c932014-02-19 09:16:17 -050010int lgetfilecon_raw(const char *path, char ** context)
Joshua Brindle13cd4c82008-08-19 15:30:36 -040011{
12 char *buf;
13 ssize_t size;
14 ssize_t ret;
15
16 size = INITCONTEXTLEN + 1;
17 buf = malloc(size);
18 if (!buf)
19 return -1;
20 memset(buf, 0, size);
21
22 ret = lgetxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
23 if (ret < 0 && errno == ERANGE) {
24 char *newbuf;
25
26 size = lgetxattr(path, XATTR_NAME_SELINUX, NULL, 0);
27 if (size < 0)
28 goto out;
29
30 size++;
31 newbuf = realloc(buf, size);
32 if (!newbuf)
33 goto out;
34
35 buf = newbuf;
36 memset(buf, 0, size);
37 ret = lgetxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
38 }
39 out:
40 if (ret == 0) {
41 /* Re-map empty attribute values to errors. */
Guillem Joverbe2d7282012-11-13 21:17:11 +010042 errno = ENOTSUP;
Joshua Brindle13cd4c82008-08-19 15:30:36 -040043 ret = -1;
44 }
45 if (ret < 0)
46 free(buf);
47 else
48 *context = buf;
49 return ret;
50}
51
Joshua Brindle13cd4c82008-08-19 15:30:36 -040052
Stephen Smalley9eb9c932014-02-19 09:16:17 -050053int lgetfilecon(const char *path, char ** context)
Joshua Brindle13cd4c82008-08-19 15:30:36 -040054{
55 int ret;
Guido Trentalancia5db45372016-12-23 16:16:54 +010056 char * rcontext = NULL;
Joshua Brindle13cd4c82008-08-19 15:30:36 -040057
58 *context = NULL;
59
60 ret = lgetfilecon_raw(path, &rcontext);
61
62 if (ret > 0) {
63 ret = selinux_raw_to_trans_context(rcontext, context);
64 freecon(rcontext);
65 }
66
67 if (ret >= 0 && *context)
68 return strlen(*context) + 1;
69 return ret;
70}