blob: 6355392786e2fab0cee8fa040334e13dd47e5abc [file] [log] [blame]
Eric Van Hensbergenb8cf9452005-09-09 13:04:21 -07001/*
2 * linux/fs/9p/9p.h
3 *
4 * 9P protocol definitions.
5 *
6 * Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
7 * Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to:
21 * Free Software Foundation
22 * 51 Franklin Street, Fifth Floor
23 * Boston, MA 02111-1301 USA
24 *
25 */
26
27/* Message Types */
28enum {
29 TVERSION = 100,
30 RVERSION,
31 TAUTH = 102,
32 RAUTH,
33 TATTACH = 104,
34 RATTACH,
35 TERROR = 106,
36 RERROR,
37 TFLUSH = 108,
38 RFLUSH,
39 TWALK = 110,
40 RWALK,
41 TOPEN = 112,
42 ROPEN,
43 TCREATE = 114,
44 RCREATE,
45 TREAD = 116,
46 RREAD,
47 TWRITE = 118,
48 RWRITE,
49 TCLUNK = 120,
50 RCLUNK,
51 TREMOVE = 122,
52 RREMOVE,
53 TSTAT = 124,
54 RSTAT,
55 TWSTAT = 126,
56 RWSTAT,
57};
58
59/* modes */
60enum {
61 V9FS_OREAD = 0x00,
62 V9FS_OWRITE = 0x01,
63 V9FS_ORDWR = 0x02,
64 V9FS_OEXEC = 0x03,
65 V9FS_OEXCL = 0x04,
66 V9FS_OTRUNC = 0x10,
67 V9FS_OREXEC = 0x20,
68 V9FS_ORCLOSE = 0x40,
69 V9FS_OAPPEND = 0x80,
70};
71
72/* permissions */
73enum {
74 V9FS_DMDIR = 0x80000000,
75 V9FS_DMAPPEND = 0x40000000,
76 V9FS_DMEXCL = 0x20000000,
77 V9FS_DMMOUNT = 0x10000000,
78 V9FS_DMAUTH = 0x08000000,
79 V9FS_DMTMP = 0x04000000,
80 V9FS_DMSYMLINK = 0x02000000,
81 V9FS_DMLINK = 0x01000000,
82 /* 9P2000.u extensions */
83 V9FS_DMDEVICE = 0x00800000,
84 V9FS_DMNAMEDPIPE = 0x00200000,
85 V9FS_DMSOCKET = 0x00100000,
86 V9FS_DMSETUID = 0x00080000,
87 V9FS_DMSETGID = 0x00040000,
88};
89
90/* qid.types */
91enum {
92 V9FS_QTDIR = 0x80,
93 V9FS_QTAPPEND = 0x40,
94 V9FS_QTEXCL = 0x20,
95 V9FS_QTMOUNT = 0x10,
96 V9FS_QTAUTH = 0x08,
97 V9FS_QTTMP = 0x04,
98 V9FS_QTSYMLINK = 0x02,
99 V9FS_QTLINK = 0x01,
100 V9FS_QTFILE = 0x00,
101};
102
Latchesar Ionkov3cf64292006-01-08 01:04:58 -0800103#define V9FS_NOTAG (u16)(~0)
104#define V9FS_NOFID (u32)(~0)
105
Eric Van Hensbergenb8cf9452005-09-09 13:04:21 -0700106/* ample room for Twrite/Rread header (iounit) */
107#define V9FS_IOHDRSZ 24
108
109/* qids are the unique ID for a file (like an inode */
110struct v9fs_qid {
111 u8 type;
112 u32 version;
113 u64 path;
114};
115
116/* Plan 9 file metadata (stat) structure */
117struct v9fs_stat {
118 u16 size;
119 u16 type;
120 u32 dev;
121 struct v9fs_qid qid;
122 u32 mode;
123 u32 atime;
124 u32 mtime;
125 u64 length;
126 char *name;
127 char *uid;
128 char *gid;
129 char *muid;
130 char *extension; /* 9p2000.u extensions */
131 u32 n_uid; /* 9p2000.u extensions */
132 u32 n_gid; /* 9p2000.u extensions */
133 u32 n_muid; /* 9p2000.u extensions */
134 char data[0];
135};
136
137/* Structures for Protocol Operations */
138
139struct Tversion {
140 u32 msize;
141 char *version;
142};
143
144struct Rversion {
145 u32 msize;
146 char *version;
147};
148
149struct Tauth {
150 u32 afid;
151 char *uname;
152 char *aname;
153};
154
155struct Rauth {
156 struct v9fs_qid qid;
157};
158
159struct Rerror {
160 char *error;
161 u32 errno; /* 9p2000.u extension */
162};
163
164struct Tflush {
165 u32 oldtag;
166};
167
168struct Rflush {
169};
170
171struct Tattach {
172 u32 fid;
173 u32 afid;
174 char *uname;
175 char *aname;
176};
177
178struct Rattach {
179 struct v9fs_qid qid;
180};
181
182struct Twalk {
183 u32 fid;
184 u32 newfid;
185 u32 nwname;
186 char **wnames;
187};
188
189struct Rwalk {
190 u32 nwqid;
191 struct v9fs_qid *wqids;
192};
193
194struct Topen {
195 u32 fid;
196 u8 mode;
197};
198
199struct Ropen {
200 struct v9fs_qid qid;
201 u32 iounit;
202};
203
204struct Tcreate {
205 u32 fid;
206 char *name;
207 u32 perm;
208 u8 mode;
209};
210
211struct Rcreate {
212 struct v9fs_qid qid;
213 u32 iounit;
214};
215
216struct Tread {
217 u32 fid;
218 u64 offset;
219 u32 count;
220};
221
222struct Rread {
223 u32 count;
224 u8 *data;
225};
226
227struct Twrite {
228 u32 fid;
229 u64 offset;
230 u32 count;
231 u8 *data;
232};
233
234struct Rwrite {
235 u32 count;
236};
237
238struct Tclunk {
239 u32 fid;
240};
241
242struct Rclunk {
243};
244
245struct Tremove {
246 u32 fid;
247};
248
249struct Rremove {
250};
251
252struct Tstat {
253 u32 fid;
254};
255
256struct Rstat {
257 struct v9fs_stat *stat;
258};
259
260struct Twstat {
261 u32 fid;
262 struct v9fs_stat *stat;
263};
264
265struct Rwstat {
266};
267
268/*
269 * fcall is the primary packet structure
270 *
271 */
272
273struct v9fs_fcall {
274 u32 size;
275 u8 id;
276 u16 tag;
277
278 union {
279 struct Tversion tversion;
280 struct Rversion rversion;
281 struct Tauth tauth;
282 struct Rauth rauth;
283 struct Rerror rerror;
284 struct Tflush tflush;
285 struct Rflush rflush;
286 struct Tattach tattach;
287 struct Rattach rattach;
288 struct Twalk twalk;
289 struct Rwalk rwalk;
290 struct Topen topen;
291 struct Ropen ropen;
292 struct Tcreate tcreate;
293 struct Rcreate rcreate;
294 struct Tread tread;
295 struct Rread rread;
296 struct Twrite twrite;
297 struct Rwrite rwrite;
298 struct Tclunk tclunk;
299 struct Rclunk rclunk;
300 struct Tremove tremove;
301 struct Rremove rremove;
302 struct Tstat tstat;
303 struct Rstat rstat;
304 struct Twstat twstat;
305 struct Rwstat rwstat;
306 } params;
307};
308
Latchesar Ionkov3cf64292006-01-08 01:04:58 -0800309#define V9FS_FCALLHDRSZ (sizeof(struct v9fs_fcall) + \
310 sizeof(struct v9fs_stat) + 16*sizeof(struct v9fs_qid) + 16)
311
Eric Van Hensbergenb8cf9452005-09-09 13:04:21 -0700312#define FCALL_ERROR(fcall) (fcall ? fcall->params.rerror.error : "")
313
314int v9fs_t_version(struct v9fs_session_info *v9ses, u32 msize,
315 char *version, struct v9fs_fcall **rcall);
316
317int v9fs_t_attach(struct v9fs_session_info *v9ses, char *uname, char *aname,
318 u32 fid, u32 afid, struct v9fs_fcall **rcall);
319
Latchesar Ionkov3cf64292006-01-08 01:04:58 -0800320int v9fs_t_clunk(struct v9fs_session_info *v9ses, u32 fid);
Eric Van Hensbergenb8cf9452005-09-09 13:04:21 -0700321
322int v9fs_t_flush(struct v9fs_session_info *v9ses, u16 oldtag);
323
324int v9fs_t_stat(struct v9fs_session_info *v9ses, u32 fid,
325 struct v9fs_fcall **rcall);
326
327int v9fs_t_wstat(struct v9fs_session_info *v9ses, u32 fid,
328 struct v9fs_stat *stat, struct v9fs_fcall **rcall);
329
330int v9fs_t_walk(struct v9fs_session_info *v9ses, u32 fid, u32 newfid,
331 char *name, struct v9fs_fcall **rcall);
332
333int v9fs_t_open(struct v9fs_session_info *v9ses, u32 fid, u8 mode,
334 struct v9fs_fcall **rcall);
335
336int v9fs_t_remove(struct v9fs_session_info *v9ses, u32 fid,
337 struct v9fs_fcall **rcall);
338
339int v9fs_t_create(struct v9fs_session_info *v9ses, u32 fid, char *name,
340 u32 perm, u8 mode, struct v9fs_fcall **rcall);
341
342int v9fs_t_read(struct v9fs_session_info *v9ses, u32 fid,
343 u64 offset, u32 count, struct v9fs_fcall **rcall);
344
345int v9fs_t_write(struct v9fs_session_info *v9ses, u32 fid, u64 offset,
346 u32 count, void *data, struct v9fs_fcall **rcall);