xref: /qemu/hw/9pfs/9p-util-linux.c (revision 029ed1bd9defa33a80bb40cdcd003699299af8db)
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