16482a961SGreg Kurz /*
26450084aSKeno Fischer * 9p utilities (Linux Implementation)
36482a961SGreg Kurz *
46482a961SGreg Kurz * Copyright IBM, Corp. 2017
56482a961SGreg Kurz *
66482a961SGreg Kurz * Authors:
76482a961SGreg Kurz * Greg Kurz <groug@kaod.org>
86482a961SGreg Kurz *
96482a961SGreg Kurz * This work is licensed under the terms of the GNU GPL, version 2 or later.
106482a961SGreg Kurz * See the COPYING file in the top-level directory.
116482a961SGreg Kurz */
126482a961SGreg Kurz
136f569084SChristian Schoenebeck /*
146f569084SChristian Schoenebeck * Not so fast! You might want to read the 9p developer docs first:
156f569084SChristian Schoenebeck * https://wiki.qemu.org/Documentation/9p
166f569084SChristian Schoenebeck */
176f569084SChristian Schoenebeck
186482a961SGreg Kurz #include "qemu/osdep.h"
1956ad3e54SGreg Kurz #include "qemu/xattr.h"
206482a961SGreg Kurz #include "9p-util.h"
216482a961SGreg Kurz
fgetxattrat_nofollow(int dirfd,const char * filename,const char * name,void * value,size_t size)2256ad3e54SGreg Kurz ssize_t fgetxattrat_nofollow(int dirfd, const char *filename, const char *name,
2356ad3e54SGreg Kurz void *value, size_t size)
2456ad3e54SGreg Kurz {
2556ad3e54SGreg Kurz char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
2656ad3e54SGreg Kurz int ret;
2756ad3e54SGreg Kurz
2856ad3e54SGreg Kurz ret = lgetxattr(proc_path, name, value, size);
2956ad3e54SGreg Kurz g_free(proc_path);
3056ad3e54SGreg Kurz return ret;
3156ad3e54SGreg Kurz }
32ec70b956SKeno Fischer
flistxattrat_nofollow(int dirfd,const char * filename,char * list,size_t size)33ec70b956SKeno Fischer ssize_t flistxattrat_nofollow(int dirfd, const char *filename,
34ec70b956SKeno Fischer char *list, size_t size)
35ec70b956SKeno Fischer {
36ec70b956SKeno Fischer char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
37ec70b956SKeno Fischer int ret;
38ec70b956SKeno Fischer
39ec70b956SKeno Fischer ret = llistxattr(proc_path, list, size);
40ec70b956SKeno Fischer g_free(proc_path);
41ec70b956SKeno Fischer return ret;
42ec70b956SKeno Fischer }
43ec70b956SKeno Fischer
fremovexattrat_nofollow(int dirfd,const char * filename,const char * name)44ec70b956SKeno Fischer ssize_t fremovexattrat_nofollow(int dirfd, const char *filename,
45ec70b956SKeno Fischer const char *name)
46ec70b956SKeno Fischer {
47ec70b956SKeno Fischer char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
48ec70b956SKeno Fischer int ret;
49ec70b956SKeno Fischer
50ec70b956SKeno Fischer ret = lremovexattr(proc_path, name);
51ec70b956SKeno Fischer g_free(proc_path);
52ec70b956SKeno Fischer return ret;
53ec70b956SKeno Fischer }
54ec70b956SKeno Fischer
fsetxattrat_nofollow(int dirfd,const char * filename,const char * name,void * value,size_t size,int flags)55ec70b956SKeno Fischer int fsetxattrat_nofollow(int dirfd, const char *filename, const char *name,
56ec70b956SKeno Fischer void *value, size_t size, int flags)
57ec70b956SKeno Fischer {
58ec70b956SKeno Fischer char *proc_path = g_strdup_printf("/proc/self/fd/%d/%s", dirfd, filename);
59ec70b956SKeno Fischer int ret;
60ec70b956SKeno Fischer
61ec70b956SKeno Fischer ret = lsetxattr(proc_path, name, value, size, flags);
62ec70b956SKeno Fischer g_free(proc_path);
63ec70b956SKeno Fischer return ret;
64*029ed1bdSKeno Fischer
65*029ed1bdSKeno Fischer }
66*029ed1bdSKeno Fischer
qemu_mknodat(int dirfd,const char * filename,mode_t mode,dev_t dev)67*029ed1bdSKeno Fischer int qemu_mknodat(int dirfd, const char *filename, mode_t mode, dev_t dev)
68*029ed1bdSKeno Fischer {
69*029ed1bdSKeno Fischer return mknodat(dirfd, filename, mode, dev);
70ec70b956SKeno Fischer }
71