root / hw / virtio-9p-local.c @ 72aef731
History | View | Annotate | Download (16.4 kB)
1 | 9f107513 | Anthony Liguori | /*
|
---|---|---|---|
2 | 9f107513 | Anthony Liguori | * Virtio 9p Posix callback
|
3 | 9f107513 | Anthony Liguori | *
|
4 | 9f107513 | Anthony Liguori | * Copyright IBM, Corp. 2010
|
5 | 9f107513 | Anthony Liguori | *
|
6 | 9f107513 | Anthony Liguori | * Authors:
|
7 | 9f107513 | Anthony Liguori | * Anthony Liguori <aliguori@us.ibm.com>
|
8 | 9f107513 | Anthony Liguori | *
|
9 | 9f107513 | Anthony Liguori | * This work is licensed under the terms of the GNU GPL, version 2. See
|
10 | 9f107513 | Anthony Liguori | * the COPYING file in the top-level directory.
|
11 | 9f107513 | Anthony Liguori | *
|
12 | 9f107513 | Anthony Liguori | */
|
13 | 9f107513 | Anthony Liguori | #include "virtio.h" |
14 | 9f107513 | Anthony Liguori | #include "virtio-9p.h" |
15 | c494dd6f | Anthony Liguori | #include <arpa/inet.h> |
16 | 131dcb25 | Anthony Liguori | #include <pwd.h> |
17 | 131dcb25 | Anthony Liguori | #include <grp.h> |
18 | c494dd6f | Anthony Liguori | #include <sys/socket.h> |
19 | c494dd6f | Anthony Liguori | #include <sys/un.h> |
20 | 758e8e38 | Venkateswararao Jujjuri (JV) | #include <attr/xattr.h> |
21 | 131dcb25 | Anthony Liguori | |
22 | 131dcb25 | Anthony Liguori | static const char *rpath(FsContext *ctx, const char *path) |
23 | 131dcb25 | Anthony Liguori | { |
24 | 131dcb25 | Anthony Liguori | /* FIXME: so wrong... */
|
25 | 131dcb25 | Anthony Liguori | static char buffer[4096]; |
26 | 131dcb25 | Anthony Liguori | snprintf(buffer, sizeof(buffer), "%s/%s", ctx->fs_root, path); |
27 | 131dcb25 | Anthony Liguori | return buffer;
|
28 | 131dcb25 | Anthony Liguori | } |
29 | 131dcb25 | Anthony Liguori | |
30 | 1237ad76 | Venkateswararao Jujjuri (JV) | |
31 | 1237ad76 | Venkateswararao Jujjuri (JV) | static int local_lstat(FsContext *fs_ctx, const char *path, struct stat *stbuf) |
32 | 131dcb25 | Anthony Liguori | { |
33 | 1237ad76 | Venkateswararao Jujjuri (JV) | int err;
|
34 | 1237ad76 | Venkateswararao Jujjuri (JV) | err = lstat(rpath(fs_ctx, path), stbuf); |
35 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (err) {
|
36 | 1237ad76 | Venkateswararao Jujjuri (JV) | return err;
|
37 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
38 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
39 | 1237ad76 | Venkateswararao Jujjuri (JV) | /* Actual credentials are part of extended attrs */
|
40 | 1237ad76 | Venkateswararao Jujjuri (JV) | uid_t tmp_uid; |
41 | 1237ad76 | Venkateswararao Jujjuri (JV) | gid_t tmp_gid; |
42 | 1237ad76 | Venkateswararao Jujjuri (JV) | mode_t tmp_mode; |
43 | 1237ad76 | Venkateswararao Jujjuri (JV) | dev_t tmp_dev; |
44 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (getxattr(rpath(fs_ctx, path), "user.virtfs.uid", &tmp_uid, |
45 | 1237ad76 | Venkateswararao Jujjuri (JV) | sizeof(uid_t)) > 0) { |
46 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_uid = tmp_uid; |
47 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
48 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (getxattr(rpath(fs_ctx, path), "user.virtfs.gid", &tmp_gid, |
49 | 1237ad76 | Venkateswararao Jujjuri (JV) | sizeof(gid_t)) > 0) { |
50 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_gid = tmp_gid; |
51 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
52 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (getxattr(rpath(fs_ctx, path), "user.virtfs.mode", &tmp_mode, |
53 | 1237ad76 | Venkateswararao Jujjuri (JV) | sizeof(mode_t)) > 0) { |
54 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_mode = tmp_mode; |
55 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
56 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (getxattr(rpath(fs_ctx, path), "user.virtfs.rdev", &tmp_dev, |
57 | 1237ad76 | Venkateswararao Jujjuri (JV) | sizeof(dev_t)) > 0) { |
58 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_rdev = tmp_dev; |
59 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
60 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
61 | 1237ad76 | Venkateswararao Jujjuri (JV) | return err;
|
62 | 131dcb25 | Anthony Liguori | } |
63 | 131dcb25 | Anthony Liguori | |
64 | 758e8e38 | Venkateswararao Jujjuri (JV) | static int local_set_xattr(const char *path, FsCred *credp) |
65 | 131dcb25 | Anthony Liguori | { |
66 | 758e8e38 | Venkateswararao Jujjuri (JV) | int err;
|
67 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (credp->fc_uid != -1) { |
68 | 758e8e38 | Venkateswararao Jujjuri (JV) | err = setxattr(path, "user.virtfs.uid", &credp->fc_uid, sizeof(uid_t), |
69 | 758e8e38 | Venkateswararao Jujjuri (JV) | 0);
|
70 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (err) {
|
71 | 758e8e38 | Venkateswararao Jujjuri (JV) | return err;
|
72 | 758e8e38 | Venkateswararao Jujjuri (JV) | } |
73 | 131dcb25 | Anthony Liguori | } |
74 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (credp->fc_gid != -1) { |
75 | 758e8e38 | Venkateswararao Jujjuri (JV) | err = setxattr(path, "user.virtfs.gid", &credp->fc_gid, sizeof(gid_t), |
76 | 758e8e38 | Venkateswararao Jujjuri (JV) | 0);
|
77 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (err) {
|
78 | 758e8e38 | Venkateswararao Jujjuri (JV) | return err;
|
79 | 758e8e38 | Venkateswararao Jujjuri (JV) | } |
80 | 131dcb25 | Anthony Liguori | } |
81 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (credp->fc_mode != -1) { |
82 | 758e8e38 | Venkateswararao Jujjuri (JV) | err = setxattr(path, "user.virtfs.mode", &credp->fc_mode,
|
83 | 758e8e38 | Venkateswararao Jujjuri (JV) | sizeof(mode_t), 0); |
84 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (err) {
|
85 | 758e8e38 | Venkateswararao Jujjuri (JV) | return err;
|
86 | 758e8e38 | Venkateswararao Jujjuri (JV) | } |
87 | 131dcb25 | Anthony Liguori | } |
88 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (credp->fc_rdev != -1) { |
89 | 758e8e38 | Venkateswararao Jujjuri (JV) | err = setxattr(path, "user.virtfs.rdev", &credp->fc_rdev,
|
90 | 758e8e38 | Venkateswararao Jujjuri (JV) | sizeof(dev_t), 0); |
91 | 758e8e38 | Venkateswararao Jujjuri (JV) | if (err) {
|
92 | 758e8e38 | Venkateswararao Jujjuri (JV) | return err;
|
93 | 758e8e38 | Venkateswararao Jujjuri (JV) | } |
94 | 131dcb25 | Anthony Liguori | } |
95 | 131dcb25 | Anthony Liguori | return 0; |
96 | 131dcb25 | Anthony Liguori | } |
97 | 131dcb25 | Anthony Liguori | |
98 | 4750a96f | Venkateswararao Jujjuri (JV) | static int local_post_create_passthrough(FsContext *fs_ctx, const char *path, |
99 | 4750a96f | Venkateswararao Jujjuri (JV) | FsCred *credp) |
100 | 4750a96f | Venkateswararao Jujjuri (JV) | { |
101 | 4750a96f | Venkateswararao Jujjuri (JV) | if (chmod(rpath(fs_ctx, path), credp->fc_mode & 07777) < 0) { |
102 | 4750a96f | Venkateswararao Jujjuri (JV) | return -1; |
103 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
104 | 5c0f255d | Aneesh Kumar K.V | if (lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid) < 0) { |
105 | 12848bfc | Aneesh Kumar K.V | /*
|
106 | 12848bfc | Aneesh Kumar K.V | * If we fail to change ownership and if we are
|
107 | 12848bfc | Aneesh Kumar K.V | * using security model none. Ignore the error
|
108 | 12848bfc | Aneesh Kumar K.V | */
|
109 | 12848bfc | Aneesh Kumar K.V | if (fs_ctx->fs_sm != SM_NONE) {
|
110 | 12848bfc | Aneesh Kumar K.V | return -1; |
111 | 12848bfc | Aneesh Kumar K.V | } |
112 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
113 | 4750a96f | Venkateswararao Jujjuri (JV) | return 0; |
114 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
115 | 4750a96f | Venkateswararao Jujjuri (JV) | |
116 | 879c2813 | Venkateswararao Jujjuri (JV) | static ssize_t local_readlink(FsContext *fs_ctx, const char *path, |
117 | 879c2813 | Venkateswararao Jujjuri (JV) | char *buf, size_t bufsz)
|
118 | 131dcb25 | Anthony Liguori | { |
119 | 879c2813 | Venkateswararao Jujjuri (JV) | ssize_t tsize = -1;
|
120 | 879c2813 | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
121 | 879c2813 | Venkateswararao Jujjuri (JV) | int fd;
|
122 | 879c2813 | Venkateswararao Jujjuri (JV) | fd = open(rpath(fs_ctx, path), O_RDONLY); |
123 | 879c2813 | Venkateswararao Jujjuri (JV) | if (fd == -1) { |
124 | 879c2813 | Venkateswararao Jujjuri (JV) | return -1; |
125 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
126 | 879c2813 | Venkateswararao Jujjuri (JV) | do {
|
127 | 879c2813 | Venkateswararao Jujjuri (JV) | tsize = read(fd, (void *)buf, bufsz);
|
128 | 879c2813 | Venkateswararao Jujjuri (JV) | } while (tsize == -1 && errno == EINTR); |
129 | 879c2813 | Venkateswararao Jujjuri (JV) | close(fd); |
130 | 879c2813 | Venkateswararao Jujjuri (JV) | return tsize;
|
131 | 12848bfc | Aneesh Kumar K.V | } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) || |
132 | 12848bfc | Aneesh Kumar K.V | (fs_ctx->fs_sm == SM_NONE)) { |
133 | 879c2813 | Venkateswararao Jujjuri (JV) | tsize = readlink(rpath(fs_ctx, path), buf, bufsz); |
134 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
135 | 879c2813 | Venkateswararao Jujjuri (JV) | return tsize;
|
136 | 131dcb25 | Anthony Liguori | } |
137 | 131dcb25 | Anthony Liguori | |
138 | 131dcb25 | Anthony Liguori | static int local_close(FsContext *ctx, int fd) |
139 | 131dcb25 | Anthony Liguori | { |
140 | 131dcb25 | Anthony Liguori | return close(fd);
|
141 | 131dcb25 | Anthony Liguori | } |
142 | 131dcb25 | Anthony Liguori | |
143 | 131dcb25 | Anthony Liguori | static int local_closedir(FsContext *ctx, DIR *dir) |
144 | 131dcb25 | Anthony Liguori | { |
145 | 131dcb25 | Anthony Liguori | return closedir(dir);
|
146 | 131dcb25 | Anthony Liguori | } |
147 | 9f107513 | Anthony Liguori | |
148 | a6568fe2 | Anthony Liguori | static int local_open(FsContext *ctx, const char *path, int flags) |
149 | a6568fe2 | Anthony Liguori | { |
150 | a6568fe2 | Anthony Liguori | return open(rpath(ctx, path), flags);
|
151 | a6568fe2 | Anthony Liguori | } |
152 | a6568fe2 | Anthony Liguori | |
153 | a6568fe2 | Anthony Liguori | static DIR *local_opendir(FsContext *ctx, const char *path) |
154 | a6568fe2 | Anthony Liguori | { |
155 | a6568fe2 | Anthony Liguori | return opendir(rpath(ctx, path));
|
156 | a6568fe2 | Anthony Liguori | } |
157 | a6568fe2 | Anthony Liguori | |
158 | a9231555 | Anthony Liguori | static void local_rewinddir(FsContext *ctx, DIR *dir) |
159 | a9231555 | Anthony Liguori | { |
160 | a9231555 | Anthony Liguori | return rewinddir(dir);
|
161 | a9231555 | Anthony Liguori | } |
162 | a9231555 | Anthony Liguori | |
163 | a9231555 | Anthony Liguori | static off_t local_telldir(FsContext *ctx, DIR *dir)
|
164 | a9231555 | Anthony Liguori | { |
165 | a9231555 | Anthony Liguori | return telldir(dir);
|
166 | a9231555 | Anthony Liguori | } |
167 | a9231555 | Anthony Liguori | |
168 | a9231555 | Anthony Liguori | static struct dirent *local_readdir(FsContext *ctx, DIR *dir) |
169 | a9231555 | Anthony Liguori | { |
170 | a9231555 | Anthony Liguori | return readdir(dir);
|
171 | a9231555 | Anthony Liguori | } |
172 | a9231555 | Anthony Liguori | |
173 | a9231555 | Anthony Liguori | static void local_seekdir(FsContext *ctx, DIR *dir, off_t off) |
174 | a9231555 | Anthony Liguori | { |
175 | a9231555 | Anthony Liguori | return seekdir(dir, off);
|
176 | a9231555 | Anthony Liguori | } |
177 | a9231555 | Anthony Liguori | |
178 | a9231555 | Anthony Liguori | static ssize_t local_readv(FsContext *ctx, int fd, const struct iovec *iov, |
179 | a9231555 | Anthony Liguori | int iovcnt)
|
180 | a9231555 | Anthony Liguori | { |
181 | a9231555 | Anthony Liguori | return readv(fd, iov, iovcnt);
|
182 | a9231555 | Anthony Liguori | } |
183 | a9231555 | Anthony Liguori | |
184 | a9231555 | Anthony Liguori | static off_t local_lseek(FsContext *ctx, int fd, off_t offset, int whence) |
185 | a9231555 | Anthony Liguori | { |
186 | a9231555 | Anthony Liguori | return lseek(fd, offset, whence);
|
187 | a9231555 | Anthony Liguori | } |
188 | a9231555 | Anthony Liguori | |
189 | 8449360c | Anthony Liguori | static ssize_t local_writev(FsContext *ctx, int fd, const struct iovec *iov, |
190 | 8449360c | Anthony Liguori | int iovcnt)
|
191 | 8449360c | Anthony Liguori | { |
192 | 8449360c | Anthony Liguori | return writev(fd, iov, iovcnt);
|
193 | 8449360c | Anthony Liguori | } |
194 | 8449360c | Anthony Liguori | |
195 | e95ead32 | Venkateswararao Jujjuri (JV) | static int local_chmod(FsContext *fs_ctx, const char *path, FsCred *credp) |
196 | c494dd6f | Anthony Liguori | { |
197 | e95ead32 | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
198 | e95ead32 | Venkateswararao Jujjuri (JV) | return local_set_xattr(rpath(fs_ctx, path), credp);
|
199 | 12848bfc | Aneesh Kumar K.V | } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) || |
200 | 12848bfc | Aneesh Kumar K.V | (fs_ctx->fs_sm == SM_NONE)) { |
201 | e95ead32 | Venkateswararao Jujjuri (JV) | return chmod(rpath(fs_ctx, path), credp->fc_mode);
|
202 | e95ead32 | Venkateswararao Jujjuri (JV) | } |
203 | e95ead32 | Venkateswararao Jujjuri (JV) | return -1; |
204 | c494dd6f | Anthony Liguori | } |
205 | c494dd6f | Anthony Liguori | |
206 | 1c293312 | Venkateswararao Jujjuri (JV) | static int local_mknod(FsContext *fs_ctx, const char *path, FsCred *credp) |
207 | c494dd6f | Anthony Liguori | { |
208 | 1c293312 | Venkateswararao Jujjuri (JV) | int err = -1; |
209 | 1c293312 | Venkateswararao Jujjuri (JV) | int serrno = 0; |
210 | 1c293312 | Venkateswararao Jujjuri (JV) | |
211 | 1c293312 | Venkateswararao Jujjuri (JV) | /* Determine the security model */
|
212 | 1c293312 | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
213 | 1c293312 | Venkateswararao Jujjuri (JV) | err = mknod(rpath(fs_ctx, path), SM_LOCAL_MODE_BITS|S_IFREG, 0);
|
214 | 1c293312 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
215 | 1c293312 | Venkateswararao Jujjuri (JV) | return err;
|
216 | 1c293312 | Venkateswararao Jujjuri (JV) | } |
217 | 1c293312 | Venkateswararao Jujjuri (JV) | local_set_xattr(rpath(fs_ctx, path), credp); |
218 | 1c293312 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
219 | 1c293312 | Venkateswararao Jujjuri (JV) | serrno = errno; |
220 | 1c293312 | Venkateswararao Jujjuri (JV) | goto err_end;
|
221 | 1c293312 | Venkateswararao Jujjuri (JV) | } |
222 | 12848bfc | Aneesh Kumar K.V | } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) || |
223 | 12848bfc | Aneesh Kumar K.V | (fs_ctx->fs_sm == SM_NONE)) { |
224 | 1c293312 | Venkateswararao Jujjuri (JV) | err = mknod(rpath(fs_ctx, path), credp->fc_mode, credp->fc_rdev); |
225 | 1c293312 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
226 | 1c293312 | Venkateswararao Jujjuri (JV) | return err;
|
227 | 1c293312 | Venkateswararao Jujjuri (JV) | } |
228 | 1c293312 | Venkateswararao Jujjuri (JV) | err = local_post_create_passthrough(fs_ctx, path, credp); |
229 | 1c293312 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
230 | 1c293312 | Venkateswararao Jujjuri (JV) | serrno = errno; |
231 | 1c293312 | Venkateswararao Jujjuri (JV) | goto err_end;
|
232 | 1c293312 | Venkateswararao Jujjuri (JV) | } |
233 | 1c293312 | Venkateswararao Jujjuri (JV) | } |
234 | 1c293312 | Venkateswararao Jujjuri (JV) | return err;
|
235 | 1c293312 | Venkateswararao Jujjuri (JV) | |
236 | 1c293312 | Venkateswararao Jujjuri (JV) | err_end:
|
237 | 1c293312 | Venkateswararao Jujjuri (JV) | remove(rpath(fs_ctx, path)); |
238 | 1c293312 | Venkateswararao Jujjuri (JV) | errno = serrno; |
239 | 1c293312 | Venkateswararao Jujjuri (JV) | return err;
|
240 | c494dd6f | Anthony Liguori | } |
241 | c494dd6f | Anthony Liguori | |
242 | 00ec5c37 | Venkateswararao Jujjuri (JV) | static int local_mkdir(FsContext *fs_ctx, const char *path, FsCred *credp) |
243 | c494dd6f | Anthony Liguori | { |
244 | 00ec5c37 | Venkateswararao Jujjuri (JV) | int err = -1; |
245 | 00ec5c37 | Venkateswararao Jujjuri (JV) | int serrno = 0; |
246 | 00ec5c37 | Venkateswararao Jujjuri (JV) | |
247 | 00ec5c37 | Venkateswararao Jujjuri (JV) | /* Determine the security model */
|
248 | 00ec5c37 | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
249 | 00ec5c37 | Venkateswararao Jujjuri (JV) | err = mkdir(rpath(fs_ctx, path), SM_LOCAL_DIR_MODE_BITS); |
250 | 00ec5c37 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
251 | 00ec5c37 | Venkateswararao Jujjuri (JV) | return err;
|
252 | 00ec5c37 | Venkateswararao Jujjuri (JV) | } |
253 | 00ec5c37 | Venkateswararao Jujjuri (JV) | credp->fc_mode = credp->fc_mode|S_IFDIR; |
254 | 00ec5c37 | Venkateswararao Jujjuri (JV) | err = local_set_xattr(rpath(fs_ctx, path), credp); |
255 | 00ec5c37 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
256 | 00ec5c37 | Venkateswararao Jujjuri (JV) | serrno = errno; |
257 | 00ec5c37 | Venkateswararao Jujjuri (JV) | goto err_end;
|
258 | 00ec5c37 | Venkateswararao Jujjuri (JV) | } |
259 | 12848bfc | Aneesh Kumar K.V | } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) || |
260 | 12848bfc | Aneesh Kumar K.V | (fs_ctx->fs_sm == SM_NONE)) { |
261 | 00ec5c37 | Venkateswararao Jujjuri (JV) | err = mkdir(rpath(fs_ctx, path), credp->fc_mode); |
262 | 00ec5c37 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
263 | 00ec5c37 | Venkateswararao Jujjuri (JV) | return err;
|
264 | 00ec5c37 | Venkateswararao Jujjuri (JV) | } |
265 | 00ec5c37 | Venkateswararao Jujjuri (JV) | err = local_post_create_passthrough(fs_ctx, path, credp); |
266 | 00ec5c37 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
267 | 00ec5c37 | Venkateswararao Jujjuri (JV) | serrno = errno; |
268 | 00ec5c37 | Venkateswararao Jujjuri (JV) | goto err_end;
|
269 | 00ec5c37 | Venkateswararao Jujjuri (JV) | } |
270 | 00ec5c37 | Venkateswararao Jujjuri (JV) | } |
271 | 00ec5c37 | Venkateswararao Jujjuri (JV) | return err;
|
272 | 00ec5c37 | Venkateswararao Jujjuri (JV) | |
273 | 00ec5c37 | Venkateswararao Jujjuri (JV) | err_end:
|
274 | 00ec5c37 | Venkateswararao Jujjuri (JV) | remove(rpath(fs_ctx, path)); |
275 | 00ec5c37 | Venkateswararao Jujjuri (JV) | errno = serrno; |
276 | 00ec5c37 | Venkateswararao Jujjuri (JV) | return err;
|
277 | c494dd6f | Anthony Liguori | } |
278 | c494dd6f | Anthony Liguori | |
279 | 1237ad76 | Venkateswararao Jujjuri (JV) | static int local_fstat(FsContext *fs_ctx, int fd, struct stat *stbuf) |
280 | c494dd6f | Anthony Liguori | { |
281 | 1237ad76 | Venkateswararao Jujjuri (JV) | int err;
|
282 | 1237ad76 | Venkateswararao Jujjuri (JV) | err = fstat(fd, stbuf); |
283 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (err) {
|
284 | 1237ad76 | Venkateswararao Jujjuri (JV) | return err;
|
285 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
286 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
287 | 1237ad76 | Venkateswararao Jujjuri (JV) | /* Actual credentials are part of extended attrs */
|
288 | 1237ad76 | Venkateswararao Jujjuri (JV) | uid_t tmp_uid; |
289 | 1237ad76 | Venkateswararao Jujjuri (JV) | gid_t tmp_gid; |
290 | 1237ad76 | Venkateswararao Jujjuri (JV) | mode_t tmp_mode; |
291 | 1237ad76 | Venkateswararao Jujjuri (JV) | dev_t tmp_dev; |
292 | 1237ad76 | Venkateswararao Jujjuri (JV) | |
293 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (fgetxattr(fd, "user.virtfs.uid", &tmp_uid, sizeof(uid_t)) > 0) { |
294 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_uid = tmp_uid; |
295 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
296 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (fgetxattr(fd, "user.virtfs.gid", &tmp_gid, sizeof(gid_t)) > 0) { |
297 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_gid = tmp_gid; |
298 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
299 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (fgetxattr(fd, "user.virtfs.mode", &tmp_mode, sizeof(mode_t)) > 0) { |
300 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_mode = tmp_mode; |
301 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
302 | 1237ad76 | Venkateswararao Jujjuri (JV) | if (fgetxattr(fd, "user.virtfs.rdev", &tmp_dev, sizeof(dev_t)) > 0) { |
303 | 1237ad76 | Venkateswararao Jujjuri (JV) | stbuf->st_rdev = tmp_dev; |
304 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
305 | 1237ad76 | Venkateswararao Jujjuri (JV) | } |
306 | 1237ad76 | Venkateswararao Jujjuri (JV) | return err;
|
307 | c494dd6f | Anthony Liguori | } |
308 | c494dd6f | Anthony Liguori | |
309 | 4750a96f | Venkateswararao Jujjuri (JV) | static int local_open2(FsContext *fs_ctx, const char *path, int flags, |
310 | 4750a96f | Venkateswararao Jujjuri (JV) | FsCred *credp) |
311 | c494dd6f | Anthony Liguori | { |
312 | 4750a96f | Venkateswararao Jujjuri (JV) | int fd = -1; |
313 | 4750a96f | Venkateswararao Jujjuri (JV) | int err = -1; |
314 | 4750a96f | Venkateswararao Jujjuri (JV) | int serrno = 0; |
315 | 4750a96f | Venkateswararao Jujjuri (JV) | |
316 | 4750a96f | Venkateswararao Jujjuri (JV) | /* Determine the security model */
|
317 | 4750a96f | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
318 | 4750a96f | Venkateswararao Jujjuri (JV) | fd = open(rpath(fs_ctx, path), flags, SM_LOCAL_MODE_BITS); |
319 | 4750a96f | Venkateswararao Jujjuri (JV) | if (fd == -1) { |
320 | 4750a96f | Venkateswararao Jujjuri (JV) | return fd;
|
321 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
322 | 4750a96f | Venkateswararao Jujjuri (JV) | credp->fc_mode = credp->fc_mode|S_IFREG; |
323 | 4750a96f | Venkateswararao Jujjuri (JV) | /* Set cleint credentials in xattr */
|
324 | 4750a96f | Venkateswararao Jujjuri (JV) | err = local_set_xattr(rpath(fs_ctx, path), credp); |
325 | 4750a96f | Venkateswararao Jujjuri (JV) | if (err == -1) { |
326 | 4750a96f | Venkateswararao Jujjuri (JV) | serrno = errno; |
327 | 4750a96f | Venkateswararao Jujjuri (JV) | goto err_end;
|
328 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
329 | 12848bfc | Aneesh Kumar K.V | } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) || |
330 | 12848bfc | Aneesh Kumar K.V | (fs_ctx->fs_sm == SM_NONE)) { |
331 | 4750a96f | Venkateswararao Jujjuri (JV) | fd = open(rpath(fs_ctx, path), flags, credp->fc_mode); |
332 | 4750a96f | Venkateswararao Jujjuri (JV) | if (fd == -1) { |
333 | 4750a96f | Venkateswararao Jujjuri (JV) | return fd;
|
334 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
335 | 4750a96f | Venkateswararao Jujjuri (JV) | err = local_post_create_passthrough(fs_ctx, path, credp); |
336 | 4750a96f | Venkateswararao Jujjuri (JV) | if (err == -1) { |
337 | 4750a96f | Venkateswararao Jujjuri (JV) | serrno = errno; |
338 | 4750a96f | Venkateswararao Jujjuri (JV) | goto err_end;
|
339 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
340 | 4750a96f | Venkateswararao Jujjuri (JV) | } |
341 | 4750a96f | Venkateswararao Jujjuri (JV) | return fd;
|
342 | 4750a96f | Venkateswararao Jujjuri (JV) | |
343 | 4750a96f | Venkateswararao Jujjuri (JV) | err_end:
|
344 | 4750a96f | Venkateswararao Jujjuri (JV) | close(fd); |
345 | 4750a96f | Venkateswararao Jujjuri (JV) | remove(rpath(fs_ctx, path)); |
346 | 4750a96f | Venkateswararao Jujjuri (JV) | errno = serrno; |
347 | 4750a96f | Venkateswararao Jujjuri (JV) | return err;
|
348 | c494dd6f | Anthony Liguori | } |
349 | c494dd6f | Anthony Liguori | |
350 | 758e8e38 | Venkateswararao Jujjuri (JV) | |
351 | 879c2813 | Venkateswararao Jujjuri (JV) | static int local_symlink(FsContext *fs_ctx, const char *oldpath, |
352 | 879c2813 | Venkateswararao Jujjuri (JV) | const char *newpath, FsCred *credp) |
353 | c494dd6f | Anthony Liguori | { |
354 | 879c2813 | Venkateswararao Jujjuri (JV) | int err = -1; |
355 | 879c2813 | Venkateswararao Jujjuri (JV) | int serrno = 0; |
356 | 879c2813 | Venkateswararao Jujjuri (JV) | |
357 | 879c2813 | Venkateswararao Jujjuri (JV) | /* Determine the security model */
|
358 | 879c2813 | Venkateswararao Jujjuri (JV) | if (fs_ctx->fs_sm == SM_MAPPED) {
|
359 | 879c2813 | Venkateswararao Jujjuri (JV) | int fd;
|
360 | 879c2813 | Venkateswararao Jujjuri (JV) | ssize_t oldpath_size, write_size; |
361 | 879c2813 | Venkateswararao Jujjuri (JV) | fd = open(rpath(fs_ctx, newpath), O_CREAT|O_EXCL|O_RDWR, |
362 | 879c2813 | Venkateswararao Jujjuri (JV) | SM_LOCAL_MODE_BITS); |
363 | 879c2813 | Venkateswararao Jujjuri (JV) | if (fd == -1) { |
364 | 879c2813 | Venkateswararao Jujjuri (JV) | return fd;
|
365 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
366 | 879c2813 | Venkateswararao Jujjuri (JV) | /* Write the oldpath (target) to the file. */
|
367 | 879c2813 | Venkateswararao Jujjuri (JV) | oldpath_size = strlen(oldpath) + 1;
|
368 | 879c2813 | Venkateswararao Jujjuri (JV) | do {
|
369 | 879c2813 | Venkateswararao Jujjuri (JV) | write_size = write(fd, (void *)oldpath, oldpath_size);
|
370 | 879c2813 | Venkateswararao Jujjuri (JV) | } while (write_size == -1 && errno == EINTR); |
371 | 879c2813 | Venkateswararao Jujjuri (JV) | |
372 | 879c2813 | Venkateswararao Jujjuri (JV) | if (write_size != oldpath_size) {
|
373 | 879c2813 | Venkateswararao Jujjuri (JV) | serrno = errno; |
374 | 879c2813 | Venkateswararao Jujjuri (JV) | close(fd); |
375 | 879c2813 | Venkateswararao Jujjuri (JV) | err = -1;
|
376 | 879c2813 | Venkateswararao Jujjuri (JV) | goto err_end;
|
377 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
378 | 879c2813 | Venkateswararao Jujjuri (JV) | close(fd); |
379 | 879c2813 | Venkateswararao Jujjuri (JV) | /* Set cleint credentials in symlink's xattr */
|
380 | 879c2813 | Venkateswararao Jujjuri (JV) | credp->fc_mode = credp->fc_mode|S_IFLNK; |
381 | 879c2813 | Venkateswararao Jujjuri (JV) | err = local_set_xattr(rpath(fs_ctx, newpath), credp); |
382 | 879c2813 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
383 | 879c2813 | Venkateswararao Jujjuri (JV) | serrno = errno; |
384 | 879c2813 | Venkateswararao Jujjuri (JV) | goto err_end;
|
385 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
386 | 12848bfc | Aneesh Kumar K.V | } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) || |
387 | 12848bfc | Aneesh Kumar K.V | (fs_ctx->fs_sm == SM_NONE)) { |
388 | 879c2813 | Venkateswararao Jujjuri (JV) | err = symlink(oldpath, rpath(fs_ctx, newpath)); |
389 | 879c2813 | Venkateswararao Jujjuri (JV) | if (err) {
|
390 | 879c2813 | Venkateswararao Jujjuri (JV) | return err;
|
391 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
392 | 879c2813 | Venkateswararao Jujjuri (JV) | err = lchown(rpath(fs_ctx, newpath), credp->fc_uid, credp->fc_gid); |
393 | 879c2813 | Venkateswararao Jujjuri (JV) | if (err == -1) { |
394 | 12848bfc | Aneesh Kumar K.V | /*
|
395 | 12848bfc | Aneesh Kumar K.V | * If we fail to change ownership and if we are
|
396 | 12848bfc | Aneesh Kumar K.V | * using security model none. Ignore the error
|
397 | 12848bfc | Aneesh Kumar K.V | */
|
398 | 12848bfc | Aneesh Kumar K.V | if (fs_ctx->fs_sm != SM_NONE) {
|
399 | 12848bfc | Aneesh Kumar K.V | serrno = errno; |
400 | 12848bfc | Aneesh Kumar K.V | goto err_end;
|
401 | 12848bfc | Aneesh Kumar K.V | } else
|
402 | 12848bfc | Aneesh Kumar K.V | err = 0;
|
403 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
404 | 879c2813 | Venkateswararao Jujjuri (JV) | } |
405 | 879c2813 | Venkateswararao Jujjuri (JV) | return err;
|
406 | 879c2813 | Venkateswararao Jujjuri (JV) | |
407 | 879c2813 | Venkateswararao Jujjuri (JV) | err_end:
|
408 | 879c2813 | Venkateswararao Jujjuri (JV) | remove(rpath(fs_ctx, newpath)); |
409 | 879c2813 | Venkateswararao Jujjuri (JV) | errno = serrno; |
410 | 879c2813 | Venkateswararao Jujjuri (JV) | return err;
|
411 | c494dd6f | Anthony Liguori | } |
412 | c494dd6f | Anthony Liguori | |
413 | c494dd6f | Anthony Liguori | static int local_link(FsContext *ctx, const char *oldpath, const char *newpath) |
414 | c494dd6f | Anthony Liguori | { |
415 | c494dd6f | Anthony Liguori | char *tmp = qemu_strdup(rpath(ctx, oldpath));
|
416 | c494dd6f | Anthony Liguori | int err, serrno = 0; |
417 | c494dd6f | Anthony Liguori | |
418 | c494dd6f | Anthony Liguori | if (tmp == NULL) { |
419 | c494dd6f | Anthony Liguori | return -ENOMEM;
|
420 | c494dd6f | Anthony Liguori | } |
421 | c494dd6f | Anthony Liguori | |
422 | c494dd6f | Anthony Liguori | err = link(tmp, rpath(ctx, newpath)); |
423 | c494dd6f | Anthony Liguori | if (err == -1) { |
424 | c494dd6f | Anthony Liguori | serrno = errno; |
425 | c494dd6f | Anthony Liguori | } |
426 | c494dd6f | Anthony Liguori | |
427 | c494dd6f | Anthony Liguori | qemu_free(tmp); |
428 | c494dd6f | Anthony Liguori | |
429 | c494dd6f | Anthony Liguori | if (err == -1) { |
430 | c494dd6f | Anthony Liguori | errno = serrno; |
431 | c494dd6f | Anthony Liguori | } |
432 | c494dd6f | Anthony Liguori | |
433 | c494dd6f | Anthony Liguori | return err;
|
434 | c494dd6f | Anthony Liguori | } |
435 | c494dd6f | Anthony Liguori | |
436 | 8cf89e00 | Anthony Liguori | static int local_truncate(FsContext *ctx, const char *path, off_t size) |
437 | 8cf89e00 | Anthony Liguori | { |
438 | 8cf89e00 | Anthony Liguori | return truncate(rpath(ctx, path), size);
|
439 | 8cf89e00 | Anthony Liguori | } |
440 | 8cf89e00 | Anthony Liguori | |
441 | 8cf89e00 | Anthony Liguori | static int local_rename(FsContext *ctx, const char *oldpath, |
442 | 8cf89e00 | Anthony Liguori | const char *newpath) |
443 | 8cf89e00 | Anthony Liguori | { |
444 | 8cf89e00 | Anthony Liguori | char *tmp;
|
445 | 8cf89e00 | Anthony Liguori | int err;
|
446 | 8cf89e00 | Anthony Liguori | |
447 | 8cf89e00 | Anthony Liguori | tmp = qemu_strdup(rpath(ctx, oldpath)); |
448 | 8cf89e00 | Anthony Liguori | |
449 | 8cf89e00 | Anthony Liguori | err = rename(tmp, rpath(ctx, newpath)); |
450 | 8cf89e00 | Anthony Liguori | if (err == -1) { |
451 | 8cf89e00 | Anthony Liguori | int serrno = errno;
|
452 | 8cf89e00 | Anthony Liguori | qemu_free(tmp); |
453 | 8cf89e00 | Anthony Liguori | errno = serrno; |
454 | 8cf89e00 | Anthony Liguori | } else {
|
455 | 8cf89e00 | Anthony Liguori | qemu_free(tmp); |
456 | 8cf89e00 | Anthony Liguori | } |
457 | 8cf89e00 | Anthony Liguori | |
458 | 8cf89e00 | Anthony Liguori | return err;
|
459 | 8cf89e00 | Anthony Liguori | |
460 | 8cf89e00 | Anthony Liguori | } |
461 | 8cf89e00 | Anthony Liguori | |
462 | f7613bee | Venkateswararao Jujjuri (JV) | static int local_chown(FsContext *fs_ctx, const char *path, FsCred *credp) |
463 | 8cf89e00 | Anthony Liguori | { |
464 | c79ce737 | Sripathi Kodi | if ((credp->fc_uid == -1 && credp->fc_gid == -1) || |
465 | c79ce737 | Sripathi Kodi | (fs_ctx->fs_sm == SM_PASSTHROUGH)) { |
466 | c79ce737 | Sripathi Kodi | return lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid);
|
467 | c79ce737 | Sripathi Kodi | } else if (fs_ctx->fs_sm == SM_MAPPED) { |
468 | f7613bee | Venkateswararao Jujjuri (JV) | return local_set_xattr(rpath(fs_ctx, path), credp);
|
469 | 12848bfc | Aneesh Kumar K.V | } else if ((fs_ctx->fs_sm == SM_PASSTHROUGH) || |
470 | 12848bfc | Aneesh Kumar K.V | (fs_ctx->fs_sm == SM_NONE)) { |
471 | f7613bee | Venkateswararao Jujjuri (JV) | return lchown(rpath(fs_ctx, path), credp->fc_uid, credp->fc_gid);
|
472 | f7613bee | Venkateswararao Jujjuri (JV) | } |
473 | f7613bee | Venkateswararao Jujjuri (JV) | return -1; |
474 | 8cf89e00 | Anthony Liguori | } |
475 | 8cf89e00 | Anthony Liguori | |
476 | 74bc02b2 | M. Mohan Kumar | static int local_utimensat(FsContext *s, const char *path, |
477 | 74bc02b2 | M. Mohan Kumar | const struct timespec *buf) |
478 | 8cf89e00 | Anthony Liguori | { |
479 | 74bc02b2 | M. Mohan Kumar | return utimensat(AT_FDCWD, rpath(s, path), buf, AT_SYMLINK_NOFOLLOW);
|
480 | 8cf89e00 | Anthony Liguori | } |
481 | 8cf89e00 | Anthony Liguori | |
482 | 5bae1900 | Anthony Liguori | static int local_remove(FsContext *ctx, const char *path) |
483 | 5bae1900 | Anthony Liguori | { |
484 | 5bae1900 | Anthony Liguori | return remove(rpath(ctx, path));
|
485 | 5bae1900 | Anthony Liguori | } |
486 | 5bae1900 | Anthony Liguori | |
487 | 8cf89e00 | Anthony Liguori | static int local_fsync(FsContext *ctx, int fd) |
488 | 8cf89e00 | Anthony Liguori | { |
489 | 8cf89e00 | Anthony Liguori | return fsync(fd);
|
490 | 8cf89e00 | Anthony Liguori | } |
491 | 8cf89e00 | Anthony Liguori | |
492 | be940c87 | M. Mohan Kumar | static int local_statfs(FsContext *s, const char *path, struct statfs *stbuf) |
493 | be940c87 | M. Mohan Kumar | { |
494 | be940c87 | M. Mohan Kumar | return statfs(rpath(s, path), stbuf);
|
495 | be940c87 | M. Mohan Kumar | } |
496 | be940c87 | M. Mohan Kumar | |
497 | fa32ef88 | Aneesh Kumar K.V | static ssize_t local_lgetxattr(FsContext *ctx, const char *path, |
498 | fa32ef88 | Aneesh Kumar K.V | const char *name, void *value, size_t size) |
499 | fa32ef88 | Aneesh Kumar K.V | { |
500 | 61b6c499 | Aneesh Kumar K.V | if ((ctx->fs_sm == SM_MAPPED) &&
|
501 | 61b6c499 | Aneesh Kumar K.V | (strncmp(name, "user.virtfs.", 12) == 0)) { |
502 | 61b6c499 | Aneesh Kumar K.V | /*
|
503 | 61b6c499 | Aneesh Kumar K.V | * Don't allow fetch of user.virtfs namesapce
|
504 | 61b6c499 | Aneesh Kumar K.V | * in case of mapped security
|
505 | 61b6c499 | Aneesh Kumar K.V | */
|
506 | 61b6c499 | Aneesh Kumar K.V | errno = ENOATTR; |
507 | 61b6c499 | Aneesh Kumar K.V | return -1; |
508 | 61b6c499 | Aneesh Kumar K.V | } |
509 | 61b6c499 | Aneesh Kumar K.V | |
510 | fa32ef88 | Aneesh Kumar K.V | return lgetxattr(rpath(ctx, path), name, value, size);
|
511 | fa32ef88 | Aneesh Kumar K.V | } |
512 | fa32ef88 | Aneesh Kumar K.V | |
513 | fa32ef88 | Aneesh Kumar K.V | static ssize_t local_llistxattr(FsContext *ctx, const char *path, |
514 | fa32ef88 | Aneesh Kumar K.V | void *value, size_t size)
|
515 | fa32ef88 | Aneesh Kumar K.V | { |
516 | 61b6c499 | Aneesh Kumar K.V | ssize_t retval; |
517 | 61b6c499 | Aneesh Kumar K.V | ssize_t actual_len = 0;
|
518 | 61b6c499 | Aneesh Kumar K.V | char *orig_value, *orig_value_start;
|
519 | 61b6c499 | Aneesh Kumar K.V | char *temp_value, *temp_value_start;
|
520 | 61b6c499 | Aneesh Kumar K.V | ssize_t xattr_len, parsed_len = 0, attr_len;
|
521 | 61b6c499 | Aneesh Kumar K.V | |
522 | 61b6c499 | Aneesh Kumar K.V | if (ctx->fs_sm != SM_MAPPED) {
|
523 | 61b6c499 | Aneesh Kumar K.V | return llistxattr(rpath(ctx, path), value, size);
|
524 | 61b6c499 | Aneesh Kumar K.V | } |
525 | 61b6c499 | Aneesh Kumar K.V | |
526 | 61b6c499 | Aneesh Kumar K.V | /* Get the actual len */
|
527 | 61b6c499 | Aneesh Kumar K.V | xattr_len = llistxattr(rpath(ctx, path), value, 0);
|
528 | 61b6c499 | Aneesh Kumar K.V | |
529 | 61b6c499 | Aneesh Kumar K.V | /* Now fetch the xattr and find the actual size */
|
530 | 61b6c499 | Aneesh Kumar K.V | orig_value = qemu_malloc(xattr_len); |
531 | 61b6c499 | Aneesh Kumar K.V | xattr_len = llistxattr(rpath(ctx, path), orig_value, xattr_len); |
532 | 61b6c499 | Aneesh Kumar K.V | |
533 | 61b6c499 | Aneesh Kumar K.V | /*
|
534 | 61b6c499 | Aneesh Kumar K.V | * For mapped security model drop user.virtfs namespace
|
535 | 61b6c499 | Aneesh Kumar K.V | * from the list
|
536 | 61b6c499 | Aneesh Kumar K.V | */
|
537 | 61b6c499 | Aneesh Kumar K.V | temp_value = qemu_mallocz(xattr_len); |
538 | 61b6c499 | Aneesh Kumar K.V | temp_value_start = temp_value; |
539 | 61b6c499 | Aneesh Kumar K.V | orig_value_start = orig_value; |
540 | 61b6c499 | Aneesh Kumar K.V | while (xattr_len > parsed_len) {
|
541 | 61b6c499 | Aneesh Kumar K.V | attr_len = strlen(orig_value) + 1;
|
542 | 61b6c499 | Aneesh Kumar K.V | if (strncmp(orig_value, "user.virtfs.", 12) != 0) { |
543 | 61b6c499 | Aneesh Kumar K.V | /* Copy this entry */
|
544 | 61b6c499 | Aneesh Kumar K.V | strcat(temp_value, orig_value); |
545 | 61b6c499 | Aneesh Kumar K.V | temp_value += attr_len; |
546 | 61b6c499 | Aneesh Kumar K.V | actual_len += attr_len; |
547 | 61b6c499 | Aneesh Kumar K.V | } |
548 | 61b6c499 | Aneesh Kumar K.V | parsed_len += attr_len; |
549 | 61b6c499 | Aneesh Kumar K.V | orig_value += attr_len; |
550 | 61b6c499 | Aneesh Kumar K.V | } |
551 | 61b6c499 | Aneesh Kumar K.V | if (!size) {
|
552 | 61b6c499 | Aneesh Kumar K.V | retval = actual_len; |
553 | 61b6c499 | Aneesh Kumar K.V | goto out;
|
554 | 61b6c499 | Aneesh Kumar K.V | } else if (size >= actual_len) { |
555 | 61b6c499 | Aneesh Kumar K.V | /* now copy the parsed attribute list back */
|
556 | 61b6c499 | Aneesh Kumar K.V | memset(value, 0, size);
|
557 | 61b6c499 | Aneesh Kumar K.V | memcpy(value, temp_value_start, actual_len); |
558 | 61b6c499 | Aneesh Kumar K.V | retval = actual_len; |
559 | 61b6c499 | Aneesh Kumar K.V | goto out;
|
560 | 61b6c499 | Aneesh Kumar K.V | } |
561 | 61b6c499 | Aneesh Kumar K.V | errno = ERANGE; |
562 | 61b6c499 | Aneesh Kumar K.V | retval = -1;
|
563 | 61b6c499 | Aneesh Kumar K.V | out:
|
564 | 61b6c499 | Aneesh Kumar K.V | qemu_free(orig_value_start); |
565 | 61b6c499 | Aneesh Kumar K.V | qemu_free(temp_value_start); |
566 | 61b6c499 | Aneesh Kumar K.V | return retval;
|
567 | fa32ef88 | Aneesh Kumar K.V | } |
568 | fa32ef88 | Aneesh Kumar K.V | |
569 | 10b468bd | Aneesh Kumar K.V | static int local_lsetxattr(FsContext *ctx, const char *path, const char *name, |
570 | 10b468bd | Aneesh Kumar K.V | void *value, size_t size, int flags) |
571 | 10b468bd | Aneesh Kumar K.V | { |
572 | 61b6c499 | Aneesh Kumar K.V | if ((ctx->fs_sm == SM_MAPPED) &&
|
573 | 61b6c499 | Aneesh Kumar K.V | (strncmp(name, "user.virtfs.", 12) == 0)) { |
574 | 61b6c499 | Aneesh Kumar K.V | /*
|
575 | 61b6c499 | Aneesh Kumar K.V | * Don't allow fetch of user.virtfs namesapce
|
576 | 61b6c499 | Aneesh Kumar K.V | * in case of mapped security
|
577 | 61b6c499 | Aneesh Kumar K.V | */
|
578 | 61b6c499 | Aneesh Kumar K.V | errno = EACCES; |
579 | 61b6c499 | Aneesh Kumar K.V | return -1; |
580 | 61b6c499 | Aneesh Kumar K.V | } |
581 | 10b468bd | Aneesh Kumar K.V | return lsetxattr(rpath(ctx, path), name, value, size, flags);
|
582 | 10b468bd | Aneesh Kumar K.V | } |
583 | 10b468bd | Aneesh Kumar K.V | |
584 | 9ed3ef26 | Aneesh Kumar K.V | static int local_lremovexattr(FsContext *ctx, |
585 | 9ed3ef26 | Aneesh Kumar K.V | const char *path, const char *name) |
586 | 9ed3ef26 | Aneesh Kumar K.V | { |
587 | 9ed3ef26 | Aneesh Kumar K.V | if ((ctx->fs_sm == SM_MAPPED) &&
|
588 | 9ed3ef26 | Aneesh Kumar K.V | (strncmp(name, "user.virtfs.", 12) == 0)) { |
589 | 9ed3ef26 | Aneesh Kumar K.V | /*
|
590 | 9ed3ef26 | Aneesh Kumar K.V | * Don't allow fetch of user.virtfs namesapce
|
591 | 9ed3ef26 | Aneesh Kumar K.V | * in case of mapped security
|
592 | 9ed3ef26 | Aneesh Kumar K.V | */
|
593 | 9ed3ef26 | Aneesh Kumar K.V | errno = EACCES; |
594 | 9ed3ef26 | Aneesh Kumar K.V | return -1; |
595 | 9ed3ef26 | Aneesh Kumar K.V | } |
596 | 9ed3ef26 | Aneesh Kumar K.V | return lremovexattr(rpath(ctx, path), name);
|
597 | 9ed3ef26 | Aneesh Kumar K.V | } |
598 | 9ed3ef26 | Aneesh Kumar K.V | |
599 | 9ed3ef26 | Aneesh Kumar K.V | |
600 | 9f107513 | Anthony Liguori | FileOperations local_ops = { |
601 | 131dcb25 | Anthony Liguori | .lstat = local_lstat, |
602 | 131dcb25 | Anthony Liguori | .readlink = local_readlink, |
603 | 131dcb25 | Anthony Liguori | .close = local_close, |
604 | 131dcb25 | Anthony Liguori | .closedir = local_closedir, |
605 | a6568fe2 | Anthony Liguori | .open = local_open, |
606 | a6568fe2 | Anthony Liguori | .opendir = local_opendir, |
607 | a9231555 | Anthony Liguori | .rewinddir = local_rewinddir, |
608 | a9231555 | Anthony Liguori | .telldir = local_telldir, |
609 | a9231555 | Anthony Liguori | .readdir = local_readdir, |
610 | a9231555 | Anthony Liguori | .seekdir = local_seekdir, |
611 | a9231555 | Anthony Liguori | .readv = local_readv, |
612 | a9231555 | Anthony Liguori | .lseek = local_lseek, |
613 | 8449360c | Anthony Liguori | .writev = local_writev, |
614 | c494dd6f | Anthony Liguori | .chmod = local_chmod, |
615 | c494dd6f | Anthony Liguori | .mknod = local_mknod, |
616 | c494dd6f | Anthony Liguori | .mkdir = local_mkdir, |
617 | c494dd6f | Anthony Liguori | .fstat = local_fstat, |
618 | c494dd6f | Anthony Liguori | .open2 = local_open2, |
619 | c494dd6f | Anthony Liguori | .symlink = local_symlink, |
620 | c494dd6f | Anthony Liguori | .link = local_link, |
621 | 8cf89e00 | Anthony Liguori | .truncate = local_truncate, |
622 | 8cf89e00 | Anthony Liguori | .rename = local_rename, |
623 | 8cf89e00 | Anthony Liguori | .chown = local_chown, |
624 | 74bc02b2 | M. Mohan Kumar | .utimensat = local_utimensat, |
625 | 5bae1900 | Anthony Liguori | .remove = local_remove, |
626 | 8cf89e00 | Anthony Liguori | .fsync = local_fsync, |
627 | be940c87 | M. Mohan Kumar | .statfs = local_statfs, |
628 | fa32ef88 | Aneesh Kumar K.V | .lgetxattr = local_lgetxattr, |
629 | fa32ef88 | Aneesh Kumar K.V | .llistxattr = local_llistxattr, |
630 | 10b468bd | Aneesh Kumar K.V | .lsetxattr = local_lsetxattr, |
631 | 9ed3ef26 | Aneesh Kumar K.V | .lremovexattr = local_lremovexattr, |
632 | 9f107513 | Anthony Liguori | }; |