|
|
1.1 root 1: /*
2: * Virtio 9p user. xattr callback
3: *
4: * Copyright IBM, Corp. 2010
5: *
6: * Authors:
7: * Aneesh Kumar K.V <[email protected]>
8: *
9: * This work is licensed under the terms of the GNU GPL, version 2. See
10: * the COPYING file in the top-level directory.
11: *
12: */
13:
14: #include <sys/types.h>
15: #include "hw/virtio.h"
16: #include "virtio-9p.h"
17: #include "fsdev/file-op-9p.h"
18: #include "virtio-9p-xattr.h"
19:
20:
21: static ssize_t mp_user_getxattr(FsContext *ctx, const char *path,
22: const char *name, void *value, size_t size)
23: {
24: char buffer[PATH_MAX];
25: if (strncmp(name, "user.virtfs.", 12) == 0) {
26: /*
27: * Don't allow fetch of user.virtfs namesapce
28: * in case of mapped security
29: */
30: errno = ENOATTR;
31: return -1;
32: }
33: return lgetxattr(rpath(ctx, path, buffer), name, value, size);
34: }
35:
36: static ssize_t mp_user_listxattr(FsContext *ctx, const char *path,
37: char *name, void *value, size_t size)
38: {
39: int name_size = strlen(name) + 1;
40: if (strncmp(name, "user.virtfs.", 12) == 0) {
41:
42: /* check if it is a mapped posix acl */
43: if (strncmp(name, "user.virtfs.system.posix_acl_", 29) == 0) {
44: /* adjust the name and size */
45: name += 12;
46: name_size -= 12;
47: } else {
48: /*
49: * Don't allow fetch of user.virtfs namesapce
50: * in case of mapped security
51: */
52: return 0;
53: }
54: }
55: if (!value) {
56: return name_size;
57: }
58:
59: if (size < name_size) {
60: errno = ERANGE;
61: return -1;
62: }
63:
64: strncpy(value, name, name_size);
65: return name_size;
66: }
67:
68: static int mp_user_setxattr(FsContext *ctx, const char *path, const char *name,
69: void *value, size_t size, int flags)
70: {
71: char buffer[PATH_MAX];
72: if (strncmp(name, "user.virtfs.", 12) == 0) {
73: /*
74: * Don't allow fetch of user.virtfs namesapce
75: * in case of mapped security
76: */
77: errno = EACCES;
78: return -1;
79: }
80: return lsetxattr(rpath(ctx, path, buffer), name, value, size, flags);
81: }
82:
83: static int mp_user_removexattr(FsContext *ctx,
84: const char *path, const char *name)
85: {
86: char buffer[PATH_MAX];
87: if (strncmp(name, "user.virtfs.", 12) == 0) {
88: /*
89: * Don't allow fetch of user.virtfs namesapce
90: * in case of mapped security
91: */
92: errno = EACCES;
93: return -1;
94: }
95: return lremovexattr(rpath(ctx, path, buffer), name);
96: }
97:
98: XattrOperations mapped_user_xattr = {
99: .name = "user.",
100: .getxattr = mp_user_getxattr,
101: .setxattr = mp_user_setxattr,
102: .listxattr = mp_user_listxattr,
103: .removexattr = mp_user_removexattr,
104: };
105:
106: XattrOperations passthrough_user_xattr = {
107: .name = "user.",
108: .getxattr = pt_getxattr,
109: .setxattr = pt_setxattr,
110: .listxattr = pt_listxattr,
111: .removexattr = pt_removexattr,
112: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.