2 * Copyright (C) 2006 by Latchesar Ionkov <lucho@ionkov.net>
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * LATCHESAR IONKOV AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
31 sp_printperm(FILE *f
, int perm
)
51 if (perm
& Dmnamedpipe
)
57 return fprintf(f
, "%s%03o", b
, perm
&0777);
61 sp_printqid(FILE *f
, Spqid
*q
)
69 if (q
->type
& Qtappend
)
77 if (q
->type
& Qtsymlink
)
81 return fprintf(f
, " (%.16llx %x '%s')", (unsigned long long)q
->path
, q
->version
, buf
);
85 sp_printstat(FILE *f
, Spstat
*st
, int dotu
)
89 n
= fprintf(f
, "'%.*s' '%.*s' '%.*s' '%.*s' q ",
90 st
->name
.len
, st
->name
.str
, st
->uid
.len
, st
->uid
.str
,
91 st
->gid
.len
, st
->gid
.str
, st
->muid
.len
, st
->muid
.str
);
93 n
+= sp_printqid(f
, &st
->qid
);
94 n
+= fprintf(f
, " m ");
95 n
+= sp_printperm(f
, st
->mode
);
96 n
+= fprintf(f
, " at %d mt %d l %llu t %d d %d",
97 st
->atime
, st
->mtime
, (unsigned long long)st
->length
, st
->type
, st
->dev
);
99 n
+= fprintf(f
, " ext '%.*s'", st
->extension
.len
,
106 sp_dump(FILE *f
, u8
*data
, int datalen
)
111 while (i
< datalen
) {
112 n
+= fprintf(f
, "%02x", data
[i
]);
114 n
+= fprintf(f
, " ");
116 n
+= fprintf(f
, "\n");
120 n
+= fprintf(f
, "\n");
126 sp_printdata(FILE *f
, u8
*buf
, int buflen
)
128 return sp_dump(f
, buf
, buflen
<64?buflen
:64);
132 sp_dumpdata(u8
*buf
, int buflen
)
134 return sp_dump(stderr
, buf
, buflen
);
138 sp_printfcall(FILE *f
, Spfcall
*fc
, int dotu
)
140 int i
, ret
, type
, fid
, tag
;
143 return fprintf(f
, "NULL");
152 ret
+= fprintf(f
, "Tversion tag %u msize %u version '%.*s'",
153 tag
, fc
->msize
, fc
->version
.len
, fc
->version
.str
);
157 ret
+= fprintf(f
, "Rversion tag %u msize %u version '%.*s'",
158 tag
, fc
->msize
, fc
->version
.len
, fc
->version
.str
);
162 ret
+= fprintf(f
, "Tauth tag %u afid %d uname %.*s aname %.*s",
163 tag
, fc
->afid
, fc
->uname
.len
, fc
->uname
.str
,
164 fc
->aname
.len
, fc
->aname
.str
);
166 ret
+= fprintf(f
, " nuname %d", fc
->n_uname
);
170 ret
+= fprintf(f
, "Rauth tag %u qid ", tag
);
171 sp_printqid(f
, &fc
->qid
);
175 ret
+= fprintf(f
, "Tattach tag %u fid %d afid %d uname %.*s aname %.*s",
176 tag
, fid
, fc
->afid
, fc
->uname
.len
, fc
->uname
.str
,
177 fc
->aname
.len
, fc
->aname
.str
);
179 ret
+= fprintf(f
, " nuname %d", fc
->n_uname
);
183 ret
+= fprintf(f
, "Rattach tag %u qid ", tag
);
184 sp_printqid(f
, &fc
->qid
);
188 ret
+= fprintf(f
, "Rerror tag %u ename %.*s", tag
,
189 fc
->ename
.len
, fc
->ename
.str
);
191 ret
+= fprintf(f
, " ecode %d", fc
->ecode
);
195 ret
+= fprintf(f
, "Tflush tag %u oldtag %u", tag
, fc
->oldtag
);
199 ret
+= fprintf(f
, "Rflush tag %u", tag
);
203 ret
+= fprintf(f
, "Twalk tag %u fid %d newfid %d nwname %d",
204 tag
, fid
, fc
->newfid
, fc
->nwname
);
205 for(i
= 0; i
< fc
->nwname
; i
++)
206 ret
+= fprintf(f
, " '%.*s'", fc
->wnames
[i
].len
,
211 ret
+= fprintf(f
, "Rwalk tag %u nwqid %d", tag
, fc
->nwqid
);
212 for(i
= 0; i
< fc
->nwqid
; i
++)
213 ret
+= sp_printqid(f
, &fc
->wqids
[i
]);
217 ret
+= fprintf(f
, "Topen tag %u fid %d mode %d", tag
, fid
,
222 ret
+= fprintf(f
, "Ropen tag %u", tag
);
223 ret
+= sp_printqid(f
, &fc
->qid
);
224 ret
+= fprintf(f
, " iounit %d", fc
->iounit
);
228 ret
+= fprintf(f
, "Tcreate tag %u fid %d name %.*s perm ",
229 tag
, fid
, fc
->name
.len
, fc
->name
.str
);
230 ret
+= sp_printperm(f
, fc
->perm
);
231 ret
+= fprintf(f
, " mode %d", fc
->mode
);
233 ret
+= fprintf(f
, " ext %.*s", fc
->extension
.len
,
238 ret
+= fprintf(f
, "Rcreate tag %u", tag
);
239 ret
+= sp_printqid(f
, &fc
->qid
);
240 ret
+= fprintf(f
, " iounit %d", fc
->iounit
);
244 ret
+= fprintf(f
, "Tread tag %u fid %d offset %llu count %u",
245 tag
, fid
, (unsigned long long)fc
->offset
, fc
->count
);
249 ret
+= fprintf(f
, "Rread tag %u count %u data ", tag
, fc
->count
);
250 ret
+= sp_printdata(f
, fc
->data
, fc
->count
);
254 ret
+= fprintf(f
, "Twrite tag %u fid %d offset %llu count %u data ",
255 tag
, fid
, (unsigned long long)fc
->offset
, fc
->count
);
256 ret
+= sp_printdata(f
, fc
->data
, fc
->count
);
260 ret
+= fprintf(f
, "Rwrite tag %u count %u", tag
, fc
->count
);
264 ret
+= fprintf(f
, "Tclunk tag %u fid %d", tag
, fid
);
268 ret
+= fprintf(f
, "Rclunk tag %u", tag
);
272 ret
+= fprintf(f
, "Tremove tag %u fid %d", tag
, fid
);
276 ret
+= fprintf(f
, "Rremove tag %u", tag
);
280 ret
+= fprintf(f
, "Tstat tag %u fid %d", tag
, fid
);
284 ret
+= fprintf(f
, "Rstat tag %u ", tag
);
285 ret
+= sp_printstat(f
, &fc
->stat
, dotu
);
289 ret
+= fprintf(f
, "Twstat tag %u fid %d ", tag
, fid
);
290 ret
+= sp_printstat(f
, &fc
->stat
, dotu
);
294 ret
+= fprintf(f
, "Rwstat tag %u", tag
);
298 ret
+= fprintf(f
, "unknown type %d", type
);