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 } 182