xref: /kvmtool/include/linux/9p.h (revision fe8e6c1c181485bcf51e480ac2be8e69d9dce0fe)
1*fe8e6c1cSAndre Przywara /*
2*fe8e6c1cSAndre Przywara  * include/net/9p/9p.h
3*fe8e6c1cSAndre Przywara  *
4*fe8e6c1cSAndre Przywara  * 9P protocol definitions.
5*fe8e6c1cSAndre Przywara  *
6*fe8e6c1cSAndre Przywara  *  Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net>
7*fe8e6c1cSAndre Przywara  *  Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
8*fe8e6c1cSAndre Przywara  *  Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
9*fe8e6c1cSAndre Przywara  *
10*fe8e6c1cSAndre Przywara  *  This program is free software; you can redistribute it and/or modify
11*fe8e6c1cSAndre Przywara  *  it under the terms of the GNU General Public License version 2
12*fe8e6c1cSAndre Przywara  *  as published by the Free Software Foundation.
13*fe8e6c1cSAndre Przywara  *
14*fe8e6c1cSAndre Przywara  *  This program is distributed in the hope that it will be useful,
15*fe8e6c1cSAndre Przywara  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16*fe8e6c1cSAndre Przywara  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17*fe8e6c1cSAndre Przywara  *  GNU General Public License for more details.
18*fe8e6c1cSAndre Przywara  *
19*fe8e6c1cSAndre Przywara  *  You should have received a copy of the GNU General Public License
20*fe8e6c1cSAndre Przywara  *  along with this program; if not, write to:
21*fe8e6c1cSAndre Przywara  *  Free Software Foundation
22*fe8e6c1cSAndre Przywara  *  51 Franklin Street, Fifth Floor
23*fe8e6c1cSAndre Przywara  *  Boston, MA  02111-1301  USA
24*fe8e6c1cSAndre Przywara  *
25*fe8e6c1cSAndre Przywara  */
26*fe8e6c1cSAndre Przywara 
27*fe8e6c1cSAndre Przywara #ifndef NET_9P_H
28*fe8e6c1cSAndre Przywara #define NET_9P_H
29*fe8e6c1cSAndre Przywara 
30*fe8e6c1cSAndre Przywara /**
31*fe8e6c1cSAndre Przywara  * enum p9_debug_flags - bits for mount time debug parameter
32*fe8e6c1cSAndre Przywara  * @P9_DEBUG_ERROR: more verbose error messages including original error string
33*fe8e6c1cSAndre Przywara  * @P9_DEBUG_9P: 9P protocol tracing
34*fe8e6c1cSAndre Przywara  * @P9_DEBUG_VFS: VFS API tracing
35*fe8e6c1cSAndre Przywara  * @P9_DEBUG_CONV: protocol conversion tracing
36*fe8e6c1cSAndre Przywara  * @P9_DEBUG_MUX: trace management of concurrent transactions
37*fe8e6c1cSAndre Przywara  * @P9_DEBUG_TRANS: transport tracing
38*fe8e6c1cSAndre Przywara  * @P9_DEBUG_SLABS: memory management tracing
39*fe8e6c1cSAndre Przywara  * @P9_DEBUG_FCALL: verbose dump of protocol messages
40*fe8e6c1cSAndre Przywara  * @P9_DEBUG_FID: fid allocation/deallocation tracking
41*fe8e6c1cSAndre Przywara  * @P9_DEBUG_PKT: packet marshalling/unmarshalling
42*fe8e6c1cSAndre Przywara  * @P9_DEBUG_FSC: FS-cache tracing
43*fe8e6c1cSAndre Przywara  * @P9_DEBUG_VPKT: Verbose packet debugging (full packet dump)
44*fe8e6c1cSAndre Przywara  *
45*fe8e6c1cSAndre Przywara  * These flags are passed at mount time to turn on various levels of
46*fe8e6c1cSAndre Przywara  * verbosity and tracing which will be output to the system logs.
47*fe8e6c1cSAndre Przywara  */
48*fe8e6c1cSAndre Przywara 
49*fe8e6c1cSAndre Przywara enum p9_debug_flags {
50*fe8e6c1cSAndre Przywara 	P9_DEBUG_ERROR = 	(1<<0),
51*fe8e6c1cSAndre Przywara 	P9_DEBUG_9P = 		(1<<2),
52*fe8e6c1cSAndre Przywara 	P9_DEBUG_VFS =		(1<<3),
53*fe8e6c1cSAndre Przywara 	P9_DEBUG_CONV =		(1<<4),
54*fe8e6c1cSAndre Przywara 	P9_DEBUG_MUX =		(1<<5),
55*fe8e6c1cSAndre Przywara 	P9_DEBUG_TRANS =	(1<<6),
56*fe8e6c1cSAndre Przywara 	P9_DEBUG_SLABS =      	(1<<7),
57*fe8e6c1cSAndre Przywara 	P9_DEBUG_FCALL =	(1<<8),
58*fe8e6c1cSAndre Przywara 	P9_DEBUG_FID =		(1<<9),
59*fe8e6c1cSAndre Przywara 	P9_DEBUG_PKT =		(1<<10),
60*fe8e6c1cSAndre Przywara 	P9_DEBUG_FSC =		(1<<11),
61*fe8e6c1cSAndre Przywara 	P9_DEBUG_VPKT =		(1<<12),
62*fe8e6c1cSAndre Przywara };
63*fe8e6c1cSAndre Przywara 
64*fe8e6c1cSAndre Przywara #ifdef CONFIG_NET_9P_DEBUG
65*fe8e6c1cSAndre Przywara extern unsigned int p9_debug_level;
66*fe8e6c1cSAndre Przywara __printf(3, 4)
67*fe8e6c1cSAndre Przywara void _p9_debug(enum p9_debug_flags level, const char *func,
68*fe8e6c1cSAndre Przywara 	       const char *fmt, ...);
69*fe8e6c1cSAndre Przywara #define p9_debug(level, fmt, ...)			\
70*fe8e6c1cSAndre Przywara 	_p9_debug(level, __func__, fmt, ##__VA_ARGS__)
71*fe8e6c1cSAndre Przywara #else
72*fe8e6c1cSAndre Przywara #define p9_debug(level, fmt, ...)			\
73*fe8e6c1cSAndre Przywara 	no_printk(fmt, ##__VA_ARGS__)
74*fe8e6c1cSAndre Przywara #endif
75*fe8e6c1cSAndre Przywara 
76*fe8e6c1cSAndre Przywara /**
77*fe8e6c1cSAndre Przywara  * enum p9_msg_t - 9P message types
78*fe8e6c1cSAndre Przywara  * @P9_TLERROR: not used
79*fe8e6c1cSAndre Przywara  * @P9_RLERROR: response for any failed request for 9P2000.L
80*fe8e6c1cSAndre Przywara  * @P9_TSTATFS: file system status request
81*fe8e6c1cSAndre Przywara  * @P9_RSTATFS: file system status response
82*fe8e6c1cSAndre Przywara  * @P9_TSYMLINK: make symlink request
83*fe8e6c1cSAndre Przywara  * @P9_RSYMLINK: make symlink response
84*fe8e6c1cSAndre Przywara  * @P9_TMKNOD: create a special file object request
85*fe8e6c1cSAndre Przywara  * @P9_RMKNOD: create a special file object response
86*fe8e6c1cSAndre Przywara  * @P9_TLCREATE: prepare a handle for I/O on an new file for 9P2000.L
87*fe8e6c1cSAndre Przywara  * @P9_RLCREATE: response with file access information for 9P2000.L
88*fe8e6c1cSAndre Przywara  * @P9_TRENAME: rename request
89*fe8e6c1cSAndre Przywara  * @P9_RRENAME: rename response
90*fe8e6c1cSAndre Przywara  * @P9_TMKDIR: create a directory request
91*fe8e6c1cSAndre Przywara  * @P9_RMKDIR: create a directory response
92*fe8e6c1cSAndre Przywara  * @P9_TVERSION: version handshake request
93*fe8e6c1cSAndre Przywara  * @P9_RVERSION: version handshake response
94*fe8e6c1cSAndre Przywara  * @P9_TAUTH: request to establish authentication channel
95*fe8e6c1cSAndre Przywara  * @P9_RAUTH: response with authentication information
96*fe8e6c1cSAndre Przywara  * @P9_TATTACH: establish user access to file service
97*fe8e6c1cSAndre Przywara  * @P9_RATTACH: response with top level handle to file hierarchy
98*fe8e6c1cSAndre Przywara  * @P9_TERROR: not used
99*fe8e6c1cSAndre Przywara  * @P9_RERROR: response for any failed request
100*fe8e6c1cSAndre Przywara  * @P9_TFLUSH: request to abort a previous request
101*fe8e6c1cSAndre Przywara  * @P9_RFLUSH: response when previous request has been cancelled
102*fe8e6c1cSAndre Przywara  * @P9_TWALK: descend a directory hierarchy
103*fe8e6c1cSAndre Przywara  * @P9_RWALK: response with new handle for position within hierarchy
104*fe8e6c1cSAndre Przywara  * @P9_TOPEN: prepare a handle for I/O on an existing file
105*fe8e6c1cSAndre Przywara  * @P9_ROPEN: response with file access information
106*fe8e6c1cSAndre Przywara  * @P9_TCREATE: prepare a handle for I/O on a new file
107*fe8e6c1cSAndre Przywara  * @P9_RCREATE: response with file access information
108*fe8e6c1cSAndre Przywara  * @P9_TREAD: request to transfer data from a file or directory
109*fe8e6c1cSAndre Przywara  * @P9_RREAD: response with data requested
110*fe8e6c1cSAndre Przywara  * @P9_TWRITE: reuqest to transfer data to a file
111*fe8e6c1cSAndre Przywara  * @P9_RWRITE: response with out much data was transferred to file
112*fe8e6c1cSAndre Przywara  * @P9_TCLUNK: forget about a handle to an entity within the file system
113*fe8e6c1cSAndre Przywara  * @P9_RCLUNK: response when server has forgotten about the handle
114*fe8e6c1cSAndre Przywara  * @P9_TREMOVE: request to remove an entity from the hierarchy
115*fe8e6c1cSAndre Przywara  * @P9_RREMOVE: response when server has removed the entity
116*fe8e6c1cSAndre Przywara  * @P9_TSTAT: request file entity attributes
117*fe8e6c1cSAndre Przywara  * @P9_RSTAT: response with file entity attributes
118*fe8e6c1cSAndre Przywara  * @P9_TWSTAT: request to update file entity attributes
119*fe8e6c1cSAndre Przywara  * @P9_RWSTAT: response when file entity attributes are updated
120*fe8e6c1cSAndre Przywara  *
121*fe8e6c1cSAndre Przywara  * There are 14 basic operations in 9P2000, paired as
122*fe8e6c1cSAndre Przywara  * requests and responses.  The one special case is ERROR
123*fe8e6c1cSAndre Przywara  * as there is no @P9_TERROR request for clients to transmit to
124*fe8e6c1cSAndre Przywara  * the server, but the server may respond to any other request
125*fe8e6c1cSAndre Przywara  * with an @P9_RERROR.
126*fe8e6c1cSAndre Przywara  *
127*fe8e6c1cSAndre Przywara  * See Also: http://plan9.bell-labs.com/sys/man/5/INDEX.html
128*fe8e6c1cSAndre Przywara  */
129*fe8e6c1cSAndre Przywara 
130*fe8e6c1cSAndre Przywara enum p9_msg_t {
131*fe8e6c1cSAndre Przywara 	P9_TLERROR = 6,
132*fe8e6c1cSAndre Przywara 	P9_RLERROR,
133*fe8e6c1cSAndre Przywara 	P9_TSTATFS = 8,
134*fe8e6c1cSAndre Przywara 	P9_RSTATFS,
135*fe8e6c1cSAndre Przywara 	P9_TLOPEN = 12,
136*fe8e6c1cSAndre Przywara 	P9_RLOPEN,
137*fe8e6c1cSAndre Przywara 	P9_TLCREATE = 14,
138*fe8e6c1cSAndre Przywara 	P9_RLCREATE,
139*fe8e6c1cSAndre Przywara 	P9_TSYMLINK = 16,
140*fe8e6c1cSAndre Przywara 	P9_RSYMLINK,
141*fe8e6c1cSAndre Przywara 	P9_TMKNOD = 18,
142*fe8e6c1cSAndre Przywara 	P9_RMKNOD,
143*fe8e6c1cSAndre Przywara 	P9_TRENAME = 20,
144*fe8e6c1cSAndre Przywara 	P9_RRENAME,
145*fe8e6c1cSAndre Przywara 	P9_TREADLINK = 22,
146*fe8e6c1cSAndre Przywara 	P9_RREADLINK,
147*fe8e6c1cSAndre Przywara 	P9_TGETATTR = 24,
148*fe8e6c1cSAndre Przywara 	P9_RGETATTR,
149*fe8e6c1cSAndre Przywara 	P9_TSETATTR = 26,
150*fe8e6c1cSAndre Przywara 	P9_RSETATTR,
151*fe8e6c1cSAndre Przywara 	P9_TXATTRWALK = 30,
152*fe8e6c1cSAndre Przywara 	P9_RXATTRWALK,
153*fe8e6c1cSAndre Przywara 	P9_TXATTRCREATE = 32,
154*fe8e6c1cSAndre Przywara 	P9_RXATTRCREATE,
155*fe8e6c1cSAndre Przywara 	P9_TREADDIR = 40,
156*fe8e6c1cSAndre Przywara 	P9_RREADDIR,
157*fe8e6c1cSAndre Przywara 	P9_TFSYNC = 50,
158*fe8e6c1cSAndre Przywara 	P9_RFSYNC,
159*fe8e6c1cSAndre Przywara 	P9_TLOCK = 52,
160*fe8e6c1cSAndre Przywara 	P9_RLOCK,
161*fe8e6c1cSAndre Przywara 	P9_TGETLOCK = 54,
162*fe8e6c1cSAndre Przywara 	P9_RGETLOCK,
163*fe8e6c1cSAndre Przywara 	P9_TLINK = 70,
164*fe8e6c1cSAndre Przywara 	P9_RLINK,
165*fe8e6c1cSAndre Przywara 	P9_TMKDIR = 72,
166*fe8e6c1cSAndre Przywara 	P9_RMKDIR,
167*fe8e6c1cSAndre Przywara 	P9_TRENAMEAT = 74,
168*fe8e6c1cSAndre Przywara 	P9_RRENAMEAT,
169*fe8e6c1cSAndre Przywara 	P9_TUNLINKAT = 76,
170*fe8e6c1cSAndre Przywara 	P9_RUNLINKAT,
171*fe8e6c1cSAndre Przywara 	P9_TVERSION = 100,
172*fe8e6c1cSAndre Przywara 	P9_RVERSION,
173*fe8e6c1cSAndre Przywara 	P9_TAUTH = 102,
174*fe8e6c1cSAndre Przywara 	P9_RAUTH,
175*fe8e6c1cSAndre Przywara 	P9_TATTACH = 104,
176*fe8e6c1cSAndre Przywara 	P9_RATTACH,
177*fe8e6c1cSAndre Przywara 	P9_TERROR = 106,
178*fe8e6c1cSAndre Przywara 	P9_RERROR,
179*fe8e6c1cSAndre Przywara 	P9_TFLUSH = 108,
180*fe8e6c1cSAndre Przywara 	P9_RFLUSH,
181*fe8e6c1cSAndre Przywara 	P9_TWALK = 110,
182*fe8e6c1cSAndre Przywara 	P9_RWALK,
183*fe8e6c1cSAndre Przywara 	P9_TOPEN = 112,
184*fe8e6c1cSAndre Przywara 	P9_ROPEN,
185*fe8e6c1cSAndre Przywara 	P9_TCREATE = 114,
186*fe8e6c1cSAndre Przywara 	P9_RCREATE,
187*fe8e6c1cSAndre Przywara 	P9_TREAD = 116,
188*fe8e6c1cSAndre Przywara 	P9_RREAD,
189*fe8e6c1cSAndre Przywara 	P9_TWRITE = 118,
190*fe8e6c1cSAndre Przywara 	P9_RWRITE,
191*fe8e6c1cSAndre Przywara 	P9_TCLUNK = 120,
192*fe8e6c1cSAndre Przywara 	P9_RCLUNK,
193*fe8e6c1cSAndre Przywara 	P9_TREMOVE = 122,
194*fe8e6c1cSAndre Przywara 	P9_RREMOVE,
195*fe8e6c1cSAndre Przywara 	P9_TSTAT = 124,
196*fe8e6c1cSAndre Przywara 	P9_RSTAT,
197*fe8e6c1cSAndre Przywara 	P9_TWSTAT = 126,
198*fe8e6c1cSAndre Przywara 	P9_RWSTAT,
199*fe8e6c1cSAndre Przywara };
200*fe8e6c1cSAndre Przywara 
201*fe8e6c1cSAndre Przywara /**
202*fe8e6c1cSAndre Przywara  * enum p9_open_mode_t - 9P open modes
203*fe8e6c1cSAndre Przywara  * @P9_OREAD: open file for reading only
204*fe8e6c1cSAndre Przywara  * @P9_OWRITE: open file for writing only
205*fe8e6c1cSAndre Przywara  * @P9_ORDWR: open file for reading or writing
206*fe8e6c1cSAndre Przywara  * @P9_OEXEC: open file for execution
207*fe8e6c1cSAndre Przywara  * @P9_OTRUNC: truncate file to zero-length before opening it
208*fe8e6c1cSAndre Przywara  * @P9_OREXEC: close the file when an exec(2) system call is made
209*fe8e6c1cSAndre Przywara  * @P9_ORCLOSE: remove the file when the file is closed
210*fe8e6c1cSAndre Przywara  * @P9_OAPPEND: open the file and seek to the end
211*fe8e6c1cSAndre Przywara  * @P9_OEXCL: only create a file, do not open it
212*fe8e6c1cSAndre Przywara  *
213*fe8e6c1cSAndre Przywara  * 9P open modes differ slightly from Posix standard modes.
214*fe8e6c1cSAndre Przywara  * In particular, there are extra modes which specify different
215*fe8e6c1cSAndre Przywara  * semantic behaviors than may be available on standard Posix
216*fe8e6c1cSAndre Przywara  * systems.  For example, @P9_OREXEC and @P9_ORCLOSE are modes that
217*fe8e6c1cSAndre Przywara  * most likely will not be issued from the Linux VFS client, but may
218*fe8e6c1cSAndre Przywara  * be supported by servers.
219*fe8e6c1cSAndre Przywara  *
220*fe8e6c1cSAndre Przywara  * See Also: http://plan9.bell-labs.com/magic/man2html/2/open
221*fe8e6c1cSAndre Przywara  */
222*fe8e6c1cSAndre Przywara 
223*fe8e6c1cSAndre Przywara enum p9_open_mode_t {
224*fe8e6c1cSAndre Przywara 	P9_OREAD = 0x00,
225*fe8e6c1cSAndre Przywara 	P9_OWRITE = 0x01,
226*fe8e6c1cSAndre Przywara 	P9_ORDWR = 0x02,
227*fe8e6c1cSAndre Przywara 	P9_OEXEC = 0x03,
228*fe8e6c1cSAndre Przywara 	P9_OTRUNC = 0x10,
229*fe8e6c1cSAndre Przywara 	P9_OREXEC = 0x20,
230*fe8e6c1cSAndre Przywara 	P9_ORCLOSE = 0x40,
231*fe8e6c1cSAndre Przywara 	P9_OAPPEND = 0x80,
232*fe8e6c1cSAndre Przywara 	P9_OEXCL = 0x1000,
233*fe8e6c1cSAndre Przywara };
234*fe8e6c1cSAndre Przywara 
235*fe8e6c1cSAndre Przywara /**
236*fe8e6c1cSAndre Przywara  * enum p9_perm_t - 9P permissions
237*fe8e6c1cSAndre Przywara  * @P9_DMDIR: mode bit for directories
238*fe8e6c1cSAndre Przywara  * @P9_DMAPPEND: mode bit for is append-only
239*fe8e6c1cSAndre Przywara  * @P9_DMEXCL: mode bit for excluse use (only one open handle allowed)
240*fe8e6c1cSAndre Przywara  * @P9_DMMOUNT: mode bit for mount points
241*fe8e6c1cSAndre Przywara  * @P9_DMAUTH: mode bit for authentication file
242*fe8e6c1cSAndre Przywara  * @P9_DMTMP: mode bit for non-backed-up files
243*fe8e6c1cSAndre Przywara  * @P9_DMSYMLINK: mode bit for symbolic links (9P2000.u)
244*fe8e6c1cSAndre Przywara  * @P9_DMLINK: mode bit for hard-link (9P2000.u)
245*fe8e6c1cSAndre Przywara  * @P9_DMDEVICE: mode bit for device files (9P2000.u)
246*fe8e6c1cSAndre Przywara  * @P9_DMNAMEDPIPE: mode bit for named pipe (9P2000.u)
247*fe8e6c1cSAndre Przywara  * @P9_DMSOCKET: mode bit for socket (9P2000.u)
248*fe8e6c1cSAndre Przywara  * @P9_DMSETUID: mode bit for setuid (9P2000.u)
249*fe8e6c1cSAndre Przywara  * @P9_DMSETGID: mode bit for setgid (9P2000.u)
250*fe8e6c1cSAndre Przywara  * @P9_DMSETVTX: mode bit for sticky bit (9P2000.u)
251*fe8e6c1cSAndre Przywara  *
252*fe8e6c1cSAndre Przywara  * 9P permissions differ slightly from Posix standard modes.
253*fe8e6c1cSAndre Przywara  *
254*fe8e6c1cSAndre Przywara  * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
255*fe8e6c1cSAndre Przywara  */
256*fe8e6c1cSAndre Przywara enum p9_perm_t {
257*fe8e6c1cSAndre Przywara 	P9_DMDIR = 0x80000000,
258*fe8e6c1cSAndre Przywara 	P9_DMAPPEND = 0x40000000,
259*fe8e6c1cSAndre Przywara 	P9_DMEXCL = 0x20000000,
260*fe8e6c1cSAndre Przywara 	P9_DMMOUNT = 0x10000000,
261*fe8e6c1cSAndre Przywara 	P9_DMAUTH = 0x08000000,
262*fe8e6c1cSAndre Przywara 	P9_DMTMP = 0x04000000,
263*fe8e6c1cSAndre Przywara /* 9P2000.u extensions */
264*fe8e6c1cSAndre Przywara 	P9_DMSYMLINK = 0x02000000,
265*fe8e6c1cSAndre Przywara 	P9_DMLINK = 0x01000000,
266*fe8e6c1cSAndre Przywara 	P9_DMDEVICE = 0x00800000,
267*fe8e6c1cSAndre Przywara 	P9_DMNAMEDPIPE = 0x00200000,
268*fe8e6c1cSAndre Przywara 	P9_DMSOCKET = 0x00100000,
269*fe8e6c1cSAndre Przywara 	P9_DMSETUID = 0x00080000,
270*fe8e6c1cSAndre Przywara 	P9_DMSETGID = 0x00040000,
271*fe8e6c1cSAndre Przywara 	P9_DMSETVTX = 0x00010000,
272*fe8e6c1cSAndre Przywara };
273*fe8e6c1cSAndre Przywara 
274*fe8e6c1cSAndre Przywara /* 9p2000.L open flags */
275*fe8e6c1cSAndre Przywara #define P9_DOTL_RDONLY        00000000
276*fe8e6c1cSAndre Przywara #define P9_DOTL_WRONLY        00000001
277*fe8e6c1cSAndre Przywara #define P9_DOTL_RDWR          00000002
278*fe8e6c1cSAndre Przywara #define P9_DOTL_NOACCESS      00000003
279*fe8e6c1cSAndre Przywara #define P9_DOTL_CREATE        00000100
280*fe8e6c1cSAndre Przywara #define P9_DOTL_EXCL          00000200
281*fe8e6c1cSAndre Przywara #define P9_DOTL_NOCTTY        00000400
282*fe8e6c1cSAndre Przywara #define P9_DOTL_TRUNC         00001000
283*fe8e6c1cSAndre Przywara #define P9_DOTL_APPEND        00002000
284*fe8e6c1cSAndre Przywara #define P9_DOTL_NONBLOCK      00004000
285*fe8e6c1cSAndre Przywara #define P9_DOTL_DSYNC         00010000
286*fe8e6c1cSAndre Przywara #define P9_DOTL_FASYNC        00020000
287*fe8e6c1cSAndre Przywara #define P9_DOTL_DIRECT        00040000
288*fe8e6c1cSAndre Przywara #define P9_DOTL_LARGEFILE     00100000
289*fe8e6c1cSAndre Przywara #define P9_DOTL_DIRECTORY     00200000
290*fe8e6c1cSAndre Przywara #define P9_DOTL_NOFOLLOW      00400000
291*fe8e6c1cSAndre Przywara #define P9_DOTL_NOATIME       01000000
292*fe8e6c1cSAndre Przywara #define P9_DOTL_CLOEXEC       02000000
293*fe8e6c1cSAndre Przywara #define P9_DOTL_SYNC          04000000
294*fe8e6c1cSAndre Przywara 
295*fe8e6c1cSAndre Przywara /* 9p2000.L at flags */
296*fe8e6c1cSAndre Przywara #define P9_DOTL_AT_REMOVEDIR		0x200
297*fe8e6c1cSAndre Przywara 
298*fe8e6c1cSAndre Przywara /* 9p2000.L lock type */
299*fe8e6c1cSAndre Przywara #define P9_LOCK_TYPE_RDLCK 0
300*fe8e6c1cSAndre Przywara #define P9_LOCK_TYPE_WRLCK 1
301*fe8e6c1cSAndre Przywara #define P9_LOCK_TYPE_UNLCK 2
302*fe8e6c1cSAndre Przywara 
303*fe8e6c1cSAndre Przywara /**
304*fe8e6c1cSAndre Przywara  * enum p9_qid_t - QID types
305*fe8e6c1cSAndre Przywara  * @P9_QTDIR: directory
306*fe8e6c1cSAndre Przywara  * @P9_QTAPPEND: append-only
307*fe8e6c1cSAndre Przywara  * @P9_QTEXCL: excluse use (only one open handle allowed)
308*fe8e6c1cSAndre Przywara  * @P9_QTMOUNT: mount points
309*fe8e6c1cSAndre Przywara  * @P9_QTAUTH: authentication file
310*fe8e6c1cSAndre Przywara  * @P9_QTTMP: non-backed-up files
311*fe8e6c1cSAndre Przywara  * @P9_QTSYMLINK: symbolic links (9P2000.u)
312*fe8e6c1cSAndre Przywara  * @P9_QTLINK: hard-link (9P2000.u)
313*fe8e6c1cSAndre Przywara  * @P9_QTFILE: normal files
314*fe8e6c1cSAndre Przywara  *
315*fe8e6c1cSAndre Przywara  * QID types are a subset of permissions - they are primarily
316*fe8e6c1cSAndre Przywara  * used to differentiate semantics for a file system entity via
317*fe8e6c1cSAndre Przywara  * a jump-table.  Their value is also the most significant 16 bits
318*fe8e6c1cSAndre Przywara  * of the permission_t
319*fe8e6c1cSAndre Przywara  *
320*fe8e6c1cSAndre Przywara  * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
321*fe8e6c1cSAndre Przywara  */
322*fe8e6c1cSAndre Przywara enum p9_qid_t {
323*fe8e6c1cSAndre Przywara 	P9_QTDIR = 0x80,
324*fe8e6c1cSAndre Przywara 	P9_QTAPPEND = 0x40,
325*fe8e6c1cSAndre Przywara 	P9_QTEXCL = 0x20,
326*fe8e6c1cSAndre Przywara 	P9_QTMOUNT = 0x10,
327*fe8e6c1cSAndre Przywara 	P9_QTAUTH = 0x08,
328*fe8e6c1cSAndre Przywara 	P9_QTTMP = 0x04,
329*fe8e6c1cSAndre Przywara 	P9_QTSYMLINK = 0x02,
330*fe8e6c1cSAndre Przywara 	P9_QTLINK = 0x01,
331*fe8e6c1cSAndre Przywara 	P9_QTFILE = 0x00,
332*fe8e6c1cSAndre Przywara };
333*fe8e6c1cSAndre Przywara 
334*fe8e6c1cSAndre Przywara /* 9P Magic Numbers */
335*fe8e6c1cSAndre Przywara #define P9_NOTAG	(u16)(~0)
336*fe8e6c1cSAndre Przywara #define P9_NOFID	(u32)(~0)
337*fe8e6c1cSAndre Przywara #define P9_MAXWELEM	16
338*fe8e6c1cSAndre Przywara 
339*fe8e6c1cSAndre Przywara /* ample room for Twrite/Rread header */
340*fe8e6c1cSAndre Przywara #define P9_IOHDRSZ	24
341*fe8e6c1cSAndre Przywara 
342*fe8e6c1cSAndre Przywara /* Room for readdir header */
343*fe8e6c1cSAndre Przywara #define P9_READDIRHDRSZ	24
344*fe8e6c1cSAndre Przywara 
345*fe8e6c1cSAndre Przywara /* size of header for zero copy read/write */
346*fe8e6c1cSAndre Przywara #define P9_ZC_HDR_SZ 4096
347*fe8e6c1cSAndre Przywara 
348*fe8e6c1cSAndre Przywara /**
349*fe8e6c1cSAndre Przywara  * struct p9_qid - file system entity information
350*fe8e6c1cSAndre Przywara  * @type: 8-bit type &p9_qid_t
351*fe8e6c1cSAndre Przywara  * @version: 16-bit monotonically incrementing version number
352*fe8e6c1cSAndre Przywara  * @path: 64-bit per-server-unique ID for a file system element
353*fe8e6c1cSAndre Przywara  *
354*fe8e6c1cSAndre Przywara  * qids are identifiers used by 9P servers to track file system
355*fe8e6c1cSAndre Przywara  * entities.  The type is used to differentiate semantics for operations
356*fe8e6c1cSAndre Przywara  * on the entity (ie. read means something different on a directory than
357*fe8e6c1cSAndre Przywara  * on a file).  The path provides a server unique index for an entity
358*fe8e6c1cSAndre Przywara  * (roughly analogous to an inode number), while the version is updated
359*fe8e6c1cSAndre Przywara  * every time a file is modified and can be used to maintain cache
360*fe8e6c1cSAndre Przywara  * coherency between clients and serves.
361*fe8e6c1cSAndre Przywara  * Servers will often differentiate purely synthetic entities by setting
362*fe8e6c1cSAndre Przywara  * their version to 0, signaling that they should never be cached and
363*fe8e6c1cSAndre Przywara  * should be accessed synchronously.
364*fe8e6c1cSAndre Przywara  *
365*fe8e6c1cSAndre Przywara  * See Also://plan9.bell-labs.com/magic/man2html/2/stat
366*fe8e6c1cSAndre Przywara  */
367*fe8e6c1cSAndre Przywara 
368*fe8e6c1cSAndre Przywara struct p9_qid {
369*fe8e6c1cSAndre Przywara 	u8 type;
370*fe8e6c1cSAndre Przywara 	u32 version;
371*fe8e6c1cSAndre Przywara 	u64 path;
372*fe8e6c1cSAndre Przywara };
373*fe8e6c1cSAndre Przywara 
374*fe8e6c1cSAndre Przywara /**
375*fe8e6c1cSAndre Przywara  * struct p9_wstat - file system metadata information
376*fe8e6c1cSAndre Przywara  * @size: length prefix for this stat structure instance
377*fe8e6c1cSAndre Przywara  * @type: the type of the server (equivalent to a major number)
378*fe8e6c1cSAndre Przywara  * @dev: the sub-type of the server (equivalent to a minor number)
379*fe8e6c1cSAndre Przywara  * @qid: unique id from the server of type &p9_qid
380*fe8e6c1cSAndre Przywara  * @mode: Plan 9 format permissions of type &p9_perm_t
381*fe8e6c1cSAndre Przywara  * @atime: Last access/read time
382*fe8e6c1cSAndre Przywara  * @mtime: Last modify/write time
383*fe8e6c1cSAndre Przywara  * @length: file length
384*fe8e6c1cSAndre Przywara  * @name: last element of path (aka filename)
385*fe8e6c1cSAndre Przywara  * @uid: owner name
386*fe8e6c1cSAndre Przywara  * @gid: group owner
387*fe8e6c1cSAndre Przywara  * @muid: last modifier
388*fe8e6c1cSAndre Przywara  * @extension: area used to encode extended UNIX support
389*fe8e6c1cSAndre Przywara  * @n_uid: numeric user id of owner (part of 9p2000.u extension)
390*fe8e6c1cSAndre Przywara  * @n_gid: numeric group id (part of 9p2000.u extension)
391*fe8e6c1cSAndre Przywara  * @n_muid: numeric user id of laster modifier (part of 9p2000.u extension)
392*fe8e6c1cSAndre Przywara  *
393*fe8e6c1cSAndre Przywara  * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
394*fe8e6c1cSAndre Przywara  */
395*fe8e6c1cSAndre Przywara 
396*fe8e6c1cSAndre Przywara struct p9_wstat {
397*fe8e6c1cSAndre Przywara 	u16 size;
398*fe8e6c1cSAndre Przywara 	u16 type;
399*fe8e6c1cSAndre Przywara 	u32 dev;
400*fe8e6c1cSAndre Przywara 	struct p9_qid qid;
401*fe8e6c1cSAndre Przywara 	u32 mode;
402*fe8e6c1cSAndre Przywara 	u32 atime;
403*fe8e6c1cSAndre Przywara 	u32 mtime;
404*fe8e6c1cSAndre Przywara 	u64 length;
405*fe8e6c1cSAndre Przywara 	char *name;
406*fe8e6c1cSAndre Przywara 	char *uid;
407*fe8e6c1cSAndre Przywara 	char *gid;
408*fe8e6c1cSAndre Przywara 	char *muid;
409*fe8e6c1cSAndre Przywara 	char *extension;	/* 9p2000.u extensions */
410*fe8e6c1cSAndre Przywara 	kuid_t n_uid;		/* 9p2000.u extensions */
411*fe8e6c1cSAndre Przywara 	kgid_t n_gid;		/* 9p2000.u extensions */
412*fe8e6c1cSAndre Przywara 	kuid_t n_muid;		/* 9p2000.u extensions */
413*fe8e6c1cSAndre Przywara };
414*fe8e6c1cSAndre Przywara 
415*fe8e6c1cSAndre Przywara struct p9_stat_dotl {
416*fe8e6c1cSAndre Przywara 	u64 st_result_mask;
417*fe8e6c1cSAndre Przywara 	struct p9_qid qid;
418*fe8e6c1cSAndre Przywara 	u32 st_mode;
419*fe8e6c1cSAndre Przywara 	kuid_t st_uid;
420*fe8e6c1cSAndre Przywara 	kgid_t st_gid;
421*fe8e6c1cSAndre Przywara 	u64 st_nlink;
422*fe8e6c1cSAndre Przywara 	u64 st_rdev;
423*fe8e6c1cSAndre Przywara 	u64 st_size;
424*fe8e6c1cSAndre Przywara 	u64 st_blksize;
425*fe8e6c1cSAndre Przywara 	u64 st_blocks;
426*fe8e6c1cSAndre Przywara 	u64 st_atime_sec;
427*fe8e6c1cSAndre Przywara 	u64 st_atime_nsec;
428*fe8e6c1cSAndre Przywara 	u64 st_mtime_sec;
429*fe8e6c1cSAndre Przywara 	u64 st_mtime_nsec;
430*fe8e6c1cSAndre Przywara 	u64 st_ctime_sec;
431*fe8e6c1cSAndre Przywara 	u64 st_ctime_nsec;
432*fe8e6c1cSAndre Przywara 	u64 st_btime_sec;
433*fe8e6c1cSAndre Przywara 	u64 st_btime_nsec;
434*fe8e6c1cSAndre Przywara 	u64 st_gen;
435*fe8e6c1cSAndre Przywara 	u64 st_data_version;
436*fe8e6c1cSAndre Przywara };
437*fe8e6c1cSAndre Przywara 
438*fe8e6c1cSAndre Przywara #define P9_STATS_MODE		0x00000001ULL
439*fe8e6c1cSAndre Przywara #define P9_STATS_NLINK		0x00000002ULL
440*fe8e6c1cSAndre Przywara #define P9_STATS_UID		0x00000004ULL
441*fe8e6c1cSAndre Przywara #define P9_STATS_GID		0x00000008ULL
442*fe8e6c1cSAndre Przywara #define P9_STATS_RDEV		0x00000010ULL
443*fe8e6c1cSAndre Przywara #define P9_STATS_ATIME		0x00000020ULL
444*fe8e6c1cSAndre Przywara #define P9_STATS_MTIME		0x00000040ULL
445*fe8e6c1cSAndre Przywara #define P9_STATS_CTIME		0x00000080ULL
446*fe8e6c1cSAndre Przywara #define P9_STATS_INO		0x00000100ULL
447*fe8e6c1cSAndre Przywara #define P9_STATS_SIZE		0x00000200ULL
448*fe8e6c1cSAndre Przywara #define P9_STATS_BLOCKS		0x00000400ULL
449*fe8e6c1cSAndre Przywara 
450*fe8e6c1cSAndre Przywara #define P9_STATS_BTIME		0x00000800ULL
451*fe8e6c1cSAndre Przywara #define P9_STATS_GEN		0x00001000ULL
452*fe8e6c1cSAndre Przywara #define P9_STATS_DATA_VERSION	0x00002000ULL
453*fe8e6c1cSAndre Przywara 
454*fe8e6c1cSAndre Przywara #define P9_STATS_BASIC		0x000007ffULL /* Mask for fields up to BLOCKS */
455*fe8e6c1cSAndre Przywara #define P9_STATS_ALL		0x00003fffULL /* Mask for All fields above */
456*fe8e6c1cSAndre Przywara 
457*fe8e6c1cSAndre Przywara /**
458*fe8e6c1cSAndre Przywara  * struct p9_iattr_dotl - P9 inode attribute for setattr
459*fe8e6c1cSAndre Przywara  * @valid: bitfield specifying which fields are valid
460*fe8e6c1cSAndre Przywara  *         same as in struct iattr
461*fe8e6c1cSAndre Przywara  * @mode: File permission bits
462*fe8e6c1cSAndre Przywara  * @uid: user id of owner
463*fe8e6c1cSAndre Przywara  * @gid: group id
464*fe8e6c1cSAndre Przywara  * @size: File size
465*fe8e6c1cSAndre Przywara  * @atime_sec: Last access time, seconds
466*fe8e6c1cSAndre Przywara  * @atime_nsec: Last access time, nanoseconds
467*fe8e6c1cSAndre Przywara  * @mtime_sec: Last modification time, seconds
468*fe8e6c1cSAndre Przywara  * @mtime_nsec: Last modification time, nanoseconds
469*fe8e6c1cSAndre Przywara  */
470*fe8e6c1cSAndre Przywara 
471*fe8e6c1cSAndre Przywara struct p9_iattr_dotl {
472*fe8e6c1cSAndre Przywara 	u32 valid;
473*fe8e6c1cSAndre Przywara 	u32 mode;
474*fe8e6c1cSAndre Przywara 	kuid_t uid;
475*fe8e6c1cSAndre Przywara 	kgid_t gid;
476*fe8e6c1cSAndre Przywara 	u64 size;
477*fe8e6c1cSAndre Przywara 	u64 atime_sec;
478*fe8e6c1cSAndre Przywara 	u64 atime_nsec;
479*fe8e6c1cSAndre Przywara 	u64 mtime_sec;
480*fe8e6c1cSAndre Przywara 	u64 mtime_nsec;
481*fe8e6c1cSAndre Przywara };
482*fe8e6c1cSAndre Przywara 
483*fe8e6c1cSAndre Przywara #define P9_LOCK_SUCCESS 0
484*fe8e6c1cSAndre Przywara #define P9_LOCK_BLOCKED 1
485*fe8e6c1cSAndre Przywara #define P9_LOCK_ERROR 2
486*fe8e6c1cSAndre Przywara #define P9_LOCK_GRACE 3
487*fe8e6c1cSAndre Przywara 
488*fe8e6c1cSAndre Przywara #define P9_LOCK_FLAGS_BLOCK 1
489*fe8e6c1cSAndre Przywara #define P9_LOCK_FLAGS_RECLAIM 2
490*fe8e6c1cSAndre Przywara 
491*fe8e6c1cSAndre Przywara /* struct p9_flock: POSIX lock structure
492*fe8e6c1cSAndre Przywara  * @type - type of lock
493*fe8e6c1cSAndre Przywara  * @flags - lock flags
494*fe8e6c1cSAndre Przywara  * @start - starting offset of the lock
495*fe8e6c1cSAndre Przywara  * @length - number of bytes
496*fe8e6c1cSAndre Przywara  * @proc_id - process id which wants to take lock
497*fe8e6c1cSAndre Przywara  * @client_id - client id
498*fe8e6c1cSAndre Przywara  */
499*fe8e6c1cSAndre Przywara 
500*fe8e6c1cSAndre Przywara struct p9_flock {
501*fe8e6c1cSAndre Przywara 	u8 type;
502*fe8e6c1cSAndre Przywara 	u32 flags;
503*fe8e6c1cSAndre Przywara 	u64 start;
504*fe8e6c1cSAndre Przywara 	u64 length;
505*fe8e6c1cSAndre Przywara 	u32 proc_id;
506*fe8e6c1cSAndre Przywara 	char *client_id;
507*fe8e6c1cSAndre Przywara };
508*fe8e6c1cSAndre Przywara 
509*fe8e6c1cSAndre Przywara /* struct p9_getlock: getlock structure
510*fe8e6c1cSAndre Przywara  * @type - type of lock
511*fe8e6c1cSAndre Przywara  * @start - starting offset of the lock
512*fe8e6c1cSAndre Przywara  * @length - number of bytes
513*fe8e6c1cSAndre Przywara  * @proc_id - process id which wants to take lock
514*fe8e6c1cSAndre Przywara  * @client_id - client id
515*fe8e6c1cSAndre Przywara  */
516*fe8e6c1cSAndre Przywara 
517*fe8e6c1cSAndre Przywara struct p9_getlock {
518*fe8e6c1cSAndre Przywara 	u8 type;
519*fe8e6c1cSAndre Przywara 	u64 start;
520*fe8e6c1cSAndre Przywara 	u64 length;
521*fe8e6c1cSAndre Przywara 	u32 proc_id;
522*fe8e6c1cSAndre Przywara 	char *client_id;
523*fe8e6c1cSAndre Przywara };
524*fe8e6c1cSAndre Przywara 
525*fe8e6c1cSAndre Przywara struct p9_rstatfs {
526*fe8e6c1cSAndre Przywara 	u32 type;
527*fe8e6c1cSAndre Przywara 	u32 bsize;
528*fe8e6c1cSAndre Przywara 	u64 blocks;
529*fe8e6c1cSAndre Przywara 	u64 bfree;
530*fe8e6c1cSAndre Przywara 	u64 bavail;
531*fe8e6c1cSAndre Przywara 	u64 files;
532*fe8e6c1cSAndre Przywara 	u64 ffree;
533*fe8e6c1cSAndre Przywara 	u64 fsid;
534*fe8e6c1cSAndre Przywara 	u32 namelen;
535*fe8e6c1cSAndre Przywara };
536*fe8e6c1cSAndre Przywara 
537*fe8e6c1cSAndre Przywara /**
538*fe8e6c1cSAndre Przywara  * struct p9_fcall - primary packet structure
539*fe8e6c1cSAndre Przywara  * @size: prefixed length of the structure
540*fe8e6c1cSAndre Przywara  * @id: protocol operating identifier of type &p9_msg_t
541*fe8e6c1cSAndre Przywara  * @tag: transaction id of the request
542*fe8e6c1cSAndre Przywara  * @offset: used by marshalling routines to track current position in buffer
543*fe8e6c1cSAndre Przywara  * @capacity: used by marshalling routines to track total malloc'd capacity
544*fe8e6c1cSAndre Przywara  * @sdata: payload
545*fe8e6c1cSAndre Przywara  *
546*fe8e6c1cSAndre Przywara  * &p9_fcall represents the structure for all 9P RPC
547*fe8e6c1cSAndre Przywara  * transactions.  Requests are packaged into fcalls, and reponses
548*fe8e6c1cSAndre Przywara  * must be extracted from them.
549*fe8e6c1cSAndre Przywara  *
550*fe8e6c1cSAndre Przywara  * See Also: http://plan9.bell-labs.com/magic/man2html/2/fcall
551*fe8e6c1cSAndre Przywara  */
552*fe8e6c1cSAndre Przywara 
553*fe8e6c1cSAndre Przywara struct p9_fcall {
554*fe8e6c1cSAndre Przywara 	u32 size;
555*fe8e6c1cSAndre Przywara 	u8 id;
556*fe8e6c1cSAndre Przywara 	u16 tag;
557*fe8e6c1cSAndre Przywara 
558*fe8e6c1cSAndre Przywara 	size_t offset;
559*fe8e6c1cSAndre Przywara 	size_t capacity;
560*fe8e6c1cSAndre Przywara 
561*fe8e6c1cSAndre Przywara 	u8 *sdata;
562*fe8e6c1cSAndre Przywara };
563*fe8e6c1cSAndre Przywara 
564*fe8e6c1cSAndre Przywara struct p9_idpool;
565*fe8e6c1cSAndre Przywara 
566*fe8e6c1cSAndre Przywara int p9_errstr2errno(char *errstr, int len);
567*fe8e6c1cSAndre Przywara 
568*fe8e6c1cSAndre Przywara struct p9_idpool *p9_idpool_create(void);
569*fe8e6c1cSAndre Przywara void p9_idpool_destroy(struct p9_idpool *);
570*fe8e6c1cSAndre Przywara int p9_idpool_get(struct p9_idpool *p);
571*fe8e6c1cSAndre Przywara void p9_idpool_put(int id, struct p9_idpool *p);
572*fe8e6c1cSAndre Przywara int p9_idpool_check(int id, struct p9_idpool *p);
573*fe8e6c1cSAndre Przywara 
574*fe8e6c1cSAndre Przywara int p9_error_init(void);
575*fe8e6c1cSAndre Przywara int p9_trans_fd_init(void);
576*fe8e6c1cSAndre Przywara void p9_trans_fd_exit(void);
577*fe8e6c1cSAndre Przywara #endif /* NET_9P_H */
578