xref: /illumos-gate/usr/src/lib/lib9p/common/fcall.h (revision aa693e99)
1*aa693e99SJason King /*
2*aa693e99SJason King  * Copyright 2016 Jakub Klama <jceel@FreeBSD.org>
3*aa693e99SJason King  * All rights reserved
4*aa693e99SJason King  *
5*aa693e99SJason King  * Redistribution and use in source and binary forms, with or without
6*aa693e99SJason King  * modification, are permitted providing that the following conditions
7*aa693e99SJason King  * are met:
8*aa693e99SJason King  * 1. Redistributions of source code must retain the above copyright
9*aa693e99SJason King  *    notice, this list of conditions and the following disclaimer.
10*aa693e99SJason King  * 2. Redistributions in binary form must reproduce the above copyright
11*aa693e99SJason King  *    notice, this list of conditions and the following disclaimer in the
12*aa693e99SJason King  *    documentation and/or other materials provided with the distribution.
13*aa693e99SJason King  *
14*aa693e99SJason King  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15*aa693e99SJason King  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16*aa693e99SJason King  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*aa693e99SJason King  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
18*aa693e99SJason King  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*aa693e99SJason King  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*aa693e99SJason King  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*aa693e99SJason King  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22*aa693e99SJason King  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
23*aa693e99SJason King  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24*aa693e99SJason King  * POSSIBILITY OF SUCH DAMAGE.
25*aa693e99SJason King  *
26*aa693e99SJason King  */
27*aa693e99SJason King 
28*aa693e99SJason King /*
29*aa693e99SJason King  * Based on libixp code: ©2007-2010 Kris Maglione <maglione.k at Gmail>
30*aa693e99SJason King  */
31*aa693e99SJason King 
32*aa693e99SJason King #ifndef LIB9P_FCALL_H
33*aa693e99SJason King #define LIB9P_FCALL_H
34*aa693e99SJason King 
35*aa693e99SJason King #include <stdint.h>
36*aa693e99SJason King 
37*aa693e99SJason King #define L9P_MAX_WELEM   256
38*aa693e99SJason King 
39*aa693e99SJason King /*
40*aa693e99SJason King  * Function call/reply (Tfoo/Rfoo) numbers.
41*aa693e99SJason King  *
42*aa693e99SJason King  * These are protocol code numbers, so the exact values
43*aa693e99SJason King  * matter.  However, __FIRST and __LAST_PLUS_ONE are for
44*aa693e99SJason King  * debug code, and just need to encompass the entire range.
45*aa693e99SJason King  *
46*aa693e99SJason King  * Note that we rely (in the debug code) on Rfoo == Tfoo+1.
47*aa693e99SJason King  */
48*aa693e99SJason King enum l9p_ftype {
49*aa693e99SJason King 	L9P__FIRST = 6,		/* NB: must be <= all legal values */
50*aa693e99SJason King 	L9P_TLERROR = 6,	/* illegal; exists for parity with Rlerror */
51*aa693e99SJason King 	L9P_RLERROR,
52*aa693e99SJason King 	L9P_TSTATFS = 8,
53*aa693e99SJason King 	L9P_RSTATFS,
54*aa693e99SJason King 	L9P_TLOPEN = 12,
55*aa693e99SJason King 	L9P_RLOPEN,
56*aa693e99SJason King 	L9P_TLCREATE = 14,
57*aa693e99SJason King 	L9P_RLCREATE,
58*aa693e99SJason King 	L9P_TSYMLINK = 16,
59*aa693e99SJason King 	L9P_RSYMLINK,
60*aa693e99SJason King 	L9P_TMKNOD = 18,
61*aa693e99SJason King 	L9P_RMKNOD,
62*aa693e99SJason King 	L9P_TRENAME = 20,
63*aa693e99SJason King 	L9P_RRENAME,
64*aa693e99SJason King 	L9P_TREADLINK = 22,
65*aa693e99SJason King 	L9P_RREADLINK,
66*aa693e99SJason King 	L9P_TGETATTR = 24,
67*aa693e99SJason King 	L9P_RGETATTR,
68*aa693e99SJason King 	L9P_TSETATTR = 26,
69*aa693e99SJason King 	L9P_RSETATTR,
70*aa693e99SJason King 	L9P_TXATTRWALK = 30,
71*aa693e99SJason King 	L9P_RXATTRWALK,
72*aa693e99SJason King 	L9P_TXATTRCREATE = 32,
73*aa693e99SJason King 	L9P_RXATTRCREATE,
74*aa693e99SJason King 	L9P_TREADDIR = 40,
75*aa693e99SJason King 	L9P_RREADDIR,
76*aa693e99SJason King 	L9P_TFSYNC = 50,
77*aa693e99SJason King 	L9P_RFSYNC,
78*aa693e99SJason King 	L9P_TLOCK = 52,
79*aa693e99SJason King 	L9P_RLOCK,
80*aa693e99SJason King 	L9P_TGETLOCK = 54,
81*aa693e99SJason King 	L9P_RGETLOCK,
82*aa693e99SJason King 	L9P_TLINK = 70,
83*aa693e99SJason King 	L9P_RLINK,
84*aa693e99SJason King 	L9P_TMKDIR = 72,
85*aa693e99SJason King 	L9P_RMKDIR,
86*aa693e99SJason King 	L9P_TRENAMEAT = 74,
87*aa693e99SJason King 	L9P_RRENAMEAT,
88*aa693e99SJason King 	L9P_TUNLINKAT = 76,
89*aa693e99SJason King 	L9P_RUNLINKAT,
90*aa693e99SJason King 	L9P_TVERSION = 100,
91*aa693e99SJason King 	L9P_RVERSION,
92*aa693e99SJason King 	L9P_TAUTH = 102,
93*aa693e99SJason King 	L9P_RAUTH,
94*aa693e99SJason King 	L9P_TATTACH = 104,
95*aa693e99SJason King 	L9P_RATTACH,
96*aa693e99SJason King 	L9P_TERROR = 106, 	/* illegal */
97*aa693e99SJason King 	L9P_RERROR,
98*aa693e99SJason King 	L9P_TFLUSH = 108,
99*aa693e99SJason King 	L9P_RFLUSH,
100*aa693e99SJason King 	L9P_TWALK = 110,
101*aa693e99SJason King 	L9P_RWALK,
102*aa693e99SJason King 	L9P_TOPEN = 112,
103*aa693e99SJason King 	L9P_ROPEN,
104*aa693e99SJason King 	L9P_TCREATE = 114,
105*aa693e99SJason King 	L9P_RCREATE,
106*aa693e99SJason King 	L9P_TREAD = 116,
107*aa693e99SJason King 	L9P_RREAD,
108*aa693e99SJason King 	L9P_TWRITE = 118,
109*aa693e99SJason King 	L9P_RWRITE,
110*aa693e99SJason King 	L9P_TCLUNK = 120,
111*aa693e99SJason King 	L9P_RCLUNK,
112*aa693e99SJason King 	L9P_TREMOVE = 122,
113*aa693e99SJason King 	L9P_RREMOVE,
114*aa693e99SJason King 	L9P_TSTAT = 124,
115*aa693e99SJason King 	L9P_RSTAT,
116*aa693e99SJason King 	L9P_TWSTAT = 126,
117*aa693e99SJason King 	L9P_RWSTAT,
118*aa693e99SJason King 	L9P__LAST_PLUS_1,	/* NB: must be last */
119*aa693e99SJason King };
120*aa693e99SJason King 
121*aa693e99SJason King /*
122*aa693e99SJason King  * When a Tfoo request comes over the wire, we decode it
123*aa693e99SJason King  * (pack.c) from wire format into a request laid out in
124*aa693e99SJason King  * a "union l9p_fcall" object.  This object is not in wire
125*aa693e99SJason King  * format, but rather in something more convenient for us
126*aa693e99SJason King  * to operate on.
127*aa693e99SJason King  *
128*aa693e99SJason King  * We then dispatch the request (request.c, backend/fs.c) and
129*aa693e99SJason King  * use another "union l9p_fcall" object to build a reply.
130*aa693e99SJason King  * The reply is converted to wire format on the way back out
131*aa693e99SJason King  * (pack.c again).
132*aa693e99SJason King  *
133*aa693e99SJason King  * All sub-objects start with a header containing the request
134*aa693e99SJason King  * or reply type code and two-byte tag, and whether or not it
135*aa693e99SJason King  * is needed, a four-byte fid.
136*aa693e99SJason King  *
137*aa693e99SJason King  * What this means here is that the data structures within
138*aa693e99SJason King  * the union can be shared across various requests and replies.
139*aa693e99SJason King  * For instance, replies to OPEN, CREATE, LCREATE, LOPEN, MKDIR, and
140*aa693e99SJason King  * SYMLINK are all fairly similar (providing a qid and sometimes
141*aa693e99SJason King  * an iounit) and hence can all use the l9p_f_ropen structure.
142*aa693e99SJason King  * Which structures are used for which operations is somewhat
143*aa693e99SJason King  * arbitrary; for programming ease, if an operation shares a
144*aa693e99SJason King  * data structure, it still has its own name: there are union
145*aa693e99SJason King  * members named ropen, rcreate, rlcreate, rlopen, rmkdir, and
146*aa693e99SJason King  * rsymlink, even though all use struct l9p_f_ropen.
147*aa693e99SJason King  *
148*aa693e99SJason King  * The big exception to the above rule is struct l9p_f_io, which
149*aa693e99SJason King  * is used as both request and reply for all of READ, WRITE, and
150*aa693e99SJason King  * READDIR.  Moreover, the READDIR reply must be pre-packed into
151*aa693e99SJason King  * wire format (it is handled like raw data a la READ).
152*aa693e99SJason King  *
153*aa693e99SJason King  * Some request messages (e.g., TREADLINK) fit in a header, having
154*aa693e99SJason King  * just type code, tag, and fid.  These have no separate data
155*aa693e99SJason King  * structure, nor union member name.  Similarly, some reply
156*aa693e99SJason King  * messages (e.g., RCLUNK, RREMOVE, RRENAME) have just the type
157*aa693e99SJason King  * code and tag.
158*aa693e99SJason King  */
159*aa693e99SJason King 
160*aa693e99SJason King /*
161*aa693e99SJason King  * Type code bits in (the first byte of) a qid.
162*aa693e99SJason King  */
163*aa693e99SJason King enum l9p_qid_type {
164*aa693e99SJason King 	L9P_QTDIR = 0x80, /* type bit for directories */
165*aa693e99SJason King 	L9P_QTAPPEND = 0x40, /* type bit for append only files */
166*aa693e99SJason King 	L9P_QTEXCL = 0x20, /* type bit for exclusive use files */
167*aa693e99SJason King 	L9P_QTMOUNT = 0x10, /* type bit for mounted channel */
168*aa693e99SJason King 	L9P_QTAUTH = 0x08, /* type bit for authentication file */
169*aa693e99SJason King 	L9P_QTTMP = 0x04, /* type bit for non-backed-up file */
170*aa693e99SJason King 	L9P_QTSYMLINK = 0x02, /* type bit for symbolic link */
171*aa693e99SJason King 	L9P_QTFILE = 0x00 /* type bits for plain file */
172*aa693e99SJason King };
173*aa693e99SJason King 
174*aa693e99SJason King /*
175*aa693e99SJason King  * Extra permission bits in create and file modes (stat).
176*aa693e99SJason King  */
177*aa693e99SJason King #define L9P_DMDIR 0x80000000
178*aa693e99SJason King enum {
179*aa693e99SJason King 	L9P_DMAPPEND = 0x40000000,
180*aa693e99SJason King 	L9P_DMEXCL = 0x20000000,
181*aa693e99SJason King 	L9P_DMMOUNT = 0x10000000,
182*aa693e99SJason King 	L9P_DMAUTH = 0x08000000,
183*aa693e99SJason King 	L9P_DMTMP = 0x04000000,
184*aa693e99SJason King 	L9P_DMSYMLINK = 0x02000000,
185*aa693e99SJason King 	/* 9P2000.u extensions */
186*aa693e99SJason King 	L9P_DMDEVICE = 0x00800000,
187*aa693e99SJason King 	L9P_DMNAMEDPIPE = 0x00200000,
188*aa693e99SJason King 	L9P_DMSOCKET = 0x00100000,
189*aa693e99SJason King 	L9P_DMSETUID = 0x00080000,
190*aa693e99SJason King 	L9P_DMSETGID = 0x00040000,
191*aa693e99SJason King };
192*aa693e99SJason King 
193*aa693e99SJason King /*
194*aa693e99SJason King  * Open/create mode bits in 9P2000 and 9P2000.u operations
195*aa693e99SJason King  * (not Linux lopen and lcreate flags, which are different).
196*aa693e99SJason King  * Note that the mode field is only one byte wide.
197*aa693e99SJason King  */
198*aa693e99SJason King enum l9p_omode {
199*aa693e99SJason King 	L9P_OREAD = 0,	/* open for read */
200*aa693e99SJason King 	L9P_OWRITE = 1,	/* write */
201*aa693e99SJason King 	L9P_ORDWR = 2,	/* read and write */
202*aa693e99SJason King 	L9P_OEXEC = 3,	/* execute, == read but check execute permission */
203*aa693e99SJason King 	L9P_OACCMODE = 3, /* mask for the above access-mode bits */
204*aa693e99SJason King 	L9P_OTRUNC = 16,	/* or'ed in (except for exec), truncate file first */
205*aa693e99SJason King 	L9P_OCEXEC = 32,	/* or'ed in, close on exec */
206*aa693e99SJason King 	L9P_ORCLOSE = 64,	/* or'ed in, remove on close */
207*aa693e99SJason King 	L9P_ODIRECT = 128,	/* or'ed in, direct access */
208*aa693e99SJason King };
209*aa693e99SJason King 
210*aa693e99SJason King /*
211*aa693e99SJason King  * Flag bits in 9P2000.L operations (Tlopen, Tlcreate).  These are
212*aa693e99SJason King  * basically just the Linux L_* flags.  The bottom 3 bits are the
213*aa693e99SJason King  * same as for l9p_omode, although open-for-exec is not used:
214*aa693e99SJason King  * instead, the client does a Tgetattr and checks the mode for
215*aa693e99SJason King  * execute bits, then just opens for reading.
216*aa693e99SJason King  *
217*aa693e99SJason King  * Each L_O_xxx is just value O_xxx has on Linux in <fcntl.h>;
218*aa693e99SJason King  * not all are necessarily used.  From observation, we do get
219*aa693e99SJason King  * L_O_CREAT and L_O_EXCL when creating with exclusive, and always
220*aa693e99SJason King  * get L_O_LARGEFILE.  We do get L_O_APPEND when opening for
221*aa693e99SJason King  * append.  We also get both L_O_DIRECT and L_O_DIRECTORY set
222*aa693e99SJason King  * when opening directories.
223*aa693e99SJason King  *
224*aa693e99SJason King  * We probably never get L_O_NOCTTY which makes no sense, and
225*aa693e99SJason King  * some of the other options may need to be handled on the client.
226*aa693e99SJason King  */
227*aa693e99SJason King enum l9p_l_o_flags {
228*aa693e99SJason King 	L9P_L_O_CREAT =		000000100U,
229*aa693e99SJason King 	L9P_L_O_EXCL =		000000200U,
230*aa693e99SJason King 	L9P_L_O_NOCTTY =	000000400U,
231*aa693e99SJason King 	L9P_L_O_TRUNC =		000001000U,
232*aa693e99SJason King 	L9P_L_O_APPEND =	000002000U,
233*aa693e99SJason King 	L9P_L_O_NONBLOCK =	000004000U,
234*aa693e99SJason King 	L9P_L_O_DSYNC =		000010000U,
235*aa693e99SJason King 	L9P_L_O_FASYNC =	000020000U,
236*aa693e99SJason King 	L9P_L_O_DIRECT =	000040000U,
237*aa693e99SJason King 	L9P_L_O_LARGEFILE =	000100000U,
238*aa693e99SJason King 	L9P_L_O_DIRECTORY =	000200000U,
239*aa693e99SJason King 	L9P_L_O_NOFOLLOW =	000400000U,
240*aa693e99SJason King 	L9P_L_O_NOATIME =	001000000U,
241*aa693e99SJason King 	L9P_L_O_CLOEXEC =	002000000U,
242*aa693e99SJason King 	L9P_L_O_SYNC =		004000000U,
243*aa693e99SJason King 	L9P_L_O_PATH =		010000000U,
244*aa693e99SJason King 	L9P_L_O_TMPFILE =	020000000U,
245*aa693e99SJason King };
246*aa693e99SJason King 
247*aa693e99SJason King struct l9p_hdr {
248*aa693e99SJason King 	uint8_t type;
249*aa693e99SJason King 	uint16_t tag;
250*aa693e99SJason King 	uint32_t fid;
251*aa693e99SJason King };
252*aa693e99SJason King 
253*aa693e99SJason King struct l9p_qid {
254*aa693e99SJason King 	uint8_t  type;
255*aa693e99SJason King 	uint32_t version;
256*aa693e99SJason King 	uint64_t path;
257*aa693e99SJason King };
258*aa693e99SJason King 
259*aa693e99SJason King struct l9p_stat {
260*aa693e99SJason King 	uint16_t type;
261*aa693e99SJason King 	uint32_t dev;
262*aa693e99SJason King 	struct l9p_qid qid;
263*aa693e99SJason King 	uint32_t mode;
264*aa693e99SJason King 	uint32_t atime;
265*aa693e99SJason King 	uint32_t mtime;
266*aa693e99SJason King 	uint64_t length;
267*aa693e99SJason King 	char *name;
268*aa693e99SJason King 	char *uid;
269*aa693e99SJason King 	char *gid;
270*aa693e99SJason King 	char *muid;
271*aa693e99SJason King 	char *extension;
272*aa693e99SJason King 	uint32_t n_uid;
273*aa693e99SJason King 	uint32_t n_gid;
274*aa693e99SJason King 	uint32_t n_muid;
275*aa693e99SJason King };
276*aa693e99SJason King 
277*aa693e99SJason King #define	L9P_FSTYPE	 0x01021997
278*aa693e99SJason King 
279*aa693e99SJason King struct l9p_statfs {
280*aa693e99SJason King 	uint32_t type;		/* file system type */
281*aa693e99SJason King 	uint32_t bsize;		/* block size for I/O */
282*aa693e99SJason King 	uint64_t blocks;	/* file system size (bsize-byte blocks) */
283*aa693e99SJason King 	uint64_t bfree;		/* free blocks in fs */
284*aa693e99SJason King 	uint64_t bavail;	/* free blocks avail to non-superuser*/
285*aa693e99SJason King 	uint64_t files;		/* file nodes in file system (# inodes) */
286*aa693e99SJason King 	uint64_t ffree;		/* free file nodes in fs */
287*aa693e99SJason King 	uint64_t fsid;		/* file system identifier */
288*aa693e99SJason King 	uint32_t namelen;	/* maximum length of filenames */
289*aa693e99SJason King };
290*aa693e99SJason King 
291*aa693e99SJason King struct l9p_f_version {
292*aa693e99SJason King 	struct l9p_hdr hdr;
293*aa693e99SJason King 	uint32_t msize;
294*aa693e99SJason King 	char *version;
295*aa693e99SJason King };
296*aa693e99SJason King 
297*aa693e99SJason King struct l9p_f_tflush {
298*aa693e99SJason King 	struct l9p_hdr hdr;
299*aa693e99SJason King 	uint16_t oldtag;
300*aa693e99SJason King };
301*aa693e99SJason King 
302*aa693e99SJason King struct l9p_f_error {
303*aa693e99SJason King 	struct l9p_hdr hdr;
304*aa693e99SJason King 	char *ename;
305*aa693e99SJason King 	uint32_t errnum;
306*aa693e99SJason King };
307*aa693e99SJason King 
308*aa693e99SJason King struct l9p_f_ropen {
309*aa693e99SJason King 	struct l9p_hdr hdr;
310*aa693e99SJason King 	struct l9p_qid qid;
311*aa693e99SJason King 	uint32_t iounit;
312*aa693e99SJason King };
313*aa693e99SJason King 
314*aa693e99SJason King struct l9p_f_rauth {
315*aa693e99SJason King 	struct l9p_hdr hdr;
316*aa693e99SJason King 	struct l9p_qid aqid;
317*aa693e99SJason King };
318*aa693e99SJason King 
319*aa693e99SJason King struct l9p_f_attach {
320*aa693e99SJason King 	struct l9p_hdr hdr;
321*aa693e99SJason King 	uint32_t afid;
322*aa693e99SJason King 	char *uname;
323*aa693e99SJason King 	char *aname;
324*aa693e99SJason King 	uint32_t n_uname;
325*aa693e99SJason King };
326*aa693e99SJason King #define	L9P_NOFID ((uint32_t)-1)	/* in Tattach, no auth fid */
327*aa693e99SJason King #define	L9P_NONUNAME ((uint32_t)-1)	/* in Tattach, no n_uname */
328*aa693e99SJason King 
329*aa693e99SJason King struct l9p_f_tcreate {
330*aa693e99SJason King 	struct l9p_hdr hdr;
331*aa693e99SJason King 	uint32_t perm;
332*aa693e99SJason King 	char *name;
333*aa693e99SJason King 	uint8_t mode; /* +Topen */
334*aa693e99SJason King 	char *extension;
335*aa693e99SJason King };
336*aa693e99SJason King 
337*aa693e99SJason King struct l9p_f_twalk {
338*aa693e99SJason King 	struct l9p_hdr hdr;
339*aa693e99SJason King 	uint32_t newfid;
340*aa693e99SJason King 	uint16_t nwname;
341*aa693e99SJason King 	char *wname[L9P_MAX_WELEM];
342*aa693e99SJason King };
343*aa693e99SJason King 
344*aa693e99SJason King struct l9p_f_rwalk {
345*aa693e99SJason King 	struct l9p_hdr hdr;
346*aa693e99SJason King 	uint16_t nwqid;
347*aa693e99SJason King 	struct l9p_qid wqid[L9P_MAX_WELEM];
348*aa693e99SJason King };
349*aa693e99SJason King 
350*aa693e99SJason King struct l9p_f_io {
351*aa693e99SJason King 	struct l9p_hdr hdr;
352*aa693e99SJason King 	uint64_t offset; /* Tread, Twrite, Treaddir */
353*aa693e99SJason King 	uint32_t count; /* Tread, Twrite, Rread, Treaddir, Rreaddir */
354*aa693e99SJason King };
355*aa693e99SJason King 
356*aa693e99SJason King struct l9p_f_rstat {
357*aa693e99SJason King 	struct l9p_hdr hdr;
358*aa693e99SJason King 	struct l9p_stat stat;
359*aa693e99SJason King };
360*aa693e99SJason King 
361*aa693e99SJason King struct l9p_f_twstat {
362*aa693e99SJason King 	struct l9p_hdr hdr;
363*aa693e99SJason King 	struct l9p_stat stat;
364*aa693e99SJason King };
365*aa693e99SJason King 
366*aa693e99SJason King struct l9p_f_rstatfs {
367*aa693e99SJason King 	struct l9p_hdr hdr;
368*aa693e99SJason King 	struct l9p_statfs statfs;
369*aa693e99SJason King };
370*aa693e99SJason King 
371*aa693e99SJason King /* Used for Tlcreate, Tlopen, Tmkdir, Tunlinkat. */
372*aa693e99SJason King struct l9p_f_tlcreate {
373*aa693e99SJason King 	struct l9p_hdr hdr;
374*aa693e99SJason King 	char *name;		/* Tlcreate, Tmkdir, Tunlinkat */
375*aa693e99SJason King 	uint32_t flags;		/* Tlcreate, Tlopen, Tmkdir, Tunlinkat */
376*aa693e99SJason King 	uint32_t mode;		/* Tlcreate, Tmkdir */
377*aa693e99SJason King 	uint32_t gid;		/* Tlcreate, Tmkdir */
378*aa693e99SJason King };
379*aa693e99SJason King 
380*aa693e99SJason King struct l9p_f_tsymlink {
381*aa693e99SJason King 	struct l9p_hdr hdr;
382*aa693e99SJason King 	char *name;
383*aa693e99SJason King 	char *symtgt;
384*aa693e99SJason King 	uint32_t gid;
385*aa693e99SJason King };
386*aa693e99SJason King 
387*aa693e99SJason King struct l9p_f_tmknod {
388*aa693e99SJason King 	struct l9p_hdr hdr;
389*aa693e99SJason King 	char *name;
390*aa693e99SJason King 	uint32_t mode;
391*aa693e99SJason King 	uint32_t major;
392*aa693e99SJason King 	uint32_t minor;
393*aa693e99SJason King 	uint32_t gid;
394*aa693e99SJason King };
395*aa693e99SJason King 
396*aa693e99SJason King struct l9p_f_trename {
397*aa693e99SJason King 	struct l9p_hdr hdr;
398*aa693e99SJason King 	uint32_t dfid;
399*aa693e99SJason King 	char *name;
400*aa693e99SJason King };
401*aa693e99SJason King 
402*aa693e99SJason King struct l9p_f_rreadlink {
403*aa693e99SJason King 	struct l9p_hdr hdr;
404*aa693e99SJason King 	char *target;
405*aa693e99SJason King };
406*aa693e99SJason King 
407*aa693e99SJason King struct l9p_f_tgetattr {
408*aa693e99SJason King 	struct l9p_hdr hdr;
409*aa693e99SJason King 	uint64_t request_mask;
410*aa693e99SJason King };
411*aa693e99SJason King 
412*aa693e99SJason King struct l9p_f_rgetattr {
413*aa693e99SJason King 	struct l9p_hdr hdr;
414*aa693e99SJason King 	uint64_t valid;
415*aa693e99SJason King 	struct l9p_qid qid;
416*aa693e99SJason King 	uint32_t mode;
417*aa693e99SJason King 	uint32_t uid;
418*aa693e99SJason King 	uint32_t gid;
419*aa693e99SJason King 	uint64_t nlink;
420*aa693e99SJason King 	uint64_t rdev;
421*aa693e99SJason King 	uint64_t size;
422*aa693e99SJason King 	uint64_t blksize;
423*aa693e99SJason King 	uint64_t blocks;
424*aa693e99SJason King 	uint64_t atime_sec;
425*aa693e99SJason King 	uint64_t atime_nsec;
426*aa693e99SJason King 	uint64_t mtime_sec;
427*aa693e99SJason King 	uint64_t mtime_nsec;
428*aa693e99SJason King 	uint64_t ctime_sec;
429*aa693e99SJason King 	uint64_t ctime_nsec;
430*aa693e99SJason King 	uint64_t btime_sec;
431*aa693e99SJason King 	uint64_t btime_nsec;
432*aa693e99SJason King 	uint64_t gen;
433*aa693e99SJason King 	uint64_t data_version;
434*aa693e99SJason King };
435*aa693e99SJason King 
436*aa693e99SJason King /* Fields in req->request_mask and reply->valid for Tgetattr, Rgetattr. */
437*aa693e99SJason King enum l9pl_getattr_flags {
438*aa693e99SJason King 	L9PL_GETATTR_MODE = 0x00000001,
439*aa693e99SJason King 	L9PL_GETATTR_NLINK = 0x00000002,
440*aa693e99SJason King 	L9PL_GETATTR_UID = 0x00000004,
441*aa693e99SJason King 	L9PL_GETATTR_GID = 0x00000008,
442*aa693e99SJason King 	L9PL_GETATTR_RDEV = 0x00000010,
443*aa693e99SJason King 	L9PL_GETATTR_ATIME = 0x00000020,
444*aa693e99SJason King 	L9PL_GETATTR_MTIME = 0x00000040,
445*aa693e99SJason King 	L9PL_GETATTR_CTIME = 0x00000080,
446*aa693e99SJason King 	L9PL_GETATTR_INO = 0x00000100,
447*aa693e99SJason King 	L9PL_GETATTR_SIZE = 0x00000200,
448*aa693e99SJason King 	L9PL_GETATTR_BLOCKS = 0x00000400,
449*aa693e99SJason King 	/* everything up to and including BLOCKS is BASIC */
450*aa693e99SJason King 	L9PL_GETATTR_BASIC = L9PL_GETATTR_MODE |
451*aa693e99SJason King 		L9PL_GETATTR_NLINK |
452*aa693e99SJason King 		L9PL_GETATTR_UID |
453*aa693e99SJason King 		L9PL_GETATTR_GID |
454*aa693e99SJason King 		L9PL_GETATTR_RDEV |
455*aa693e99SJason King 		L9PL_GETATTR_ATIME |
456*aa693e99SJason King 		L9PL_GETATTR_MTIME |
457*aa693e99SJason King 		L9PL_GETATTR_CTIME |
458*aa693e99SJason King 		L9PL_GETATTR_INO |
459*aa693e99SJason King 		L9PL_GETATTR_SIZE |
460*aa693e99SJason King 		L9PL_GETATTR_BLOCKS,
461*aa693e99SJason King 	L9PL_GETATTR_BTIME = 0x00000800,
462*aa693e99SJason King 	L9PL_GETATTR_GEN = 0x00001000,
463*aa693e99SJason King 	L9PL_GETATTR_DATA_VERSION = 0x00002000,
464*aa693e99SJason King 	/* BASIC + birthtime + gen + data-version = ALL */
465*aa693e99SJason King 	L9PL_GETATTR_ALL = L9PL_GETATTR_BASIC |
466*aa693e99SJason King 		L9PL_GETATTR_BTIME |
467*aa693e99SJason King 		L9PL_GETATTR_GEN |
468*aa693e99SJason King 		L9PL_GETATTR_DATA_VERSION,
469*aa693e99SJason King };
470*aa693e99SJason King 
471*aa693e99SJason King struct l9p_f_tsetattr {
472*aa693e99SJason King 	struct l9p_hdr hdr;
473*aa693e99SJason King 	uint32_t valid;
474*aa693e99SJason King 	uint32_t mode;
475*aa693e99SJason King 	uint32_t uid;
476*aa693e99SJason King 	uint32_t gid;
477*aa693e99SJason King 	uint64_t size;
478*aa693e99SJason King 	uint64_t atime_sec;	/* if valid & L9PL_SETATTR_ATIME_SET */
479*aa693e99SJason King 	uint64_t atime_nsec;	/* (else use on-server time) */
480*aa693e99SJason King 	uint64_t mtime_sec;	/* if valid & L9PL_SETATTR_MTIME_SET */
481*aa693e99SJason King 	uint64_t mtime_nsec;	/* (else use on-server time) */
482*aa693e99SJason King };
483*aa693e99SJason King 
484*aa693e99SJason King /* Fields in req->valid for Tsetattr. */
485*aa693e99SJason King enum l9pl_setattr_flags {
486*aa693e99SJason King 	L9PL_SETATTR_MODE = 0x00000001,
487*aa693e99SJason King 	L9PL_SETATTR_UID = 0x00000002,
488*aa693e99SJason King 	L9PL_SETATTR_GID = 0x00000004,
489*aa693e99SJason King 	L9PL_SETATTR_SIZE = 0x00000008,
490*aa693e99SJason King 	L9PL_SETATTR_ATIME = 0x00000010,
491*aa693e99SJason King 	L9PL_SETATTR_MTIME = 0x00000020,
492*aa693e99SJason King 	L9PL_SETATTR_CTIME = 0x00000040,
493*aa693e99SJason King 	L9PL_SETATTR_ATIME_SET = 0x00000080,
494*aa693e99SJason King 	L9PL_SETATTR_MTIME_SET = 0x00000100,
495*aa693e99SJason King };
496*aa693e99SJason King 
497*aa693e99SJason King struct l9p_f_txattrwalk {
498*aa693e99SJason King 	struct l9p_hdr hdr;
499*aa693e99SJason King 	uint32_t newfid;
500*aa693e99SJason King 	char *name;
501*aa693e99SJason King };
502*aa693e99SJason King 
503*aa693e99SJason King struct l9p_f_rxattrwalk {
504*aa693e99SJason King 	struct l9p_hdr hdr;
505*aa693e99SJason King 	uint64_t size;
506*aa693e99SJason King };
507*aa693e99SJason King 
508*aa693e99SJason King struct l9p_f_txattrcreate {
509*aa693e99SJason King 	struct l9p_hdr hdr;
510*aa693e99SJason King 	char *name;
511*aa693e99SJason King 	uint64_t attr_size;
512*aa693e99SJason King 	uint32_t flags;
513*aa693e99SJason King };
514*aa693e99SJason King 
515*aa693e99SJason King struct l9p_f_tlock {
516*aa693e99SJason King 	struct l9p_hdr hdr;
517*aa693e99SJason King 	uint8_t type;		/* from l9pl_lock_type */
518*aa693e99SJason King 	uint32_t flags;		/* from l9pl_lock_flags */
519*aa693e99SJason King 	uint64_t start;
520*aa693e99SJason King 	uint64_t length;
521*aa693e99SJason King 	uint32_t proc_id;
522*aa693e99SJason King 	char *client_id;
523*aa693e99SJason King };
524*aa693e99SJason King 
525*aa693e99SJason King enum l9pl_lock_type {
526*aa693e99SJason King 	L9PL_LOCK_TYPE_RDLOCK =	0,
527*aa693e99SJason King 	L9PL_LOCK_TYPE_WRLOCK =	1,
528*aa693e99SJason King 	L9PL_LOCK_TYPE_UNLOCK =	2,
529*aa693e99SJason King };
530*aa693e99SJason King 
531*aa693e99SJason King enum l9pl_lock_flags {
532*aa693e99SJason King 	L9PL_LOCK_TYPE_BLOCK = 1,
533*aa693e99SJason King 	L9PL_LOCK_TYPE_RECLAIM = 2,
534*aa693e99SJason King };
535*aa693e99SJason King 
536*aa693e99SJason King struct l9p_f_rlock {
537*aa693e99SJason King 	struct l9p_hdr hdr;
538*aa693e99SJason King 	uint8_t status;		/* from l9pl_lock_status */
539*aa693e99SJason King };
540*aa693e99SJason King 
541*aa693e99SJason King enum l9pl_lock_status {
542*aa693e99SJason King 	L9PL_LOCK_SUCCESS = 0,
543*aa693e99SJason King 	L9PL_LOCK_BLOCKED = 1,
544*aa693e99SJason King 	L9PL_LOCK_ERROR = 2,
545*aa693e99SJason King 	L9PL_LOCK_GRACE = 3,
546*aa693e99SJason King };
547*aa693e99SJason King 
548*aa693e99SJason King struct l9p_f_getlock {
549*aa693e99SJason King 	struct l9p_hdr hdr;
550*aa693e99SJason King 	uint8_t type;		/* from l9pl_lock_type */
551*aa693e99SJason King 	uint64_t start;
552*aa693e99SJason King 	uint64_t length;
553*aa693e99SJason King 	uint32_t proc_id;
554*aa693e99SJason King 	char *client_id;
555*aa693e99SJason King };
556*aa693e99SJason King 
557*aa693e99SJason King struct l9p_f_tlink {
558*aa693e99SJason King 	struct l9p_hdr hdr;
559*aa693e99SJason King 	uint32_t dfid;
560*aa693e99SJason King 	char *name;
561*aa693e99SJason King };
562*aa693e99SJason King 
563*aa693e99SJason King struct l9p_f_trenameat {
564*aa693e99SJason King 	struct l9p_hdr hdr;
565*aa693e99SJason King 	char *oldname;
566*aa693e99SJason King 	uint32_t newdirfid;
567*aa693e99SJason King 	char *newname;
568*aa693e99SJason King };
569*aa693e99SJason King 
570*aa693e99SJason King /*
571*aa693e99SJason King  * Flags in Tunlinkat (which re-uses f_tlcreate data structure but
572*aa693e99SJason King  * with different meaning).
573*aa693e99SJason King  */
574*aa693e99SJason King enum l9p_l_unlinkat_flags {
575*aa693e99SJason King 	/* not sure if any other AT_* flags are passed through */
576*aa693e99SJason King 	L9PL_AT_REMOVEDIR =	0x0200,
577*aa693e99SJason King };
578*aa693e99SJason King 
579*aa693e99SJason King union l9p_fcall {
580*aa693e99SJason King 	struct l9p_hdr hdr;
581*aa693e99SJason King 	struct l9p_f_version version;
582*aa693e99SJason King 	struct l9p_f_tflush tflush;
583*aa693e99SJason King 	struct l9p_f_ropen ropen;
584*aa693e99SJason King 	struct l9p_f_ropen rcreate;
585*aa693e99SJason King 	struct l9p_f_ropen rattach;
586*aa693e99SJason King 	struct l9p_f_error error;
587*aa693e99SJason King 	struct l9p_f_rauth rauth;
588*aa693e99SJason King 	struct l9p_f_attach tattach;
589*aa693e99SJason King 	struct l9p_f_attach tauth;
590*aa693e99SJason King 	struct l9p_f_tcreate tcreate;
591*aa693e99SJason King 	struct l9p_f_tcreate topen;
592*aa693e99SJason King 	struct l9p_f_twalk twalk;
593*aa693e99SJason King 	struct l9p_f_rwalk rwalk;
594*aa693e99SJason King 	struct l9p_f_twstat twstat;
595*aa693e99SJason King 	struct l9p_f_rstat rstat;
596*aa693e99SJason King 	struct l9p_f_rstatfs rstatfs;
597*aa693e99SJason King 	struct l9p_f_tlcreate tlopen;
598*aa693e99SJason King 	struct l9p_f_ropen rlopen;
599*aa693e99SJason King 	struct l9p_f_tlcreate tlcreate;
600*aa693e99SJason King 	struct l9p_f_ropen rlcreate;
601*aa693e99SJason King 	struct l9p_f_tsymlink tsymlink;
602*aa693e99SJason King 	struct l9p_f_ropen rsymlink;
603*aa693e99SJason King 	struct l9p_f_tmknod tmknod;
604*aa693e99SJason King 	struct l9p_f_ropen rmknod;
605*aa693e99SJason King 	struct l9p_f_trename trename;
606*aa693e99SJason King 	struct l9p_f_rreadlink rreadlink;
607*aa693e99SJason King 	struct l9p_f_tgetattr tgetattr;
608*aa693e99SJason King 	struct l9p_f_rgetattr rgetattr;
609*aa693e99SJason King 	struct l9p_f_tsetattr tsetattr;
610*aa693e99SJason King 	struct l9p_f_txattrwalk txattrwalk;
611*aa693e99SJason King 	struct l9p_f_rxattrwalk rxattrwalk;
612*aa693e99SJason King 	struct l9p_f_txattrcreate txattrcreate;
613*aa693e99SJason King 	struct l9p_f_tlock tlock;
614*aa693e99SJason King 	struct l9p_f_rlock rlock;
615*aa693e99SJason King 	struct l9p_f_getlock getlock;
616*aa693e99SJason King 	struct l9p_f_tlink tlink;
617*aa693e99SJason King 	struct l9p_f_tlcreate tmkdir;
618*aa693e99SJason King 	struct l9p_f_ropen rmkdir;
619*aa693e99SJason King 	struct l9p_f_trenameat trenameat;
620*aa693e99SJason King 	struct l9p_f_tlcreate tunlinkat;
621*aa693e99SJason King 	struct l9p_f_io io;
622*aa693e99SJason King };
623*aa693e99SJason King 
624*aa693e99SJason King #endif  /* LIB9P_FCALL_H */
625