From: "M. Mohan Kumar" <mo...@in.ibm.com> Add chroot functionality for system calls that can operate on a file using relative directory file descriptor.
Signed-off-by: M. Mohan Kumar <mo...@in.ibm.com> --- hw/9pfs/virtio-9p-local.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 39 insertions(+), 2 deletions(-) diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c index e865cc8..5847d43 100644 --- a/hw/9pfs/virtio-9p-local.c +++ b/hw/9pfs/virtio-9p-local.c @@ -608,7 +608,25 @@ static int local_truncate(FsContext *ctx, V9fsPath *fs_path, off_t size) char buffer[PATH_MAX]; char *path = fs_path->data; - return truncate(rpath(ctx, path, buffer), size); + if (ctx->fs_sm == SM_PASSTHROUGH) { + int fd, retval, serrno; + fd = passthrough_request(ctx, NULL, path, O_RDWR, NULL, T_OPEN); + if (fd < 0) { + errno = -fd; + return -1; + } + retval = ftruncate(fd, size); + if (retval < 0) { + serrno = errno; + } + close(fd); + if (retval < 0) { + errno = serrno; + } + return retval; + } else { + return truncate(rpath(ctx, path, buffer), size); + } } static int local_rename(FsContext *ctx, const char *oldpath, @@ -648,8 +666,27 @@ static int local_utimensat(FsContext *s, V9fsPath *fs_path, char buffer[PATH_MAX]; char *path = fs_path->data; - return qemu_utimensat(AT_FDCWD, rpath(s, path, buffer), buf, + if (s->fs_sm == SM_PASSTHROUGH) { + int fd, retval, serrno = 0; + fd = passthrough_request(s, NULL, path, + O_RDONLY | O_NONBLOCK | O_NOFOLLOW, NULL, T_OPEN); + if (fd < 0) { + errno = -fd; + return -1; + } + retval = futimens(fd, buf); + if (retval < 0) { + serrno = errno; + } + close(fd); + if (retval < 0) { + errno = serrno; + } + return retval; + } else { + return qemu_utimensat(AT_FDCWD, rpath(s, path, buffer), buf, AT_SYMLINK_NOFOLLOW); + } } static int local_remove(FsContext *ctx, const char *path) -- 1.7.5.4