On Tue, Jan 18, 2011 at 6:25 AM, M. Mohan Kumar <mo...@in.ibm.com> wrote: > Add both server & client side interfaces to create regular files in > chroot environment > > Signed-off-by: M. Mohan Kumar <mo...@in.ibm.com> > --- > hw/9pfs/virtio-9p-chroot.c | 42 ++++++++++++++++++++++++++++++++++++++++++ > hw/9pfs/virtio-9p-local.c | 22 ++++++++++++++++++++-- > 2 files changed, 62 insertions(+), 2 deletions(-) > > diff --git a/hw/9pfs/virtio-9p-chroot.c b/hw/9pfs/virtio-9p-chroot.c > index b599e23..e7f85e2 100644 > --- a/hw/9pfs/virtio-9p-chroot.c > +++ b/hw/9pfs/virtio-9p-chroot.c > @@ -193,6 +193,42 @@ static void chroot_do_open(V9fsFileObjectRequest > *request, FdInfo *fd_info) > } > } > > +/* > + * Helper routine to create a file and return the file descriptor and > + * error status in FdInfo structure. > + */ > +static void chroot_do_create(V9fsFileObjectRequest *request, FdInfo *fd_info) > +{ > + int cur_uid, cur_gid;
uid_t cur_uid; gid_t cur_gid; > + > + cur_uid = geteuid(); > + cur_gid = getegid(); > + > + fd_info->fi_fd = -1; > + > + if (setfsuid(request->data.uid) < 0) { > + fd_info->fi_error = errno; > + return; > + } > + if (setfsgid(request->data.gid) < 0) { > + fd_info->fi_error = errno; > + goto unset_uid; > + } > + > + fd_info->fi_fd = open(request->path.path, request->data.flags, > + request->data.mode); > + > + if (fd_info->fi_fd < 0) { > + fd_info->fi_error = errno; > + } else { > + fd_info->fi_error = 0; > + } > + > + setfsgid(cur_gid); > +unset_uid: > + setfsuid(cur_uid); > +} > + > static int chroot_daemonize(int chroot_sock) > { > sigset_t sigset; > @@ -276,6 +312,12 @@ int v9fs_chroot(FsContext *fs_ctx) > error = -2; > } > break; > + case T_CREATE: > + chroot_do_create(&request, &fd_info); > + if (chroot_sendfd(chroot_sock, &fd_info) <= 0) { > + error = -2; > + } > + break; > default: > break; > } > diff --git a/hw/9pfs/virtio-9p-local.c b/hw/9pfs/virtio-9p-local.c > index 2376ec2..7f39b40 100644 > --- a/hw/9pfs/virtio-9p-local.c > +++ b/hw/9pfs/virtio-9p-local.c > @@ -52,6 +52,23 @@ static int __open(FsContext *fs_ctx, const char *path, int > flags) > return fd; > } > > +static int __create(FsContext *fs_ctx, const char *path, int flags, Please don't use identifiers starting with underscores.