root / hw / virtio-9p-xattr.c @ 366c9332
History | View | Annotate | Download (3.8 kB)
1 | fc22118d | Aneesh Kumar K.V | /*
|
---|---|---|---|
2 | fc22118d | Aneesh Kumar K.V | * Virtio 9p xattr callback
|
3 | fc22118d | Aneesh Kumar K.V | *
|
4 | fc22118d | Aneesh Kumar K.V | * Copyright IBM, Corp. 2010
|
5 | fc22118d | Aneesh Kumar K.V | *
|
6 | fc22118d | Aneesh Kumar K.V | * Authors:
|
7 | fc22118d | Aneesh Kumar K.V | * Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
|
8 | fc22118d | Aneesh Kumar K.V | *
|
9 | fc22118d | Aneesh Kumar K.V | * This work is licensed under the terms of the GNU GPL, version 2. See
|
10 | fc22118d | Aneesh Kumar K.V | * the COPYING file in the top-level directory.
|
11 | fc22118d | Aneesh Kumar K.V | *
|
12 | fc22118d | Aneesh Kumar K.V | */
|
13 | fc22118d | Aneesh Kumar K.V | |
14 | fc22118d | Aneesh Kumar K.V | #include "virtio.h" |
15 | fc22118d | Aneesh Kumar K.V | #include "virtio-9p.h" |
16 | fc22118d | Aneesh Kumar K.V | #include "file-op-9p.h" |
17 | fc22118d | Aneesh Kumar K.V | #include "virtio-9p-xattr.h" |
18 | fc22118d | Aneesh Kumar K.V | |
19 | fc22118d | Aneesh Kumar K.V | |
20 | fc22118d | Aneesh Kumar K.V | static XattrOperations *get_xattr_operations(XattrOperations **h,
|
21 | fc22118d | Aneesh Kumar K.V | const char *name) |
22 | fc22118d | Aneesh Kumar K.V | { |
23 | fc22118d | Aneesh Kumar K.V | XattrOperations *xops; |
24 | fc22118d | Aneesh Kumar K.V | for (xops = *(h)++; xops != NULL; xops = *(h)++) { |
25 | fc22118d | Aneesh Kumar K.V | if (!strncmp(name, xops->name, strlen(xops->name))) {
|
26 | fc22118d | Aneesh Kumar K.V | return xops;
|
27 | fc22118d | Aneesh Kumar K.V | } |
28 | fc22118d | Aneesh Kumar K.V | } |
29 | fc22118d | Aneesh Kumar K.V | return NULL; |
30 | fc22118d | Aneesh Kumar K.V | } |
31 | fc22118d | Aneesh Kumar K.V | |
32 | fc22118d | Aneesh Kumar K.V | ssize_t v9fs_get_xattr(FsContext *ctx, const char *path, |
33 | fc22118d | Aneesh Kumar K.V | const char *name, void *value, size_t size) |
34 | fc22118d | Aneesh Kumar K.V | { |
35 | fc22118d | Aneesh Kumar K.V | XattrOperations *xops = get_xattr_operations(ctx->xops, name); |
36 | fc22118d | Aneesh Kumar K.V | if (xops) {
|
37 | fc22118d | Aneesh Kumar K.V | return xops->getxattr(ctx, path, name, value, size);
|
38 | fc22118d | Aneesh Kumar K.V | } |
39 | fc22118d | Aneesh Kumar K.V | errno = -EOPNOTSUPP; |
40 | fc22118d | Aneesh Kumar K.V | return -1; |
41 | fc22118d | Aneesh Kumar K.V | } |
42 | fc22118d | Aneesh Kumar K.V | |
43 | fc22118d | Aneesh Kumar K.V | ssize_t pt_listxattr(FsContext *ctx, const char *path, |
44 | fc22118d | Aneesh Kumar K.V | char *name, void *value, size_t size) |
45 | fc22118d | Aneesh Kumar K.V | { |
46 | fc22118d | Aneesh Kumar K.V | int name_size = strlen(name) + 1; |
47 | fc22118d | Aneesh Kumar K.V | if (!value) {
|
48 | fc22118d | Aneesh Kumar K.V | return name_size;
|
49 | fc22118d | Aneesh Kumar K.V | } |
50 | fc22118d | Aneesh Kumar K.V | |
51 | fc22118d | Aneesh Kumar K.V | if (size < name_size) {
|
52 | fc22118d | Aneesh Kumar K.V | errno = ERANGE; |
53 | fc22118d | Aneesh Kumar K.V | return -1; |
54 | fc22118d | Aneesh Kumar K.V | } |
55 | fc22118d | Aneesh Kumar K.V | |
56 | fc22118d | Aneesh Kumar K.V | strncpy(value, name, name_size); |
57 | fc22118d | Aneesh Kumar K.V | return name_size;
|
58 | fc22118d | Aneesh Kumar K.V | } |
59 | fc22118d | Aneesh Kumar K.V | |
60 | fc22118d | Aneesh Kumar K.V | |
61 | fc22118d | Aneesh Kumar K.V | /*
|
62 | fc22118d | Aneesh Kumar K.V | * Get the list and pass to each layer to find out whether
|
63 | fc22118d | Aneesh Kumar K.V | * to send the data or not
|
64 | fc22118d | Aneesh Kumar K.V | */
|
65 | fc22118d | Aneesh Kumar K.V | ssize_t v9fs_list_xattr(FsContext *ctx, const char *path, |
66 | fc22118d | Aneesh Kumar K.V | void *value, size_t vsize)
|
67 | fc22118d | Aneesh Kumar K.V | { |
68 | fc22118d | Aneesh Kumar K.V | ssize_t size = 0;
|
69 | fc22118d | Aneesh Kumar K.V | void *ovalue = value;
|
70 | fc22118d | Aneesh Kumar K.V | XattrOperations *xops; |
71 | fc22118d | Aneesh Kumar K.V | char *orig_value, *orig_value_start;
|
72 | fc22118d | Aneesh Kumar K.V | ssize_t xattr_len, parsed_len = 0, attr_len;
|
73 | fc22118d | Aneesh Kumar K.V | |
74 | fc22118d | Aneesh Kumar K.V | /* Get the actual len */
|
75 | fc22118d | Aneesh Kumar K.V | xattr_len = llistxattr(rpath(ctx, path), value, 0);
|
76 | 0562c674 | Kusanagi Kouichi | if (xattr_len <= 0) { |
77 | 0562c674 | Kusanagi Kouichi | return xattr_len;
|
78 | 0562c674 | Kusanagi Kouichi | } |
79 | fc22118d | Aneesh Kumar K.V | |
80 | fc22118d | Aneesh Kumar K.V | /* Now fetch the xattr and find the actual size */
|
81 | fc22118d | Aneesh Kumar K.V | orig_value = qemu_malloc(xattr_len); |
82 | fc22118d | Aneesh Kumar K.V | xattr_len = llistxattr(rpath(ctx, path), orig_value, xattr_len); |
83 | fc22118d | Aneesh Kumar K.V | |
84 | fc22118d | Aneesh Kumar K.V | /* store the orig pointer */
|
85 | fc22118d | Aneesh Kumar K.V | orig_value_start = orig_value; |
86 | fc22118d | Aneesh Kumar K.V | while (xattr_len > parsed_len) {
|
87 | fc22118d | Aneesh Kumar K.V | xops = get_xattr_operations(ctx->xops, orig_value); |
88 | fc22118d | Aneesh Kumar K.V | if (!xops) {
|
89 | fc22118d | Aneesh Kumar K.V | goto next_entry;
|
90 | fc22118d | Aneesh Kumar K.V | } |
91 | fc22118d | Aneesh Kumar K.V | |
92 | fc22118d | Aneesh Kumar K.V | if (!value) {
|
93 | fc22118d | Aneesh Kumar K.V | size += xops->listxattr(ctx, path, orig_value, value, vsize); |
94 | fc22118d | Aneesh Kumar K.V | } else {
|
95 | fc22118d | Aneesh Kumar K.V | size = xops->listxattr(ctx, path, orig_value, value, vsize); |
96 | fc22118d | Aneesh Kumar K.V | if (size < 0) { |
97 | fc22118d | Aneesh Kumar K.V | goto err_out;
|
98 | fc22118d | Aneesh Kumar K.V | } |
99 | fc22118d | Aneesh Kumar K.V | value += size; |
100 | fc22118d | Aneesh Kumar K.V | vsize -= size; |
101 | fc22118d | Aneesh Kumar K.V | } |
102 | fc22118d | Aneesh Kumar K.V | next_entry:
|
103 | fc22118d | Aneesh Kumar K.V | /* Got the next entry */
|
104 | fc22118d | Aneesh Kumar K.V | attr_len = strlen(orig_value) + 1;
|
105 | fc22118d | Aneesh Kumar K.V | parsed_len += attr_len; |
106 | fc22118d | Aneesh Kumar K.V | orig_value += attr_len; |
107 | fc22118d | Aneesh Kumar K.V | } |
108 | fc22118d | Aneesh Kumar K.V | if (value) {
|
109 | fc22118d | Aneesh Kumar K.V | size = value - ovalue; |
110 | fc22118d | Aneesh Kumar K.V | } |
111 | fc22118d | Aneesh Kumar K.V | |
112 | fc22118d | Aneesh Kumar K.V | err_out:
|
113 | fc22118d | Aneesh Kumar K.V | qemu_free(orig_value_start); |
114 | fc22118d | Aneesh Kumar K.V | return size;
|
115 | fc22118d | Aneesh Kumar K.V | } |
116 | fc22118d | Aneesh Kumar K.V | |
117 | fc22118d | Aneesh Kumar K.V | int v9fs_set_xattr(FsContext *ctx, const char *path, const char *name, |
118 | fc22118d | Aneesh Kumar K.V | void *value, size_t size, int flags) |
119 | fc22118d | Aneesh Kumar K.V | { |
120 | fc22118d | Aneesh Kumar K.V | XattrOperations *xops = get_xattr_operations(ctx->xops, name); |
121 | fc22118d | Aneesh Kumar K.V | if (xops) {
|
122 | fc22118d | Aneesh Kumar K.V | return xops->setxattr(ctx, path, name, value, size, flags);
|
123 | fc22118d | Aneesh Kumar K.V | } |
124 | fc22118d | Aneesh Kumar K.V | errno = -EOPNOTSUPP; |
125 | fc22118d | Aneesh Kumar K.V | return -1; |
126 | fc22118d | Aneesh Kumar K.V | |
127 | fc22118d | Aneesh Kumar K.V | } |
128 | fc22118d | Aneesh Kumar K.V | |
129 | fc22118d | Aneesh Kumar K.V | int v9fs_remove_xattr(FsContext *ctx,
|
130 | fc22118d | Aneesh Kumar K.V | const char *path, const char *name) |
131 | fc22118d | Aneesh Kumar K.V | { |
132 | fc22118d | Aneesh Kumar K.V | XattrOperations *xops = get_xattr_operations(ctx->xops, name); |
133 | fc22118d | Aneesh Kumar K.V | if (xops) {
|
134 | fc22118d | Aneesh Kumar K.V | return xops->removexattr(ctx, path, name);
|
135 | fc22118d | Aneesh Kumar K.V | } |
136 | fc22118d | Aneesh Kumar K.V | errno = -EOPNOTSUPP; |
137 | fc22118d | Aneesh Kumar K.V | return -1; |
138 | fc22118d | Aneesh Kumar K.V | |
139 | fc22118d | Aneesh Kumar K.V | } |
140 | fc22118d | Aneesh Kumar K.V | |
141 | fc22118d | Aneesh Kumar K.V | XattrOperations *mapped_xattr_ops[] = { |
142 | fc22118d | Aneesh Kumar K.V | &mapped_user_xattr, |
143 | 70fc55eb | Aneesh Kumar K.V | &mapped_pacl_xattr, |
144 | 70fc55eb | Aneesh Kumar K.V | &mapped_dacl_xattr, |
145 | fc22118d | Aneesh Kumar K.V | NULL,
|
146 | fc22118d | Aneesh Kumar K.V | }; |
147 | fc22118d | Aneesh Kumar K.V | |
148 | fc22118d | Aneesh Kumar K.V | XattrOperations *passthrough_xattr_ops[] = { |
149 | fc22118d | Aneesh Kumar K.V | &passthrough_user_xattr, |
150 | 70fc55eb | Aneesh Kumar K.V | &passthrough_acl_xattr, |
151 | fc22118d | Aneesh Kumar K.V | NULL,
|
152 | fc22118d | Aneesh Kumar K.V | }; |
153 | fc22118d | Aneesh Kumar K.V | |
154 | fc22118d | Aneesh Kumar K.V | /* for .user none model should be same as passthrough */
|
155 | fc22118d | Aneesh Kumar K.V | XattrOperations *none_xattr_ops[] = { |
156 | fc22118d | Aneesh Kumar K.V | &passthrough_user_xattr, |
157 | 70fc55eb | Aneesh Kumar K.V | &none_acl_xattr, |
158 | fc22118d | Aneesh Kumar K.V | NULL,
|
159 | fc22118d | Aneesh Kumar K.V | }; |