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