xref: /openbmc/qemu/fsdev/file-op-9p.h (revision 353ac78d495ef976242abd868f68d78420861c2c)
1*353ac78dSAneesh Kumar K.V /*
2*353ac78dSAneesh Kumar K.V  * Virtio 9p
3*353ac78dSAneesh Kumar K.V  *
4*353ac78dSAneesh Kumar K.V  * Copyright IBM, Corp. 2010
5*353ac78dSAneesh Kumar K.V  *
6*353ac78dSAneesh Kumar K.V  * Authors:
7*353ac78dSAneesh Kumar K.V  *  Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
8*353ac78dSAneesh Kumar K.V  *
9*353ac78dSAneesh Kumar K.V  * This work is licensed under the terms of the GNU GPL, version 2.  See
10*353ac78dSAneesh Kumar K.V  * the COPYING file in the top-level directory.
11*353ac78dSAneesh Kumar K.V  *
12*353ac78dSAneesh Kumar K.V  */
13*353ac78dSAneesh Kumar K.V #ifndef _FILEOP_H
14*353ac78dSAneesh Kumar K.V #define _FILEOP_H
15*353ac78dSAneesh Kumar K.V #include <sys/types.h>
16*353ac78dSAneesh Kumar K.V #include <dirent.h>
17*353ac78dSAneesh Kumar K.V #include <sys/time.h>
18*353ac78dSAneesh Kumar K.V #include <utime.h>
19*353ac78dSAneesh Kumar K.V #include <sys/stat.h>
20*353ac78dSAneesh Kumar K.V #include <sys/uio.h>
21*353ac78dSAneesh Kumar K.V #include <sys/vfs.h>
22*353ac78dSAneesh Kumar K.V #define SM_LOCAL_MODE_BITS    0600
23*353ac78dSAneesh Kumar K.V #define SM_LOCAL_DIR_MODE_BITS    0700
24*353ac78dSAneesh Kumar K.V 
25*353ac78dSAneesh Kumar K.V typedef enum
26*353ac78dSAneesh Kumar K.V {
27*353ac78dSAneesh Kumar K.V     /*
28*353ac78dSAneesh Kumar K.V      * Server will try to set uid/gid.
29*353ac78dSAneesh Kumar K.V      * On failure ignore the error.
30*353ac78dSAneesh Kumar K.V      */
31*353ac78dSAneesh Kumar K.V     SM_NONE = 0,
32*353ac78dSAneesh Kumar K.V     /*
33*353ac78dSAneesh Kumar K.V      * uid/gid set on fileserver files
34*353ac78dSAneesh Kumar K.V      */
35*353ac78dSAneesh Kumar K.V     SM_PASSTHROUGH = 1,
36*353ac78dSAneesh Kumar K.V     /*
37*353ac78dSAneesh Kumar K.V      * uid/gid part of xattr
38*353ac78dSAneesh Kumar K.V      */
39*353ac78dSAneesh Kumar K.V     SM_MAPPED,
40*353ac78dSAneesh Kumar K.V } SecModel;
41*353ac78dSAneesh Kumar K.V 
42*353ac78dSAneesh Kumar K.V typedef struct FsCred
43*353ac78dSAneesh Kumar K.V {
44*353ac78dSAneesh Kumar K.V     uid_t   fc_uid;
45*353ac78dSAneesh Kumar K.V     gid_t   fc_gid;
46*353ac78dSAneesh Kumar K.V     mode_t  fc_mode;
47*353ac78dSAneesh Kumar K.V     dev_t   fc_rdev;
48*353ac78dSAneesh Kumar K.V } FsCred;
49*353ac78dSAneesh Kumar K.V 
50*353ac78dSAneesh Kumar K.V struct xattr_operations;
51*353ac78dSAneesh Kumar K.V 
52*353ac78dSAneesh Kumar K.V typedef struct FsContext
53*353ac78dSAneesh Kumar K.V {
54*353ac78dSAneesh Kumar K.V     char *fs_root;
55*353ac78dSAneesh Kumar K.V     SecModel fs_sm;
56*353ac78dSAneesh Kumar K.V     uid_t uid;
57*353ac78dSAneesh Kumar K.V     struct xattr_operations **xops;
58*353ac78dSAneesh Kumar K.V } FsContext;
59*353ac78dSAneesh Kumar K.V 
60*353ac78dSAneesh Kumar K.V void cred_init(FsCred *);
61*353ac78dSAneesh Kumar K.V 
62*353ac78dSAneesh Kumar K.V typedef struct FileOperations
63*353ac78dSAneesh Kumar K.V {
64*353ac78dSAneesh Kumar K.V     int (*lstat)(FsContext *, const char *, struct stat *);
65*353ac78dSAneesh Kumar K.V     ssize_t (*readlink)(FsContext *, const char *, char *, size_t);
66*353ac78dSAneesh Kumar K.V     int (*chmod)(FsContext *, const char *, FsCred *);
67*353ac78dSAneesh Kumar K.V     int (*chown)(FsContext *, const char *, FsCred *);
68*353ac78dSAneesh Kumar K.V     int (*mknod)(FsContext *, const char *, FsCred *);
69*353ac78dSAneesh Kumar K.V     int (*utimensat)(FsContext *, const char *, const struct timespec *);
70*353ac78dSAneesh Kumar K.V     int (*remove)(FsContext *, const char *);
71*353ac78dSAneesh Kumar K.V     int (*symlink)(FsContext *, const char *, const char *, FsCred *);
72*353ac78dSAneesh Kumar K.V     int (*link)(FsContext *, const char *, const char *);
73*353ac78dSAneesh Kumar K.V     int (*setuid)(FsContext *, uid_t);
74*353ac78dSAneesh Kumar K.V     int (*close)(FsContext *, int);
75*353ac78dSAneesh Kumar K.V     int (*closedir)(FsContext *, DIR *);
76*353ac78dSAneesh Kumar K.V     DIR *(*opendir)(FsContext *, const char *);
77*353ac78dSAneesh Kumar K.V     int (*open)(FsContext *, const char *, int);
78*353ac78dSAneesh Kumar K.V     int (*open2)(FsContext *, const char *, int, FsCred *);
79*353ac78dSAneesh Kumar K.V     void (*rewinddir)(FsContext *, DIR *);
80*353ac78dSAneesh Kumar K.V     off_t (*telldir)(FsContext *, DIR *);
81*353ac78dSAneesh Kumar K.V     struct dirent *(*readdir)(FsContext *, DIR *);
82*353ac78dSAneesh Kumar K.V     void (*seekdir)(FsContext *, DIR *, off_t);
83*353ac78dSAneesh Kumar K.V     ssize_t (*preadv)(FsContext *, int, const struct iovec *, int, off_t);
84*353ac78dSAneesh Kumar K.V     ssize_t (*pwritev)(FsContext *, int, const struct iovec *, int, off_t);
85*353ac78dSAneesh Kumar K.V     int (*mkdir)(FsContext *, const char *, FsCred *);
86*353ac78dSAneesh Kumar K.V     int (*fstat)(FsContext *, int, struct stat *);
87*353ac78dSAneesh Kumar K.V     int (*rename)(FsContext *, const char *, const char *);
88*353ac78dSAneesh Kumar K.V     int (*truncate)(FsContext *, const char *, off_t);
89*353ac78dSAneesh Kumar K.V     int (*fsync)(FsContext *, int, int);
90*353ac78dSAneesh Kumar K.V     int (*statfs)(FsContext *s, const char *path, struct statfs *stbuf);
91*353ac78dSAneesh Kumar K.V     ssize_t (*lgetxattr)(FsContext *, const char *,
92*353ac78dSAneesh Kumar K.V                          const char *, void *, size_t);
93*353ac78dSAneesh Kumar K.V     ssize_t (*llistxattr)(FsContext *, const char *, void *, size_t);
94*353ac78dSAneesh Kumar K.V     int (*lsetxattr)(FsContext *, const char *,
95*353ac78dSAneesh Kumar K.V                      const char *, void *, size_t, int);
96*353ac78dSAneesh Kumar K.V     int (*lremovexattr)(FsContext *, const char *, const char *);
97*353ac78dSAneesh Kumar K.V     void *opaque;
98*353ac78dSAneesh Kumar K.V } FileOperations;
99*353ac78dSAneesh Kumar K.V 
100*353ac78dSAneesh Kumar K.V static inline const char *rpath(FsContext *ctx, const char *path)
101*353ac78dSAneesh Kumar K.V {
102*353ac78dSAneesh Kumar K.V     /* FIXME: so wrong... */
103*353ac78dSAneesh Kumar K.V     static char buffer[4096];
104*353ac78dSAneesh Kumar K.V     snprintf(buffer, sizeof(buffer), "%s/%s", ctx->fs_root, path);
105*353ac78dSAneesh Kumar K.V     return buffer;
106*353ac78dSAneesh Kumar K.V }
107*353ac78dSAneesh Kumar K.V #endif
108