root / hw / 9pfs / virtio-9p-proxy.c @ 17bff52b
History | View | Annotate | Download (9.5 kB)
1 | 4c793dda | M. Mohan Kumar | /*
|
---|---|---|---|
2 | 4c793dda | M. Mohan Kumar | * Virtio 9p Proxy callback
|
3 | 4c793dda | M. Mohan Kumar | *
|
4 | 4c793dda | M. Mohan Kumar | * Copyright IBM, Corp. 2011
|
5 | 4c793dda | M. Mohan Kumar | *
|
6 | 4c793dda | M. Mohan Kumar | * Authors:
|
7 | 4c793dda | M. Mohan Kumar | * M. Mohan Kumar <mohan@in.ibm.com>
|
8 | 4c793dda | M. Mohan Kumar | *
|
9 | 4c793dda | M. Mohan Kumar | * This work is licensed under the terms of the GNU GPL, version 2. See
|
10 | 4c793dda | M. Mohan Kumar | * the COPYING file in the top-level directory.
|
11 | 4c793dda | M. Mohan Kumar | */
|
12 | 4c793dda | M. Mohan Kumar | #include <sys/socket.h> |
13 | 4c793dda | M. Mohan Kumar | #include <sys/un.h> |
14 | 4c793dda | M. Mohan Kumar | #include "hw/virtio.h" |
15 | 4c793dda | M. Mohan Kumar | #include "virtio-9p.h" |
16 | 4c793dda | M. Mohan Kumar | #include "fsdev/qemu-fsdev.h" |
17 | 4c793dda | M. Mohan Kumar | #include "virtio-9p-proxy.h" |
18 | 4c793dda | M. Mohan Kumar | |
19 | 4c793dda | M. Mohan Kumar | typedef struct V9fsProxy { |
20 | 4c793dda | M. Mohan Kumar | int sockfd;
|
21 | 4c793dda | M. Mohan Kumar | QemuMutex mutex; |
22 | 4c793dda | M. Mohan Kumar | struct iovec iovec;
|
23 | 4c793dda | M. Mohan Kumar | } V9fsProxy; |
24 | 4c793dda | M. Mohan Kumar | |
25 | 4c793dda | M. Mohan Kumar | static int proxy_lstat(FsContext *fs_ctx, V9fsPath *fs_path, struct stat *stbuf) |
26 | 4c793dda | M. Mohan Kumar | { |
27 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
28 | 4c793dda | M. Mohan Kumar | return -1; |
29 | 4c793dda | M. Mohan Kumar | } |
30 | 4c793dda | M. Mohan Kumar | |
31 | 4c793dda | M. Mohan Kumar | static ssize_t proxy_readlink(FsContext *fs_ctx, V9fsPath *fs_path,
|
32 | 4c793dda | M. Mohan Kumar | char *buf, size_t bufsz)
|
33 | 4c793dda | M. Mohan Kumar | { |
34 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
35 | 4c793dda | M. Mohan Kumar | return -1; |
36 | 4c793dda | M. Mohan Kumar | } |
37 | 4c793dda | M. Mohan Kumar | |
38 | 4c793dda | M. Mohan Kumar | static int proxy_close(FsContext *ctx, V9fsFidOpenState *fs) |
39 | 4c793dda | M. Mohan Kumar | { |
40 | 4c793dda | M. Mohan Kumar | return close(fs->fd);
|
41 | 4c793dda | M. Mohan Kumar | } |
42 | 4c793dda | M. Mohan Kumar | |
43 | 4c793dda | M. Mohan Kumar | static int proxy_closedir(FsContext *ctx, V9fsFidOpenState *fs) |
44 | 4c793dda | M. Mohan Kumar | { |
45 | 4c793dda | M. Mohan Kumar | return closedir(fs->dir);
|
46 | 4c793dda | M. Mohan Kumar | } |
47 | 4c793dda | M. Mohan Kumar | |
48 | 4c793dda | M. Mohan Kumar | static int proxy_open(FsContext *ctx, V9fsPath *fs_path, |
49 | 4c793dda | M. Mohan Kumar | int flags, V9fsFidOpenState *fs)
|
50 | 4c793dda | M. Mohan Kumar | { |
51 | 4c793dda | M. Mohan Kumar | fs->fd = -1;
|
52 | 4c793dda | M. Mohan Kumar | return fs->fd;
|
53 | 4c793dda | M. Mohan Kumar | } |
54 | 4c793dda | M. Mohan Kumar | |
55 | 4c793dda | M. Mohan Kumar | static int proxy_opendir(FsContext *ctx, |
56 | 4c793dda | M. Mohan Kumar | V9fsPath *fs_path, V9fsFidOpenState *fs) |
57 | 4c793dda | M. Mohan Kumar | { |
58 | 4c793dda | M. Mohan Kumar | fs->dir = NULL;
|
59 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
60 | 4c793dda | M. Mohan Kumar | return -1; |
61 | 4c793dda | M. Mohan Kumar | } |
62 | 4c793dda | M. Mohan Kumar | |
63 | 4c793dda | M. Mohan Kumar | static void proxy_rewinddir(FsContext *ctx, V9fsFidOpenState *fs) |
64 | 4c793dda | M. Mohan Kumar | { |
65 | 4c793dda | M. Mohan Kumar | return rewinddir(fs->dir);
|
66 | 4c793dda | M. Mohan Kumar | } |
67 | 4c793dda | M. Mohan Kumar | |
68 | 4c793dda | M. Mohan Kumar | static off_t proxy_telldir(FsContext *ctx, V9fsFidOpenState *fs)
|
69 | 4c793dda | M. Mohan Kumar | { |
70 | 4c793dda | M. Mohan Kumar | return telldir(fs->dir);
|
71 | 4c793dda | M. Mohan Kumar | } |
72 | 4c793dda | M. Mohan Kumar | |
73 | 4c793dda | M. Mohan Kumar | static int proxy_readdir_r(FsContext *ctx, V9fsFidOpenState *fs, |
74 | 4c793dda | M. Mohan Kumar | struct dirent *entry,
|
75 | 4c793dda | M. Mohan Kumar | struct dirent **result)
|
76 | 4c793dda | M. Mohan Kumar | { |
77 | 4c793dda | M. Mohan Kumar | return readdir_r(fs->dir, entry, result);
|
78 | 4c793dda | M. Mohan Kumar | } |
79 | 4c793dda | M. Mohan Kumar | |
80 | 4c793dda | M. Mohan Kumar | static void proxy_seekdir(FsContext *ctx, V9fsFidOpenState *fs, off_t off) |
81 | 4c793dda | M. Mohan Kumar | { |
82 | 4c793dda | M. Mohan Kumar | return seekdir(fs->dir, off);
|
83 | 4c793dda | M. Mohan Kumar | } |
84 | 4c793dda | M. Mohan Kumar | |
85 | 4c793dda | M. Mohan Kumar | static ssize_t proxy_preadv(FsContext *ctx, V9fsFidOpenState *fs,
|
86 | 4c793dda | M. Mohan Kumar | const struct iovec *iov, |
87 | 4c793dda | M. Mohan Kumar | int iovcnt, off_t offset)
|
88 | 4c793dda | M. Mohan Kumar | { |
89 | 4c793dda | M. Mohan Kumar | #ifdef CONFIG_PREADV
|
90 | 4c793dda | M. Mohan Kumar | return preadv(fs->fd, iov, iovcnt, offset);
|
91 | 4c793dda | M. Mohan Kumar | #else
|
92 | 4c793dda | M. Mohan Kumar | int err = lseek(fs->fd, offset, SEEK_SET);
|
93 | 4c793dda | M. Mohan Kumar | if (err == -1) { |
94 | 4c793dda | M. Mohan Kumar | return err;
|
95 | 4c793dda | M. Mohan Kumar | } else {
|
96 | 4c793dda | M. Mohan Kumar | return readv(fs->fd, iov, iovcnt);
|
97 | 4c793dda | M. Mohan Kumar | } |
98 | 4c793dda | M. Mohan Kumar | #endif
|
99 | 4c793dda | M. Mohan Kumar | } |
100 | 4c793dda | M. Mohan Kumar | |
101 | 4c793dda | M. Mohan Kumar | static ssize_t proxy_pwritev(FsContext *ctx, V9fsFidOpenState *fs,
|
102 | 4c793dda | M. Mohan Kumar | const struct iovec *iov, |
103 | 4c793dda | M. Mohan Kumar | int iovcnt, off_t offset)
|
104 | 4c793dda | M. Mohan Kumar | { |
105 | 4c793dda | M. Mohan Kumar | ssize_t ret; |
106 | 4c793dda | M. Mohan Kumar | |
107 | 4c793dda | M. Mohan Kumar | #ifdef CONFIG_PREADV
|
108 | 4c793dda | M. Mohan Kumar | ret = pwritev(fs->fd, iov, iovcnt, offset); |
109 | 4c793dda | M. Mohan Kumar | #else
|
110 | 4c793dda | M. Mohan Kumar | int err = lseek(fs->fd, offset, SEEK_SET);
|
111 | 4c793dda | M. Mohan Kumar | if (err == -1) { |
112 | 4c793dda | M. Mohan Kumar | return err;
|
113 | 4c793dda | M. Mohan Kumar | } else {
|
114 | 4c793dda | M. Mohan Kumar | ret = writev(fs->fd, iov, iovcnt); |
115 | 4c793dda | M. Mohan Kumar | } |
116 | 4c793dda | M. Mohan Kumar | #endif
|
117 | 4c793dda | M. Mohan Kumar | #ifdef CONFIG_SYNC_FILE_RANGE
|
118 | 4c793dda | M. Mohan Kumar | if (ret > 0 && ctx->export_flags & V9FS_IMMEDIATE_WRITEOUT) { |
119 | 4c793dda | M. Mohan Kumar | /*
|
120 | 4c793dda | M. Mohan Kumar | * Initiate a writeback. This is not a data integrity sync.
|
121 | 4c793dda | M. Mohan Kumar | * We want to ensure that we don't leave dirty pages in the cache
|
122 | 4c793dda | M. Mohan Kumar | * after write when writeout=immediate is sepcified.
|
123 | 4c793dda | M. Mohan Kumar | */
|
124 | 4c793dda | M. Mohan Kumar | sync_file_range(fs->fd, offset, ret, |
125 | 4c793dda | M. Mohan Kumar | SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE); |
126 | 4c793dda | M. Mohan Kumar | } |
127 | 4c793dda | M. Mohan Kumar | #endif
|
128 | 4c793dda | M. Mohan Kumar | return ret;
|
129 | 4c793dda | M. Mohan Kumar | } |
130 | 4c793dda | M. Mohan Kumar | |
131 | 4c793dda | M. Mohan Kumar | static int proxy_chmod(FsContext *fs_ctx, V9fsPath *fs_path, FsCred *credp) |
132 | 4c793dda | M. Mohan Kumar | { |
133 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
134 | 4c793dda | M. Mohan Kumar | return -1; |
135 | 4c793dda | M. Mohan Kumar | } |
136 | 4c793dda | M. Mohan Kumar | |
137 | 4c793dda | M. Mohan Kumar | static int proxy_mknod(FsContext *fs_ctx, V9fsPath *dir_path, |
138 | 4c793dda | M. Mohan Kumar | const char *name, FsCred *credp) |
139 | 4c793dda | M. Mohan Kumar | { |
140 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
141 | 4c793dda | M. Mohan Kumar | return -1; |
142 | 4c793dda | M. Mohan Kumar | } |
143 | 4c793dda | M. Mohan Kumar | |
144 | 4c793dda | M. Mohan Kumar | static int proxy_mkdir(FsContext *fs_ctx, V9fsPath *dir_path, |
145 | 4c793dda | M. Mohan Kumar | const char *name, FsCred *credp) |
146 | 4c793dda | M. Mohan Kumar | { |
147 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
148 | 4c793dda | M. Mohan Kumar | return -1; |
149 | 4c793dda | M. Mohan Kumar | } |
150 | 4c793dda | M. Mohan Kumar | |
151 | 4c793dda | M. Mohan Kumar | static int proxy_fstat(FsContext *fs_ctx, int fid_type, |
152 | 4c793dda | M. Mohan Kumar | V9fsFidOpenState *fs, struct stat *stbuf)
|
153 | 4c793dda | M. Mohan Kumar | { |
154 | 4c793dda | M. Mohan Kumar | int fd;
|
155 | 4c793dda | M. Mohan Kumar | |
156 | 4c793dda | M. Mohan Kumar | if (fid_type == P9_FID_DIR) {
|
157 | 4c793dda | M. Mohan Kumar | fd = dirfd(fs->dir); |
158 | 4c793dda | M. Mohan Kumar | } else {
|
159 | 4c793dda | M. Mohan Kumar | fd = fs->fd; |
160 | 4c793dda | M. Mohan Kumar | } |
161 | 4c793dda | M. Mohan Kumar | return fstat(fd, stbuf);
|
162 | 4c793dda | M. Mohan Kumar | } |
163 | 4c793dda | M. Mohan Kumar | |
164 | 4c793dda | M. Mohan Kumar | static int proxy_open2(FsContext *fs_ctx, V9fsPath *dir_path, const char *name, |
165 | 4c793dda | M. Mohan Kumar | int flags, FsCred *credp, V9fsFidOpenState *fs)
|
166 | 4c793dda | M. Mohan Kumar | { |
167 | 4c793dda | M. Mohan Kumar | fs->fd = -1;
|
168 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
169 | 4c793dda | M. Mohan Kumar | return -1; |
170 | 4c793dda | M. Mohan Kumar | } |
171 | 4c793dda | M. Mohan Kumar | |
172 | 4c793dda | M. Mohan Kumar | |
173 | 4c793dda | M. Mohan Kumar | static int proxy_symlink(FsContext *fs_ctx, const char *oldpath, |
174 | 4c793dda | M. Mohan Kumar | V9fsPath *dir_path, const char *name, FsCred *credp) |
175 | 4c793dda | M. Mohan Kumar | { |
176 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
177 | 4c793dda | M. Mohan Kumar | return -1; |
178 | 4c793dda | M. Mohan Kumar | } |
179 | 4c793dda | M. Mohan Kumar | |
180 | 4c793dda | M. Mohan Kumar | static int proxy_link(FsContext *ctx, V9fsPath *oldpath, |
181 | 4c793dda | M. Mohan Kumar | V9fsPath *dirpath, const char *name) |
182 | 4c793dda | M. Mohan Kumar | { |
183 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
184 | 4c793dda | M. Mohan Kumar | return -1; |
185 | 4c793dda | M. Mohan Kumar | } |
186 | 4c793dda | M. Mohan Kumar | |
187 | 4c793dda | M. Mohan Kumar | static int proxy_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size) |
188 | 4c793dda | M. Mohan Kumar | { |
189 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
190 | 4c793dda | M. Mohan Kumar | return -1; |
191 | 4c793dda | M. Mohan Kumar | } |
192 | 4c793dda | M. Mohan Kumar | |
193 | 4c793dda | M. Mohan Kumar | static int proxy_rename(FsContext *ctx, const char *oldpath, |
194 | 4c793dda | M. Mohan Kumar | const char *newpath) |
195 | 4c793dda | M. Mohan Kumar | { |
196 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
197 | 4c793dda | M. Mohan Kumar | return -1; |
198 | 4c793dda | M. Mohan Kumar | } |
199 | 4c793dda | M. Mohan Kumar | |
200 | 4c793dda | M. Mohan Kumar | static int proxy_chown(FsContext *fs_ctx, V9fsPath *fs_path, FsCred *credp) |
201 | 4c793dda | M. Mohan Kumar | { |
202 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
203 | 4c793dda | M. Mohan Kumar | return -1; |
204 | 4c793dda | M. Mohan Kumar | } |
205 | 4c793dda | M. Mohan Kumar | |
206 | 4c793dda | M. Mohan Kumar | static int proxy_utimensat(FsContext *s, V9fsPath *fs_path, |
207 | 4c793dda | M. Mohan Kumar | const struct timespec *buf) |
208 | 4c793dda | M. Mohan Kumar | { |
209 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
210 | 4c793dda | M. Mohan Kumar | return -1; |
211 | 4c793dda | M. Mohan Kumar | } |
212 | 4c793dda | M. Mohan Kumar | |
213 | 4c793dda | M. Mohan Kumar | static int proxy_remove(FsContext *ctx, const char *path) |
214 | 4c793dda | M. Mohan Kumar | { |
215 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
216 | 4c793dda | M. Mohan Kumar | return -1; |
217 | 4c793dda | M. Mohan Kumar | } |
218 | 4c793dda | M. Mohan Kumar | |
219 | 4c793dda | M. Mohan Kumar | static int proxy_fsync(FsContext *ctx, int fid_type, |
220 | 4c793dda | M. Mohan Kumar | V9fsFidOpenState *fs, int datasync)
|
221 | 4c793dda | M. Mohan Kumar | { |
222 | 4c793dda | M. Mohan Kumar | int fd;
|
223 | 4c793dda | M. Mohan Kumar | |
224 | 4c793dda | M. Mohan Kumar | if (fid_type == P9_FID_DIR) {
|
225 | 4c793dda | M. Mohan Kumar | fd = dirfd(fs->dir); |
226 | 4c793dda | M. Mohan Kumar | } else {
|
227 | 4c793dda | M. Mohan Kumar | fd = fs->fd; |
228 | 4c793dda | M. Mohan Kumar | } |
229 | 4c793dda | M. Mohan Kumar | |
230 | 4c793dda | M. Mohan Kumar | if (datasync) {
|
231 | 4c793dda | M. Mohan Kumar | return qemu_fdatasync(fd);
|
232 | 4c793dda | M. Mohan Kumar | } else {
|
233 | 4c793dda | M. Mohan Kumar | return fsync(fd);
|
234 | 4c793dda | M. Mohan Kumar | } |
235 | 4c793dda | M. Mohan Kumar | } |
236 | 4c793dda | M. Mohan Kumar | |
237 | 4c793dda | M. Mohan Kumar | static int proxy_statfs(FsContext *s, V9fsPath *fs_path, struct statfs *stbuf) |
238 | 4c793dda | M. Mohan Kumar | { |
239 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
240 | 4c793dda | M. Mohan Kumar | return -1; |
241 | 4c793dda | M. Mohan Kumar | } |
242 | 4c793dda | M. Mohan Kumar | |
243 | 4c793dda | M. Mohan Kumar | static ssize_t proxy_lgetxattr(FsContext *ctx, V9fsPath *fs_path,
|
244 | 4c793dda | M. Mohan Kumar | const char *name, void *value, size_t size) |
245 | 4c793dda | M. Mohan Kumar | { |
246 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
247 | 4c793dda | M. Mohan Kumar | return -1; |
248 | 4c793dda | M. Mohan Kumar | } |
249 | 4c793dda | M. Mohan Kumar | |
250 | 4c793dda | M. Mohan Kumar | static ssize_t proxy_llistxattr(FsContext *ctx, V9fsPath *fs_path,
|
251 | 4c793dda | M. Mohan Kumar | void *value, size_t size)
|
252 | 4c793dda | M. Mohan Kumar | { |
253 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
254 | 4c793dda | M. Mohan Kumar | return -1; |
255 | 4c793dda | M. Mohan Kumar | } |
256 | 4c793dda | M. Mohan Kumar | |
257 | 4c793dda | M. Mohan Kumar | static int proxy_lsetxattr(FsContext *ctx, V9fsPath *fs_path, const char *name, |
258 | 4c793dda | M. Mohan Kumar | void *value, size_t size, int flags) |
259 | 4c793dda | M. Mohan Kumar | { |
260 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
261 | 4c793dda | M. Mohan Kumar | return -1; |
262 | 4c793dda | M. Mohan Kumar | } |
263 | 4c793dda | M. Mohan Kumar | |
264 | 4c793dda | M. Mohan Kumar | static int proxy_lremovexattr(FsContext *ctx, V9fsPath *fs_path, |
265 | 4c793dda | M. Mohan Kumar | const char *name) |
266 | 4c793dda | M. Mohan Kumar | { |
267 | 4c793dda | M. Mohan Kumar | errno = EOPNOTSUPP; |
268 | 4c793dda | M. Mohan Kumar | return -1; |
269 | 4c793dda | M. Mohan Kumar | } |
270 | 4c793dda | M. Mohan Kumar | |
271 | 4c793dda | M. Mohan Kumar | static int proxy_name_to_path(FsContext *ctx, V9fsPath *dir_path, |
272 | 4c793dda | M. Mohan Kumar | const char *name, V9fsPath *target) |
273 | 4c793dda | M. Mohan Kumar | { |
274 | 4c793dda | M. Mohan Kumar | if (dir_path) {
|
275 | 4c793dda | M. Mohan Kumar | v9fs_string_sprintf((V9fsString *)target, "%s/%s",
|
276 | 4c793dda | M. Mohan Kumar | dir_path->data, name); |
277 | 4c793dda | M. Mohan Kumar | } else {
|
278 | 4c793dda | M. Mohan Kumar | v9fs_string_sprintf((V9fsString *)target, "%s", name);
|
279 | 4c793dda | M. Mohan Kumar | } |
280 | 4c793dda | M. Mohan Kumar | /* Bump the size for including terminating NULL */
|
281 | 4c793dda | M. Mohan Kumar | target->size++; |
282 | 4c793dda | M. Mohan Kumar | return 0; |
283 | 4c793dda | M. Mohan Kumar | } |
284 | 4c793dda | M. Mohan Kumar | |
285 | 4c793dda | M. Mohan Kumar | static int proxy_renameat(FsContext *ctx, V9fsPath *olddir, |
286 | 4c793dda | M. Mohan Kumar | const char *old_name, V9fsPath *newdir, |
287 | 4c793dda | M. Mohan Kumar | const char *new_name) |
288 | 4c793dda | M. Mohan Kumar | { |
289 | 4c793dda | M. Mohan Kumar | int ret;
|
290 | 4c793dda | M. Mohan Kumar | V9fsString old_full_name, new_full_name; |
291 | 4c793dda | M. Mohan Kumar | |
292 | 4c793dda | M. Mohan Kumar | v9fs_string_init(&old_full_name); |
293 | 4c793dda | M. Mohan Kumar | v9fs_string_init(&new_full_name); |
294 | 4c793dda | M. Mohan Kumar | |
295 | 4c793dda | M. Mohan Kumar | v9fs_string_sprintf(&old_full_name, "%s/%s", olddir->data, old_name);
|
296 | 4c793dda | M. Mohan Kumar | v9fs_string_sprintf(&new_full_name, "%s/%s", newdir->data, new_name);
|
297 | 4c793dda | M. Mohan Kumar | |
298 | 4c793dda | M. Mohan Kumar | ret = proxy_rename(ctx, old_full_name.data, new_full_name.data); |
299 | 4c793dda | M. Mohan Kumar | v9fs_string_free(&old_full_name); |
300 | 4c793dda | M. Mohan Kumar | v9fs_string_free(&new_full_name); |
301 | 4c793dda | M. Mohan Kumar | return ret;
|
302 | 4c793dda | M. Mohan Kumar | } |
303 | 4c793dda | M. Mohan Kumar | |
304 | 4c793dda | M. Mohan Kumar | static int proxy_unlinkat(FsContext *ctx, V9fsPath *dir, |
305 | 4c793dda | M. Mohan Kumar | const char *name, int flags) |
306 | 4c793dda | M. Mohan Kumar | { |
307 | 4c793dda | M. Mohan Kumar | int ret;
|
308 | 4c793dda | M. Mohan Kumar | V9fsString fullname; |
309 | 4c793dda | M. Mohan Kumar | v9fs_string_init(&fullname); |
310 | 4c793dda | M. Mohan Kumar | |
311 | 4c793dda | M. Mohan Kumar | v9fs_string_sprintf(&fullname, "%s/%s", dir->data, name);
|
312 | 4c793dda | M. Mohan Kumar | ret = proxy_remove(ctx, fullname.data); |
313 | 4c793dda | M. Mohan Kumar | v9fs_string_free(&fullname); |
314 | 4c793dda | M. Mohan Kumar | |
315 | 4c793dda | M. Mohan Kumar | return ret;
|
316 | 4c793dda | M. Mohan Kumar | } |
317 | 4c793dda | M. Mohan Kumar | |
318 | 4c793dda | M. Mohan Kumar | static int proxy_parse_opts(QemuOpts *opts, struct FsDriverEntry *fs) |
319 | 4c793dda | M. Mohan Kumar | { |
320 | 4c793dda | M. Mohan Kumar | const char *sock_fd = qemu_opt_get(opts, "sock_fd"); |
321 | 4c793dda | M. Mohan Kumar | |
322 | 4c793dda | M. Mohan Kumar | if (sock_fd) {
|
323 | 4c793dda | M. Mohan Kumar | fprintf(stderr, "sock_fd option not specified\n");
|
324 | 4c793dda | M. Mohan Kumar | return -1; |
325 | 4c793dda | M. Mohan Kumar | } |
326 | 4c793dda | M. Mohan Kumar | fs->path = g_strdup(sock_fd); |
327 | 4c793dda | M. Mohan Kumar | return 0; |
328 | 4c793dda | M. Mohan Kumar | } |
329 | 4c793dda | M. Mohan Kumar | |
330 | 4c793dda | M. Mohan Kumar | static int proxy_init(FsContext *ctx) |
331 | 4c793dda | M. Mohan Kumar | { |
332 | 4c793dda | M. Mohan Kumar | V9fsProxy *proxy = g_malloc(sizeof(V9fsProxy));
|
333 | 4c793dda | M. Mohan Kumar | int sock_id;
|
334 | 4c793dda | M. Mohan Kumar | |
335 | 4c793dda | M. Mohan Kumar | sock_id = atoi(ctx->fs_root); |
336 | 4c793dda | M. Mohan Kumar | if (sock_id < 0) { |
337 | 4c793dda | M. Mohan Kumar | fprintf(stderr, "socket descriptor not initialized\n");
|
338 | 4c793dda | M. Mohan Kumar | return -1; |
339 | 4c793dda | M. Mohan Kumar | } |
340 | 4c793dda | M. Mohan Kumar | g_free(ctx->fs_root); |
341 | 4c793dda | M. Mohan Kumar | |
342 | 4c793dda | M. Mohan Kumar | proxy->iovec.iov_base = g_malloc(PROXY_MAX_IO_SZ + PROXY_HDR_SZ); |
343 | 4c793dda | M. Mohan Kumar | proxy->iovec.iov_len = PROXY_MAX_IO_SZ + PROXY_HDR_SZ; |
344 | 4c793dda | M. Mohan Kumar | ctx->private = proxy; |
345 | 4c793dda | M. Mohan Kumar | proxy->sockfd = sock_id; |
346 | 4c793dda | M. Mohan Kumar | qemu_mutex_init(&proxy->mutex); |
347 | 4c793dda | M. Mohan Kumar | |
348 | 4c793dda | M. Mohan Kumar | ctx->export_flags |= V9FS_PATHNAME_FSCONTEXT; |
349 | 4c793dda | M. Mohan Kumar | return 0; |
350 | 4c793dda | M. Mohan Kumar | } |
351 | 4c793dda | M. Mohan Kumar | |
352 | 4c793dda | M. Mohan Kumar | FileOperations proxy_ops = { |
353 | 4c793dda | M. Mohan Kumar | .parse_opts = proxy_parse_opts, |
354 | 4c793dda | M. Mohan Kumar | .init = proxy_init, |
355 | 4c793dda | M. Mohan Kumar | .lstat = proxy_lstat, |
356 | 4c793dda | M. Mohan Kumar | .readlink = proxy_readlink, |
357 | 4c793dda | M. Mohan Kumar | .close = proxy_close, |
358 | 4c793dda | M. Mohan Kumar | .closedir = proxy_closedir, |
359 | 4c793dda | M. Mohan Kumar | .open = proxy_open, |
360 | 4c793dda | M. Mohan Kumar | .opendir = proxy_opendir, |
361 | 4c793dda | M. Mohan Kumar | .rewinddir = proxy_rewinddir, |
362 | 4c793dda | M. Mohan Kumar | .telldir = proxy_telldir, |
363 | 4c793dda | M. Mohan Kumar | .readdir_r = proxy_readdir_r, |
364 | 4c793dda | M. Mohan Kumar | .seekdir = proxy_seekdir, |
365 | 4c793dda | M. Mohan Kumar | .preadv = proxy_preadv, |
366 | 4c793dda | M. Mohan Kumar | .pwritev = proxy_pwritev, |
367 | 4c793dda | M. Mohan Kumar | .chmod = proxy_chmod, |
368 | 4c793dda | M. Mohan Kumar | .mknod = proxy_mknod, |
369 | 4c793dda | M. Mohan Kumar | .mkdir = proxy_mkdir, |
370 | 4c793dda | M. Mohan Kumar | .fstat = proxy_fstat, |
371 | 4c793dda | M. Mohan Kumar | .open2 = proxy_open2, |
372 | 4c793dda | M. Mohan Kumar | .symlink = proxy_symlink, |
373 | 4c793dda | M. Mohan Kumar | .link = proxy_link, |
374 | 4c793dda | M. Mohan Kumar | .truncate = proxy_truncate, |
375 | 4c793dda | M. Mohan Kumar | .rename = proxy_rename, |
376 | 4c793dda | M. Mohan Kumar | .chown = proxy_chown, |
377 | 4c793dda | M. Mohan Kumar | .utimensat = proxy_utimensat, |
378 | 4c793dda | M. Mohan Kumar | .remove = proxy_remove, |
379 | 4c793dda | M. Mohan Kumar | .fsync = proxy_fsync, |
380 | 4c793dda | M. Mohan Kumar | .statfs = proxy_statfs, |
381 | 4c793dda | M. Mohan Kumar | .lgetxattr = proxy_lgetxattr, |
382 | 4c793dda | M. Mohan Kumar | .llistxattr = proxy_llistxattr, |
383 | 4c793dda | M. Mohan Kumar | .lsetxattr = proxy_lsetxattr, |
384 | 4c793dda | M. Mohan Kumar | .lremovexattr = proxy_lremovexattr, |
385 | 4c793dda | M. Mohan Kumar | .name_to_path = proxy_name_to_path, |
386 | 4c793dda | M. Mohan Kumar | .renameat = proxy_renameat, |
387 | 4c793dda | M. Mohan Kumar | .unlinkat = proxy_unlinkat, |
388 | 4c793dda | M. Mohan Kumar | }; |