1 #include "all.h"
2 #include "9p1.h"
3
4 static void dumpsome(char*, char*, long);
5 static void fdirconv(char*, Dentry*);
6
7 int
ofcallfmt(Fmt * f1)8 ofcallfmt(Fmt *f1)
9 {
10 char buf[512];
11 Oldfcall *f;
12 int fid, type, tag, n;
13 Dentry d;
14
15 f = va_arg(f1->args, Oldfcall*);
16 type = f->type;
17 fid = f->fid;
18 tag = f->tag;
19 switch(type){
20 case Tnop9p1: /* 50 */
21 sprint(buf, "Tnop9p1 tag %ud", tag);
22 break;
23 case Rnop9p1:
24 sprint(buf, "Rnop9p1 tag %ud", tag);
25 break;
26 case Tsession9p1: /* 52 */
27 sprint(buf, "Tsession9p1 tag %ud", tag);
28 break;
29 case Rsession9p1:
30 sprint(buf, "Rsession9p1 tag %ud", tag);
31 break;
32 case Rerror9p1: /* 55 */
33 sprint(buf, "Rerror9p1 tag %ud error %.64s", tag, f->ename);
34 break;
35 case Tflush9p1: /* 56 */
36 sprint(buf, "Tflush9p1 tag %ud oldtag %d", tag, f->oldtag);
37 break;
38 case Rflush9p1:
39 sprint(buf, "Rflush9p1 tag %ud", tag);
40 break;
41 case Tattach9p1: /* 58 */
42 sprint(buf, "Tattach9p1 tag %ud fid %d uname %.28s aname %.28s auth %.28s",
43 tag, f->fid, f->uname, f->aname, f->auth);
44 break;
45 case Rattach9p1:
46 sprint(buf, "Rattach9p1 tag %ud fid %d qid 0x%lux|0x%lux",
47 tag, fid, f->qid.path, f->qid.version);
48 break;
49 case Tclone9p1: /* 60 */
50 sprint(buf, "Tclone9p1 tag %ud fid %d newfid %d", tag, fid, f->newfid);
51 break;
52 case Rclone9p1:
53 sprint(buf, "Rclone9p1 tag %ud fid %d", tag, fid);
54 break;
55 case Twalk9p1: /* 62 */
56 sprint(buf, "Twalk9p1 tag %ud fid %d name %.28s", tag, fid, f->name);
57 break;
58 case Rwalk9p1:
59 sprint(buf, "Rwalk9p1 tag %ud fid %d qid 0x%lux|0x%lux",
60 tag, fid, f->qid.path, f->qid.version);
61 break;
62 case Topen9p1: /* 64 */
63 sprint(buf, "Topen9p1 tag %ud fid %d mode %d", tag, fid, f->mode);
64 break;
65 case Ropen9p1:
66 sprint(buf, "Ropen9p1 tag %ud fid %d qid 0x%lux|0x%lux",
67 tag, fid, f->qid.path, f->qid.version);
68 break;
69 case Tcreate9p1: /* 66 */
70 sprint(buf, "Tcreate9p1 tag %ud fid %d name %.28s perm 0x%lux mode %d",
71 tag, fid, f->name, f->perm, f->mode);
72 break;
73 case Rcreate9p1:
74 sprint(buf, "Rcreate9p1 tag %ud fid %d qid 0x%lux|0x%lux",
75 tag, fid, f->qid.path, f->qid.version);
76 break;
77 case Tread9p1: /* 68 */
78 sprint(buf, "Tread9p1 tag %ud fid %d offset %ld count %ld",
79 tag, fid, f->offset, f->count);
80 break;
81 case Rread9p1:
82 n = sprint(buf, "Rread9p1 tag %ud fid %d count %ld ", tag, fid, f->count);
83 dumpsome(buf+n, f->data, f->count);
84 break;
85 case Twrite9p1: /* 70 */
86 n = sprint(buf, "Twrite9p1 tag %ud fid %d offset %ld count %ld ",
87 tag, fid, f->offset, f->count);
88 dumpsome(buf+n, f->data, f->count);
89 break;
90 case Rwrite9p1:
91 sprint(buf, "Rwrite9p1 tag %ud fid %d count %ld", tag, fid, f->count);
92 break;
93 case Tclunk9p1: /* 72 */
94 sprint(buf, "Tclunk9p1 tag %ud fid %d", tag, fid);
95 break;
96 case Rclunk9p1:
97 sprint(buf, "Rclunk9p1 tag %ud fid %d", tag, fid);
98 break;
99 case Tremove9p1: /* 74 */
100 sprint(buf, "Tremove9p1 tag %ud fid %d", tag, fid);
101 break;
102 case Rremove9p1:
103 sprint(buf, "Rremove9p1 tag %ud fid %d", tag, fid);
104 break;
105 case Tstat9p1: /* 76 */
106 sprint(buf, "Tstat9p1 tag %ud fid %d", tag, fid);
107 break;
108 case Rstat9p1:
109 n = sprint(buf, "Rstat9p1 tag %ud fid %d", tag, fid);
110 convM2D9p1(f->stat, &d);
111 sprint(buf+n, " stat ");
112 fdirconv(buf+n+6, &d);
113 break;
114 case Twstat9p1: /* 78 */
115 convM2D9p1(f->stat, &d);
116 n = sprint(buf, "Twstat9p1 tag %ud fid %d stat ", tag, fid);
117 fdirconv(buf+n, &d);
118 break;
119 case Rwstat9p1:
120 sprint(buf, "Rwstat9p1 tag %ud fid %d", tag, fid);
121 break;
122 case Tclwalk9p1: /* 81 */
123 sprint(buf, "Tclwalk9p1 tag %ud fid %d newfid %d name %.28s",
124 tag, fid, f->newfid, f->name);
125 break;
126 case Rclwalk9p1:
127 sprint(buf, "Rclwalk9p1 tag %ud fid %d qid 0x%lux|0x%lux",
128 tag, fid, f->qid.path, f->qid.version);
129 break;
130 default:
131 sprint(buf, "unknown type %d", type);
132 }
133 return fmtstrcpy(f1, buf);
134 }
135
136 static void
fdirconv(char * buf,Dentry * d)137 fdirconv(char *buf, Dentry *d)
138 {
139 sprint(buf, "'%s' uid=%d gid=%d "
140 "q %lux|%lux m %uo "
141 "at %ld mt %ld l %ld ",
142 d->name, d->uid, d->gid,
143 d->qid.path, d->qid.version, d->mode,
144 d->atime, d->mtime, d->size);
145 }
146
147 /*
148 * dump out count (or DUMPL, if count is bigger) bytes from
149 * buf to ans, as a string if they are all printable,
150 * else as a series of hex bytes
151 */
152 #define DUMPL 24
153
154 static void
dumpsome(char * ans,char * buf,long count)155 dumpsome(char *ans, char *buf, long count)
156 {
157 int i, printable;
158 char *p;
159
160 printable = 1;
161 if(count > DUMPL)
162 count = DUMPL;
163 for(i=0; i<count && printable; i++)
164 if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127)
165 printable = 0;
166 p = ans;
167 *p++ = '\'';
168 if(printable){
169 memmove(p, buf, count);
170 p += count;
171 }else{
172 for(i=0; i<count; i++){
173 if(i>0 && i%4==0)
174 *p++ = ' ';
175 sprint(p, "%2.2ux", buf[i]);
176 p += 2;
177 }
178 }
179 *p++ = '\'';
180 *p = 0;
181 }
182