|  | /* | 
|  | * 9p utilities (Linux Implementation) | 
|  | * | 
|  | * Copyright IBM, Corp. 2017 | 
|  | * | 
|  | * Authors: | 
|  | *  Greg Kurz <groug@kaod.org> | 
|  | * | 
|  | * This work is licensed under the terms of the GNU GPL, version 2 or later. | 
|  | * See the COPYING file in the top-level directory. | 
|  | */ | 
|  |  | 
|  | /* | 
|  | * Not so fast! You might want to read the 9p developer docs first: | 
|  | * https://wiki.qemu.org/Documentation/9p | 
|  | */ | 
|  |  | 
|  | #include "qemu/osdep.h" | 
|  | #include "qemu/xattr.h" | 
|  | #include "9p-util.h" | 
|  |  | 
|  | ssize_t fgetxattrat_nofollow(int dirfd, const char *filename, const char *name, | 
|  | void *value, size_t size) | 
|  | { | 
|  | char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename); | 
|  | int ret; | 
|  |  | 
|  | ret = lgetxattr(proc_path, name, value, size); | 
|  | g_free(proc_path); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | ssize_t flistxattrat_nofollow(int dirfd, const char *filename, | 
|  | char *list, size_t size) | 
|  | { | 
|  | char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename); | 
|  | int ret; | 
|  |  | 
|  | ret = llistxattr(proc_path, list, size); | 
|  | g_free(proc_path); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | ssize_t fremovexattrat_nofollow(int dirfd, const char *filename, | 
|  | const char *name) | 
|  | { | 
|  | char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename); | 
|  | int ret; | 
|  |  | 
|  | ret = lremovexattr(proc_path, name); | 
|  | g_free(proc_path); | 
|  | return ret; | 
|  | } | 
|  |  | 
|  | int fsetxattrat_nofollow(int dirfd, const char *filename, const char *name, | 
|  | void *value, size_t size, int flags) | 
|  | { | 
|  | char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename); | 
|  | int ret; | 
|  |  | 
|  | ret = lsetxattr(proc_path, name, value, size, flags); | 
|  | g_free(proc_path); | 
|  | return ret; | 
|  |  | 
|  | } | 
|  |  | 
|  | int qemu_mknodat(int dirfd, const char *filename, mode_t mode, dev_t dev) | 
|  | { | 
|  | return mknodat(dirfd, filename, mode, dev); | 
|  | } |