xref: /plan9/sys/src/cmd/disk/kfs/ofcallfmt.c (revision 22a127bbfe4dd304949cc596400de973c0138e31)
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