6 * Copyright (C) 2005 by Latchesar Ionkov <lucho@ionkov.net>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2
10 * as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to:
19 * Free Software Foundation
20 * 51 Franklin Street, Fifth Floor
21 * Boston, MA 02111-1301 USA
24 #include <linux/module.h>
25 #include <linux/errno.h>
27 #include <linux/idr.h>
28 #include <net/9p/9p.h>
30 #ifdef CONFIG_NET_9P_DEBUG
33 p9_printqid(char *buf
, int buflen
, struct p9_qid
*q
)
39 if (q
->type
& P9_QTDIR
)
41 if (q
->type
& P9_QTAPPEND
)
43 if (q
->type
& P9_QTAUTH
)
45 if (q
->type
& P9_QTEXCL
)
47 if (q
->type
& P9_QTTMP
)
49 if (q
->type
& P9_QTSYMLINK
)
53 return scnprintf(buf
, buflen
, "(%.16llx %x %s)",
54 (long long int) q
->path
, q
->version
, b
);
58 p9_printperm(char *buf
, int buflen
, int perm
)
66 if (perm
& P9_DMAPPEND
)
74 if (perm
& P9_DMDEVICE
)
76 if (perm
& P9_DMSOCKET
)
78 if (perm
& P9_DMNAMEDPIPE
)
80 if (perm
& P9_DMSYMLINK
)
84 return scnprintf(buf
, buflen
, "%s%03o", b
, perm
&077);
88 p9_printstat(char *buf
, int buflen
, struct p9_stat
*st
, int extended
)
92 n
= scnprintf(buf
, buflen
, "'%.*s' '%.*s'", st
->name
.len
,
93 st
->name
.str
, st
->uid
.len
, st
->uid
.str
);
95 n
+= scnprintf(buf
+n
, buflen
-n
, "(%d)", st
->n_uid
);
97 n
+= scnprintf(buf
+n
, buflen
-n
, " '%.*s'", st
->gid
.len
, st
->gid
.str
);
99 n
+= scnprintf(buf
+n
, buflen
-n
, "(%d)", st
->n_gid
);
101 n
+= scnprintf(buf
+n
, buflen
-n
, " '%.*s'", st
->muid
.len
, st
->muid
.str
);
103 n
+= scnprintf(buf
+n
, buflen
-n
, "(%d)", st
->n_muid
);
105 n
+= scnprintf(buf
+n
, buflen
-n
, " q ");
106 n
+= p9_printqid(buf
+n
, buflen
-n
, &st
->qid
);
107 n
+= scnprintf(buf
+n
, buflen
-n
, " m ");
108 n
+= p9_printperm(buf
+n
, buflen
-n
, st
->mode
);
109 n
+= scnprintf(buf
+n
, buflen
-n
, " at %d mt %d l %lld",
110 st
->atime
, st
->mtime
, (long long int) st
->length
);
113 n
+= scnprintf(buf
+n
, buflen
-n
, " ext '%.*s'",
114 st
->extension
.len
, st
->extension
.str
);
120 p9_dumpdata(char *buf
, int buflen
, u8
*data
, int datalen
)
125 while (i
< datalen
) {
126 n
+= scnprintf(buf
+ n
, buflen
- n
, "%02x", data
[i
]);
128 n
+= scnprintf(buf
+ n
, buflen
- n
, " ");
130 n
+= scnprintf(buf
+ n
, buflen
- n
, "\n");
134 n
+= scnprintf(buf
+ n
, buflen
- n
, "\n");
140 p9_printdata(char *buf
, int buflen
, u8
*data
, int datalen
)
142 return p9_dumpdata(buf
, buflen
, data
, datalen
< 16?datalen
:16);
146 * p9_printfcall - decode and print a protocol structure into a buffer
147 * @buf: buffer to deposit decoded structure into
148 * @buflen: available space in buffer
149 * @fc: protocol rpc structure of type &p9_fcall
150 * @extended: whether or not session is operating with extended protocol
154 p9_printfcall(char *buf
, int buflen
, struct p9_fcall
*fc
, int extended
)
156 int i
, ret
, type
, tag
;
159 return scnprintf(buf
, buflen
, "<NULL>");
167 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
168 "Tversion tag %u msize %u version '%.*s'", tag
,
169 fc
->params
.tversion
.msize
,
170 fc
->params
.tversion
.version
.len
,
171 fc
->params
.tversion
.version
.str
);
175 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
176 "Rversion tag %u msize %u version '%.*s'", tag
,
177 fc
->params
.rversion
.msize
,
178 fc
->params
.rversion
.version
.len
,
179 fc
->params
.rversion
.version
.str
);
183 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
184 "Tauth tag %u afid %d uname '%.*s' aname '%.*s'", tag
,
185 fc
->params
.tauth
.afid
, fc
->params
.tauth
.uname
.len
,
186 fc
->params
.tauth
.uname
.str
, fc
->params
.tauth
.aname
.len
,
187 fc
->params
.tauth
.aname
.str
);
191 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rauth tag %u qid ", tag
);
192 p9_printqid(buf
+ret
, buflen
-ret
, &fc
->params
.rauth
.qid
);
196 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
197 "Tattach tag %u fid %d afid %d uname '%.*s' aname '%.*s'", tag
,
198 fc
->params
.tattach
.fid
, fc
->params
.tattach
.afid
,
199 fc
->params
.tattach
.uname
.len
, fc
->params
.tattach
.uname
.str
,
200 fc
->params
.tattach
.aname
.len
, fc
->params
.tattach
.aname
.str
);
204 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rattach tag %u qid ",
206 p9_printqid(buf
+ret
, buflen
-ret
, &fc
->params
.rattach
.qid
);
210 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
211 "Rerror tag %u ename '%.*s'", tag
,
212 fc
->params
.rerror
.error
.len
,
213 fc
->params
.rerror
.error
.str
);
215 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " ecode %d\n",
216 fc
->params
.rerror
.errno
);
220 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tflush tag %u oldtag %u",
221 tag
, fc
->params
.tflush
.oldtag
);
225 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rflush tag %u", tag
);
229 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
230 "Twalk tag %u fid %d newfid %d nwname %d", tag
,
231 fc
->params
.twalk
.fid
, fc
->params
.twalk
.newfid
,
232 fc
->params
.twalk
.nwname
);
233 for (i
= 0; i
< fc
->params
.twalk
.nwname
; i
++)
234 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " '%.*s'",
235 fc
->params
.twalk
.wnames
[i
].len
,
236 fc
->params
.twalk
.wnames
[i
].str
);
240 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rwalk tag %u nwqid %d",
241 tag
, fc
->params
.rwalk
.nwqid
);
242 for (i
= 0; i
< fc
->params
.rwalk
.nwqid
; i
++)
243 ret
+= p9_printqid(buf
+ret
, buflen
-ret
,
244 &fc
->params
.rwalk
.wqids
[i
]);
248 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
249 "Topen tag %u fid %d mode %d", tag
,
250 fc
->params
.topen
.fid
, fc
->params
.topen
.mode
);
254 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Ropen tag %u", tag
);
255 ret
+= p9_printqid(buf
+ret
, buflen
-ret
, &fc
->params
.ropen
.qid
);
256 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " iounit %d",
257 fc
->params
.ropen
.iounit
);
261 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
262 "Tcreate tag %u fid %d name '%.*s' perm ", tag
,
263 fc
->params
.tcreate
.fid
, fc
->params
.tcreate
.name
.len
,
264 fc
->params
.tcreate
.name
.str
);
266 ret
+= p9_printperm(buf
+ret
, buflen
-ret
,
267 fc
->params
.tcreate
.perm
);
268 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " mode %d",
269 fc
->params
.tcreate
.mode
);
273 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rcreate tag %u", tag
);
274 ret
+= p9_printqid(buf
+ret
, buflen
-ret
,
275 &fc
->params
.rcreate
.qid
);
276 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " iounit %d",
277 fc
->params
.rcreate
.iounit
);
281 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
282 "Tread tag %u fid %d offset %lld count %u", tag
,
283 fc
->params
.tread
.fid
,
284 (long long int) fc
->params
.tread
.offset
,
285 fc
->params
.tread
.count
);
289 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
290 "Rread tag %u count %u data ", tag
,
291 fc
->params
.rread
.count
);
292 ret
+= p9_printdata(buf
+ret
, buflen
-ret
, fc
->params
.rread
.data
,
293 fc
->params
.rread
.count
);
297 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
298 "Twrite tag %u fid %d offset %lld count %u data ",
299 tag
, fc
->params
.twrite
.fid
,
300 (long long int) fc
->params
.twrite
.offset
,
301 fc
->params
.twrite
.count
);
302 ret
+= p9_printdata(buf
+ret
, buflen
-ret
, fc
->params
.twrite
.data
,
303 fc
->params
.twrite
.count
);
307 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rwrite tag %u count %u",
308 tag
, fc
->params
.rwrite
.count
);
312 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tclunk tag %u fid %d",
313 tag
, fc
->params
.tclunk
.fid
);
317 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rclunk tag %u", tag
);
321 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tremove tag %u fid %d",
322 tag
, fc
->params
.tremove
.fid
);
326 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rremove tag %u", tag
);
330 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tstat tag %u fid %d",
331 tag
, fc
->params
.tstat
.fid
);
335 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rstat tag %u ", tag
);
336 ret
+= p9_printstat(buf
+ret
, buflen
-ret
, &fc
->params
.rstat
.stat
,
341 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Twstat tag %u fid %d ",
342 tag
, fc
->params
.twstat
.fid
);
343 ret
+= p9_printstat(buf
+ret
, buflen
-ret
,
344 &fc
->params
.twstat
.stat
, extended
);
348 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rwstat tag %u", tag
);
352 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "unknown type %d", type
);
360 p9_printfcall(char *buf
, int buflen
, struct p9_fcall
*fc
, int extended
)
364 #endif /* CONFIG_NET_9P_DEBUG */
365 EXPORT_SYMBOL(p9_printfcall
);