2 * linux/fs/9p/fcprint.c
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>
35 v9fs_printqid(char *buf
, int buflen
, struct v9fs_qid
*q
)
41 if (q
->type
& V9FS_QTDIR
)
43 if (q
->type
& V9FS_QTAPPEND
)
45 if (q
->type
& V9FS_QTAUTH
)
47 if (q
->type
& V9FS_QTEXCL
)
49 if (q
->type
& V9FS_QTTMP
)
51 if (q
->type
& V9FS_QTSYMLINK
)
55 return scnprintf(buf
, buflen
, "(%.16llx %x %s)", (long long int) q
->path
,
60 v9fs_printperm(char *buf
, int buflen
, int perm
)
66 if (perm
& V9FS_DMDIR
)
68 if (perm
& V9FS_DMAPPEND
)
70 if (perm
& V9FS_DMAUTH
)
72 if (perm
& V9FS_DMEXCL
)
74 if (perm
& V9FS_DMTMP
)
76 if (perm
& V9FS_DMDEVICE
)
78 if (perm
& V9FS_DMSOCKET
)
80 if (perm
& V9FS_DMNAMEDPIPE
)
82 if (perm
& V9FS_DMSYMLINK
)
86 return scnprintf(buf
, buflen
, "%s%03o", b
, perm
&077);
90 v9fs_printstat(char *buf
, int buflen
, struct v9fs_stat
*st
, int extended
)
94 n
= scnprintf(buf
, buflen
, "'%.*s' '%.*s'", st
->name
.len
,
95 st
->name
.str
, st
->uid
.len
, st
->uid
.str
);
97 n
+= scnprintf(buf
+n
, buflen
-n
, "(%d)", st
->n_uid
);
99 n
+= scnprintf(buf
+n
, buflen
-n
, " '%.*s'", st
->gid
.len
, st
->gid
.str
);
101 n
+= scnprintf(buf
+n
, buflen
-n
, "(%d)", st
->n_gid
);
103 n
+= scnprintf(buf
+n
, buflen
-n
, " '%.*s'", st
->muid
.len
, st
->muid
.str
);
105 n
+= scnprintf(buf
+n
, buflen
-n
, "(%d)", st
->n_muid
);
107 n
+= scnprintf(buf
+n
, buflen
-n
, " q ");
108 n
+= v9fs_printqid(buf
+n
, buflen
-n
, &st
->qid
);
109 n
+= scnprintf(buf
+n
, buflen
-n
, " m ");
110 n
+= v9fs_printperm(buf
+n
, buflen
-n
, st
->mode
);
111 n
+= scnprintf(buf
+n
, buflen
-n
, " at %d mt %d l %lld",
112 st
->atime
, st
->mtime
, (long long int) st
->length
);
115 n
+= scnprintf(buf
+n
, buflen
-n
, " ext '%.*s'",
116 st
->extension
.len
, st
->extension
.str
);
122 v9fs_dumpdata(char *buf
, int buflen
, u8
*data
, int datalen
)
127 while (i
< datalen
) {
128 n
+= scnprintf(buf
+ n
, buflen
- n
, "%02x", data
[i
]);
130 n
+= scnprintf(buf
+ n
, buflen
- n
, " ");
132 n
+= scnprintf(buf
+ n
, buflen
- n
, "\n");
136 n
+= scnprintf(buf
+ n
, buflen
- n
, "\n");
142 v9fs_printdata(char *buf
, int buflen
, u8
*data
, int datalen
)
144 return v9fs_dumpdata(buf
, buflen
, data
, datalen
<16?datalen
:16);
148 v9fs_printfcall(char *buf
, int buflen
, struct v9fs_fcall
*fc
, int extended
)
150 int i
, ret
, type
, tag
;
153 return scnprintf(buf
, buflen
, "<NULL>");
161 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
162 "Tversion tag %u msize %u version '%.*s'", tag
,
163 fc
->params
.tversion
.msize
, fc
->params
.tversion
.version
.len
,
164 fc
->params
.tversion
.version
.str
);
168 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
169 "Rversion tag %u msize %u version '%.*s'", tag
,
170 fc
->params
.rversion
.msize
, fc
->params
.rversion
.version
.len
,
171 fc
->params
.rversion
.version
.str
);
175 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
176 "Tauth tag %u afid %d uname '%.*s' aname '%.*s'", tag
,
177 fc
->params
.tauth
.afid
, fc
->params
.tauth
.uname
.len
,
178 fc
->params
.tauth
.uname
.str
, fc
->params
.tauth
.aname
.len
,
179 fc
->params
.tauth
.aname
.str
);
183 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rauth tag %u qid ", tag
);
184 v9fs_printqid(buf
+ret
, buflen
-ret
, &fc
->params
.rauth
.qid
);
188 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
189 "Tattach tag %u fid %d afid %d uname '%.*s' aname '%.*s'",
190 tag
, fc
->params
.tattach
.fid
, fc
->params
.tattach
.afid
,
191 fc
->params
.tattach
.uname
.len
, fc
->params
.tattach
.uname
.str
,
192 fc
->params
.tattach
.aname
.len
, fc
->params
.tattach
.aname
.str
);
196 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rattach tag %u qid ", tag
);
197 v9fs_printqid(buf
+ret
, buflen
-ret
, &fc
->params
.rattach
.qid
);
201 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rerror tag %u ename '%.*s'",
202 tag
, fc
->params
.rerror
.error
.len
,
203 fc
->params
.rerror
.error
.str
);
205 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " ecode %d\n",
206 fc
->params
.rerror
.errno
);
210 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tflush tag %u oldtag %u",
211 tag
, fc
->params
.tflush
.oldtag
);
215 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rflush tag %u", tag
);
219 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
220 "Twalk tag %u fid %d newfid %d nwname %d", tag
,
221 fc
->params
.twalk
.fid
, fc
->params
.twalk
.newfid
,
222 fc
->params
.twalk
.nwname
);
223 for(i
= 0; i
< fc
->params
.twalk
.nwname
; i
++)
224 ret
+= scnprintf(buf
+ret
, buflen
-ret
," '%.*s'",
225 fc
->params
.twalk
.wnames
[i
].len
,
226 fc
->params
.twalk
.wnames
[i
].str
);
230 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rwalk tag %u nwqid %d",
231 tag
, fc
->params
.rwalk
.nwqid
);
232 for(i
= 0; i
< fc
->params
.rwalk
.nwqid
; i
++)
233 ret
+= v9fs_printqid(buf
+ret
, buflen
-ret
,
234 &fc
->params
.rwalk
.wqids
[i
]);
238 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
239 "Topen tag %u fid %d mode %d", tag
,
240 fc
->params
.topen
.fid
, fc
->params
.topen
.mode
);
244 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Ropen tag %u", tag
);
245 ret
+= v9fs_printqid(buf
+ret
, buflen
-ret
, &fc
->params
.ropen
.qid
);
246 ret
+= scnprintf(buf
+ret
, buflen
-ret
," iounit %d",
247 fc
->params
.ropen
.iounit
);
251 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
252 "Tcreate tag %u fid %d name '%.*s' perm ", tag
,
253 fc
->params
.tcreate
.fid
, fc
->params
.tcreate
.name
.len
,
254 fc
->params
.tcreate
.name
.str
);
256 ret
+= v9fs_printperm(buf
+ret
, buflen
-ret
, fc
->params
.tcreate
.perm
);
257 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " mode %d",
258 fc
->params
.tcreate
.mode
);
262 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rcreate tag %u", tag
);
263 ret
+= v9fs_printqid(buf
+ret
, buflen
-ret
, &fc
->params
.rcreate
.qid
);
264 ret
+= scnprintf(buf
+ret
, buflen
-ret
, " iounit %d",
265 fc
->params
.rcreate
.iounit
);
269 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
270 "Tread tag %u fid %d offset %lld count %u", tag
,
271 fc
->params
.tread
.fid
,
272 (long long int) fc
->params
.tread
.offset
,
273 fc
->params
.tread
.count
);
277 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
278 "Rread tag %u count %u data ", tag
,
279 fc
->params
.rread
.count
);
280 ret
+= v9fs_printdata(buf
+ret
, buflen
-ret
, fc
->params
.rread
.data
,
281 fc
->params
.rread
.count
);
285 ret
+= scnprintf(buf
+ret
, buflen
-ret
,
286 "Twrite tag %u fid %d offset %lld count %u data ",
287 tag
, fc
->params
.twrite
.fid
,
288 (long long int) fc
->params
.twrite
.offset
,
289 fc
->params
.twrite
.count
);
290 ret
+= v9fs_printdata(buf
+ret
, buflen
-ret
, fc
->params
.twrite
.data
,
291 fc
->params
.twrite
.count
);
295 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rwrite tag %u count %u",
296 tag
, fc
->params
.rwrite
.count
);
300 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tclunk tag %u fid %d",
301 tag
, fc
->params
.tclunk
.fid
);
305 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rclunk tag %u", tag
);
309 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tremove tag %u fid %d",
310 tag
, fc
->params
.tremove
.fid
);
314 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rremove tag %u", tag
);
318 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Tstat tag %u fid %d",
319 tag
, fc
->params
.tstat
.fid
);
323 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rstat tag %u ", tag
);
324 ret
+= v9fs_printstat(buf
+ret
, buflen
-ret
, &fc
->params
.rstat
.stat
,
329 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Twstat tag %u fid %d ",
330 tag
, fc
->params
.twstat
.fid
);
331 ret
+= v9fs_printstat(buf
+ret
, buflen
-ret
, &fc
->params
.twstat
.stat
,
336 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "Rwstat tag %u", tag
);
340 ret
+= scnprintf(buf
+ret
, buflen
-ret
, "unknown type %d", type
);