19a747e4fSDavid du Colombier #include <plan9.h> 29a747e4fSDavid du Colombier #include <fcall.h> 39a747e4fSDavid du Colombier #include <oldfcall.h> 49a747e4fSDavid du Colombier 59a747e4fSDavid du Colombier extern int old9p; 69a747e4fSDavid du Colombier 79a747e4fSDavid du Colombier static uint dumpsome(char*, char*, long); 89a747e4fSDavid du Colombier static void fdirconv(char*, Dir*); 99a747e4fSDavid du Colombier static char *qidtype(char*, uchar); 109a747e4fSDavid du Colombier 119a747e4fSDavid du Colombier #define QIDFMT "(%.16llux %lud %s)" 129a747e4fSDavid du Colombier 139a747e4fSDavid du Colombier int 149a747e4fSDavid du Colombier fcallconv(va_list *arg, Fconv *f1) 159a747e4fSDavid du Colombier { 169a747e4fSDavid du Colombier Fcall *f; 179a747e4fSDavid du Colombier int fid, type, tag, n, i; 189a747e4fSDavid du Colombier char buf[512], tmp[200]; 199a747e4fSDavid du Colombier Dir *d; 209a747e4fSDavid du Colombier Qid *q; 219a747e4fSDavid du Colombier 229a747e4fSDavid du Colombier f = va_arg(*arg, Fcall*); 239a747e4fSDavid du Colombier type = f->type; 249a747e4fSDavid du Colombier fid = f->fid; 259a747e4fSDavid du Colombier tag = f->tag; 269a747e4fSDavid du Colombier switch(type){ 279a747e4fSDavid du Colombier case Tversion: /* 100 */ 289a747e4fSDavid du Colombier sprint(buf, "Tversion tag %ud msize %ud version '%s'", tag, f->msize, f->version); 299a747e4fSDavid du Colombier break; 309a747e4fSDavid du Colombier case Rversion: 319a747e4fSDavid du Colombier sprint(buf, "Rversion tag %ud msize %ud version '%s'", tag, f->msize, f->version); 329a747e4fSDavid du Colombier break; 339a747e4fSDavid du Colombier case Tauth: /* 102 */ 349a747e4fSDavid du Colombier sprint(buf, "Tauth tag %ud afid %d uname %s aname %s", tag, 359a747e4fSDavid du Colombier f->afid, f->uname, f->aname); 369a747e4fSDavid du Colombier break; 379a747e4fSDavid du Colombier case Rauth: 389a747e4fSDavid du Colombier sprint(buf, "Rauth tag %ud qid " QIDFMT, tag, 399a747e4fSDavid du Colombier f->aqid.path, f->aqid.vers, qidtype(tmp, f->aqid.type)); 409a747e4fSDavid du Colombier break; 419a747e4fSDavid du Colombier case Tattach: /* 104 */ 429a747e4fSDavid du Colombier sprint(buf, "Tattach tag %ud fid %d afid %d uname %s aname %s", tag, 439a747e4fSDavid du Colombier fid, f->afid, f->uname, f->aname); 449a747e4fSDavid du Colombier break; 459a747e4fSDavid du Colombier case Rattach: 469a747e4fSDavid du Colombier sprint(buf, "Rattach tag %ud qid " QIDFMT, tag, 479a747e4fSDavid du Colombier f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type)); 489a747e4fSDavid du Colombier break; 499a747e4fSDavid du Colombier case Rerror: /* 107; 106 (Terror) illegal */ 509a747e4fSDavid du Colombier sprint(buf, "Rerror tag %ud ename %s", tag, f->ename); 519a747e4fSDavid du Colombier break; 529a747e4fSDavid du Colombier case Tflush: /* 108 */ 539a747e4fSDavid du Colombier sprint(buf, "Tflush tag %ud oldtag %ud", tag, f->oldtag); 549a747e4fSDavid du Colombier break; 559a747e4fSDavid du Colombier case Rflush: 569a747e4fSDavid du Colombier sprint(buf, "Rflush tag %ud", tag); 579a747e4fSDavid du Colombier break; 589a747e4fSDavid du Colombier case Twalk: /* 110 */ 599a747e4fSDavid du Colombier n = sprint(buf, "Twalk tag %ud fid %d newfid %d nwname %d ", tag, fid, f->newfid, f->nwname); 609a747e4fSDavid du Colombier for(i=0; i<f->nwname; i++) 619a747e4fSDavid du Colombier n += sprint(buf+n, "%d:%s ", i, f->wname[i]); 629a747e4fSDavid du Colombier break; 639a747e4fSDavid du Colombier case Rwalk: 649a747e4fSDavid du Colombier n = sprint(buf, "Rwalk tag %ud nwqid %ud ", tag, f->nwqid); 659a747e4fSDavid du Colombier for(i=0; i<f->nwqid; i++){ 669a747e4fSDavid du Colombier q = &f->wqid[i]; 679a747e4fSDavid du Colombier n += sprint(buf+n, "%d:" QIDFMT " ", i, 689a747e4fSDavid du Colombier q->path, q->vers, qidtype(tmp, q->type)); 699a747e4fSDavid du Colombier } 709a747e4fSDavid du Colombier break; 719a747e4fSDavid du Colombier case Topen: /* 112 */ 729a747e4fSDavid du Colombier sprint(buf, "Topen tag %ud fid %ud mode %d", tag, fid, f->mode); 739a747e4fSDavid du Colombier break; 749a747e4fSDavid du Colombier case Ropen: 759a747e4fSDavid du Colombier sprint(buf, "Ropen tag %ud qid " QIDFMT " iounit %ud ", tag, 769a747e4fSDavid du Colombier f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit); 779a747e4fSDavid du Colombier break; 789a747e4fSDavid du Colombier case Tcreate: /* 114 */ 799a747e4fSDavid du Colombier sprint(buf, "Tcreate tag %ud fid %ud perm %M mode %d", tag, fid, (ulong)f->perm, f->mode); 809a747e4fSDavid du Colombier break; 819a747e4fSDavid du Colombier case Rcreate: 829a747e4fSDavid du Colombier sprint(buf, "Rcreate tag %ud qid " QIDFMT " iounit %ud ", tag, 839a747e4fSDavid du Colombier f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit); 849a747e4fSDavid du Colombier break; 859a747e4fSDavid du Colombier case Tread: /* 116 */ 869a747e4fSDavid du Colombier sprint(buf, "Tread tag %ud fid %d offset %lld count %ud", 879a747e4fSDavid du Colombier tag, fid, f->offset, f->count); 889a747e4fSDavid du Colombier break; 899a747e4fSDavid du Colombier case Rread: 909a747e4fSDavid du Colombier n = sprint(buf, "Rread tag %ud count %ud ", tag, f->count); 919a747e4fSDavid du Colombier dumpsome(buf+n, f->data, f->count); 929a747e4fSDavid du Colombier break; 939a747e4fSDavid du Colombier case Twrite: /* 118 */ 949a747e4fSDavid du Colombier n = sprint(buf, "Twrite tag %ud fid %d offset %lld count %ud ", 959a747e4fSDavid du Colombier tag, fid, f->offset, f->count); 969a747e4fSDavid du Colombier dumpsome(buf+n, f->data, f->count); 979a747e4fSDavid du Colombier break; 989a747e4fSDavid du Colombier case Rwrite: 999a747e4fSDavid du Colombier sprint(buf, "Rwrite tag %ud count %ud", tag, f->count); 1009a747e4fSDavid du Colombier break; 1019a747e4fSDavid du Colombier case Tclunk: /* 120 */ 1029a747e4fSDavid du Colombier sprint(buf, "Tclunk tag %ud fid %ud", tag, fid); 1039a747e4fSDavid du Colombier break; 1049a747e4fSDavid du Colombier case Rclunk: 1059a747e4fSDavid du Colombier sprint(buf, "Rclunk tag %ud", tag); 1069a747e4fSDavid du Colombier break; 1079a747e4fSDavid du Colombier case Tremove: /* 122 */ 1089a747e4fSDavid du Colombier sprint(buf, "Tremove tag %ud fid %ud", tag, fid); 1099a747e4fSDavid du Colombier break; 1109a747e4fSDavid du Colombier case Rremove: 1119a747e4fSDavid du Colombier sprint(buf, "Rremove tag %ud", tag); 1129a747e4fSDavid du Colombier break; 1139a747e4fSDavid du Colombier case Tstat: /* 124 */ 1149a747e4fSDavid du Colombier sprint(buf, "Tstat tag %ud fid %ud", tag, fid); 1159a747e4fSDavid du Colombier break; 1169a747e4fSDavid du Colombier case Rstat: 1179a747e4fSDavid du Colombier n = sprint(buf, "Rstat tag %ud ", tag); 1189a747e4fSDavid du Colombier if(f->nstat > sizeof tmp) 1199a747e4fSDavid du Colombier sprint(buf+n, " stat(%d bytes)", f->nstat); 1209a747e4fSDavid du Colombier else{ 1219a747e4fSDavid du Colombier d = (Dir*)tmp; 1229a747e4fSDavid du Colombier (old9p?convM2Dold:convM2D)(f->stat, f->nstat, d, (char*)(d+1)); 1239a747e4fSDavid du Colombier sprint(buf+n, " stat "); 1249a747e4fSDavid du Colombier fdirconv(buf+n+6, d); 1259a747e4fSDavid du Colombier } 1269a747e4fSDavid du Colombier break; 1279a747e4fSDavid du Colombier case Twstat: /* 126 */ 1289a747e4fSDavid du Colombier n = sprint(buf, "Twstat tag %ud fid %ud", tag, fid); 1299a747e4fSDavid du Colombier if(f->nstat > sizeof tmp) 1309a747e4fSDavid du Colombier sprint(buf+n, " stat(%d bytes)", f->nstat); 1319a747e4fSDavid du Colombier else{ 1329a747e4fSDavid du Colombier d = (Dir*)tmp; 1339a747e4fSDavid du Colombier (old9p?convM2Dold:convM2D)(f->stat, f->nstat, d, (char*)(d+1)); 1349a747e4fSDavid du Colombier sprint(buf+n, " stat "); 1359a747e4fSDavid du Colombier fdirconv(buf+n+6, d); 1369a747e4fSDavid du Colombier } 1379a747e4fSDavid du Colombier break; 1389a747e4fSDavid du Colombier case Rwstat: 1399a747e4fSDavid du Colombier sprint(buf, "Rwstat tag %ud", tag); 1409a747e4fSDavid du Colombier break; 1419a747e4fSDavid du Colombier default: 1429a747e4fSDavid du Colombier sprint(buf, "unknown type %d", type); 1439a747e4fSDavid du Colombier } 1449a747e4fSDavid du Colombier strconv(buf, f1); 1459a747e4fSDavid du Colombier return(sizeof(Fcall*)); 1469a747e4fSDavid du Colombier } 1479a747e4fSDavid du Colombier 1489a747e4fSDavid du Colombier static char* 1499a747e4fSDavid du Colombier qidtype(char *s, uchar t) 1509a747e4fSDavid du Colombier { 1519a747e4fSDavid du Colombier char *p; 1529a747e4fSDavid du Colombier 1539a747e4fSDavid du Colombier p = s; 1549a747e4fSDavid du Colombier if(t & QTDIR) 1559a747e4fSDavid du Colombier *p++ = 'd'; 1569a747e4fSDavid du Colombier if(t & QTAPPEND) 1579a747e4fSDavid du Colombier *p++ = 'a'; 1589a747e4fSDavid du Colombier if(t & QTEXCL) 1599a747e4fSDavid du Colombier *p++ = 'l'; 1609a747e4fSDavid du Colombier if(t & QTMOUNT) 1619a747e4fSDavid du Colombier *p++ = 'm'; 162*50a9bdd4SDavid du Colombier if(t & QTAUTH) 163*50a9bdd4SDavid du Colombier *p++ = 'A'; 1649a747e4fSDavid du Colombier *p = '\0'; 1659a747e4fSDavid du Colombier return s; 1669a747e4fSDavid du Colombier } 1679a747e4fSDavid du Colombier 1689a747e4fSDavid du Colombier int 1699a747e4fSDavid du Colombier dirconv(va_list *arg, Fconv *f) 1709a747e4fSDavid du Colombier { 1719a747e4fSDavid du Colombier char buf[160]; 1729a747e4fSDavid du Colombier 1739a747e4fSDavid du Colombier fdirconv(buf, va_arg(*arg, Dir*)); 1749a747e4fSDavid du Colombier strconv(buf, f); 1759a747e4fSDavid du Colombier return(sizeof(Dir*)); 1769a747e4fSDavid du Colombier } 1779a747e4fSDavid du Colombier 1789a747e4fSDavid du Colombier static void 1799a747e4fSDavid du Colombier fdirconv(char *buf, Dir *d) 1809a747e4fSDavid du Colombier { 1819a747e4fSDavid du Colombier char tmp[16]; 1829a747e4fSDavid du Colombier 1839a747e4fSDavid du Colombier sprint(buf, "'%s' '%s' '%s' '%s' " 1849a747e4fSDavid du Colombier "q " QIDFMT " m %#luo " 1859a747e4fSDavid du Colombier "at %ld mt %ld l %lld " 1869a747e4fSDavid du Colombier "t %d d %d", 1879a747e4fSDavid du Colombier d->name, d->uid, d->gid, d->muid, 1889a747e4fSDavid du Colombier d->qid.path, d->qid.vers, qidtype(tmp, d->qid.type), d->mode, 1899a747e4fSDavid du Colombier d->atime, d->mtime, d->length, 1909a747e4fSDavid du Colombier d->type, d->dev); 1919a747e4fSDavid du Colombier } 1929a747e4fSDavid du Colombier 1939a747e4fSDavid du Colombier /* 1949a747e4fSDavid du Colombier * dump out count (or DUMPL, if count is bigger) bytes from 1959a747e4fSDavid du Colombier * buf to ans, as a string if they are all printable, 1969a747e4fSDavid du Colombier * else as a series of hex bytes 1979a747e4fSDavid du Colombier */ 1989a747e4fSDavid du Colombier #define DUMPL 64 1999a747e4fSDavid du Colombier 2009a747e4fSDavid du Colombier static uint 2019a747e4fSDavid du Colombier dumpsome(char *ans, char *buf, long count) 2029a747e4fSDavid du Colombier { 2039a747e4fSDavid du Colombier int i, printable; 2049a747e4fSDavid du Colombier char *p; 2059a747e4fSDavid du Colombier 2069a747e4fSDavid du Colombier printable = 1; 2079a747e4fSDavid du Colombier if(count > DUMPL) 2089a747e4fSDavid du Colombier count = DUMPL; 2099a747e4fSDavid du Colombier for(i=0; i<count && printable; i++) 2109a747e4fSDavid du Colombier if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127) 2119a747e4fSDavid du Colombier printable = 0; 2129a747e4fSDavid du Colombier p = ans; 2139a747e4fSDavid du Colombier *p++ = '\''; 2149a747e4fSDavid du Colombier if(printable){ 2159a747e4fSDavid du Colombier memmove(p, buf, count); 2169a747e4fSDavid du Colombier p += count; 2179a747e4fSDavid du Colombier }else{ 2189a747e4fSDavid du Colombier for(i=0; i<count; i++){ 2199a747e4fSDavid du Colombier if(i>0 && i%4==0) 2209a747e4fSDavid du Colombier *p++ = ' '; 2219a747e4fSDavid du Colombier sprint(p, "%2.2ux", (uchar)buf[i]); 2229a747e4fSDavid du Colombier p += 2; 2239a747e4fSDavid du Colombier } 2249a747e4fSDavid du Colombier } 2259a747e4fSDavid du Colombier *p++ = '\''; 2269a747e4fSDavid du Colombier *p = 0; 2279a747e4fSDavid du Colombier return p - ans; 2289a747e4fSDavid du Colombier } 229