]>
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 <[email protected]> |
b8cf945b EVH |
7 | * Copyright (C) 2004 by Eric Van Hensbergen <[email protected]> |
8 | * Copyright (C) 2002 by Ron Minnich <[email protected]> | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
42e8c509 EVH |
11 | * it under the terms of the GNU General Public License version 2 |
12 | * as published by the Free Software Foundation. | |
b8cf945b EVH |
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 */ | |
28 | enum { | |
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 */ | |
60 | enum { | |
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 */ | |
73 | enum { | |
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 */ | |
91 | enum { | |
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 | ||
3cf6429a LI |
103 | #define V9FS_NOTAG (u16)(~0) |
104 | #define V9FS_NOFID (u32)(~0) | |
531b1094 | 105 | #define V9FS_MAXWELEM 16 |
3cf6429a | 106 | |
b8cf945b EVH |
107 | /* ample room for Twrite/Rread header (iounit) */ |
108 | #define V9FS_IOHDRSZ 24 | |
109 | ||
531b1094 LI |
110 | struct v9fs_str { |
111 | u16 len; | |
112 | char *str; | |
113 | }; | |
114 | ||
b8cf945b EVH |
115 | /* qids are the unique ID for a file (like an inode */ |
116 | struct v9fs_qid { | |
117 | u8 type; | |
118 | u32 version; | |
119 | u64 path; | |
120 | }; | |
121 | ||
122 | /* Plan 9 file metadata (stat) structure */ | |
123 | struct v9fs_stat { | |
531b1094 LI |
124 | u16 size; |
125 | u16 type; | |
126 | u32 dev; | |
127 | struct v9fs_qid qid; | |
128 | u32 mode; | |
129 | u32 atime; | |
130 | u32 mtime; | |
131 | u64 length; | |
132 | struct v9fs_str name; | |
133 | struct v9fs_str uid; | |
134 | struct v9fs_str gid; | |
135 | struct v9fs_str muid; | |
136 | struct v9fs_str extension; /* 9p2000.u extensions */ | |
137 | u32 n_uid; /* 9p2000.u extensions */ | |
138 | u32 n_gid; /* 9p2000.u extensions */ | |
139 | u32 n_muid; /* 9p2000.u extensions */ | |
140 | }; | |
141 | ||
142 | /* file metadata (stat) structure used to create Twstat message | |
143 | The is similar to v9fs_stat, but the strings don't point to | |
144 | the same memory block and should be freed separately | |
145 | */ | |
146 | struct v9fs_wstat { | |
b8cf945b EVH |
147 | u16 size; |
148 | u16 type; | |
149 | u32 dev; | |
150 | struct v9fs_qid qid; | |
151 | u32 mode; | |
152 | u32 atime; | |
153 | u32 mtime; | |
154 | u64 length; | |
155 | char *name; | |
156 | char *uid; | |
157 | char *gid; | |
158 | char *muid; | |
159 | char *extension; /* 9p2000.u extensions */ | |
160 | u32 n_uid; /* 9p2000.u extensions */ | |
161 | u32 n_gid; /* 9p2000.u extensions */ | |
162 | u32 n_muid; /* 9p2000.u extensions */ | |
b8cf945b EVH |
163 | }; |
164 | ||
165 | /* Structures for Protocol Operations */ | |
166 | ||
167 | struct Tversion { | |
168 | u32 msize; | |
531b1094 | 169 | struct v9fs_str version; |
b8cf945b EVH |
170 | }; |
171 | ||
172 | struct Rversion { | |
173 | u32 msize; | |
531b1094 | 174 | struct v9fs_str version; |
b8cf945b EVH |
175 | }; |
176 | ||
177 | struct Tauth { | |
178 | u32 afid; | |
531b1094 LI |
179 | struct v9fs_str uname; |
180 | struct v9fs_str aname; | |
b8cf945b EVH |
181 | }; |
182 | ||
183 | struct Rauth { | |
184 | struct v9fs_qid qid; | |
185 | }; | |
186 | ||
187 | struct Rerror { | |
531b1094 | 188 | struct v9fs_str error; |
b8cf945b EVH |
189 | u32 errno; /* 9p2000.u extension */ |
190 | }; | |
191 | ||
192 | struct Tflush { | |
531b1094 | 193 | u16 oldtag; |
b8cf945b EVH |
194 | }; |
195 | ||
196 | struct Rflush { | |
197 | }; | |
198 | ||
199 | struct Tattach { | |
200 | u32 fid; | |
201 | u32 afid; | |
531b1094 LI |
202 | struct v9fs_str uname; |
203 | struct v9fs_str aname; | |
b8cf945b EVH |
204 | }; |
205 | ||
206 | struct Rattach { | |
207 | struct v9fs_qid qid; | |
208 | }; | |
209 | ||
210 | struct Twalk { | |
211 | u32 fid; | |
212 | u32 newfid; | |
531b1094 LI |
213 | u16 nwname; |
214 | struct v9fs_str wnames[16]; | |
b8cf945b EVH |
215 | }; |
216 | ||
217 | struct Rwalk { | |
531b1094 LI |
218 | u16 nwqid; |
219 | struct v9fs_qid wqids[16]; | |
b8cf945b EVH |
220 | }; |
221 | ||
222 | struct Topen { | |
223 | u32 fid; | |
224 | u8 mode; | |
225 | }; | |
226 | ||
227 | struct Ropen { | |
228 | struct v9fs_qid qid; | |
229 | u32 iounit; | |
230 | }; | |
231 | ||
232 | struct Tcreate { | |
233 | u32 fid; | |
531b1094 | 234 | struct v9fs_str name; |
b8cf945b EVH |
235 | u32 perm; |
236 | u8 mode; | |
16cce6d2 | 237 | struct v9fs_str extension; |
b8cf945b EVH |
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 | 350 | |
b8cf945b EVH |
351 | int v9fs_t_stat(struct v9fs_session_info *v9ses, u32 fid, |
352 | struct v9fs_fcall **rcall); | |
353 | ||
354 | int v9fs_t_wstat(struct v9fs_session_info *v9ses, u32 fid, | |
531b1094 | 355 | struct v9fs_wstat *wstat, struct v9fs_fcall **rcall); |
b8cf945b EVH |
356 | |
357 | int v9fs_t_walk(struct v9fs_session_info *v9ses, u32 fid, u32 newfid, | |
358 | char *name, struct v9fs_fcall **rcall); | |
359 | ||
360 | int v9fs_t_open(struct v9fs_session_info *v9ses, u32 fid, u8 mode, | |
361 | struct v9fs_fcall **rcall); | |
362 | ||
363 | int v9fs_t_remove(struct v9fs_session_info *v9ses, u32 fid, | |
364 | struct v9fs_fcall **rcall); | |
365 | ||
366 | int v9fs_t_create(struct v9fs_session_info *v9ses, u32 fid, char *name, | |
16cce6d2 | 367 | u32 perm, u8 mode, char *extension, struct v9fs_fcall **rcall); |
b8cf945b EVH |
368 | |
369 | int v9fs_t_read(struct v9fs_session_info *v9ses, u32 fid, | |
370 | u64 offset, u32 count, struct v9fs_fcall **rcall); | |
371 | ||
372 | int v9fs_t_write(struct v9fs_session_info *v9ses, u32 fid, u64 offset, | |
531b1094 LI |
373 | u32 count, const char __user * data, |
374 | struct v9fs_fcall **rcall); | |
5174fdab | 375 | int v9fs_printfcall(char *, int, struct v9fs_fcall *, int); |