]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/disk/kfs/ofcallfmt.c
merge
[plan9front.git] / sys / src / cmd / disk / kfs / ofcallfmt.c
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
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
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
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 }