| /* |
| * 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); |
| } |