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
fcallconv(va_list * arg,Fconv * f1)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 */
79*9b7bf7dfSDavid du Colombier sprint(buf, "Tcreate tag %ud fid %ud name %s perm %M mode %d",
80*9b7bf7dfSDavid du Colombier tag, fid, f->name, (ulong)f->perm, f->mode);
819a747e4fSDavid du Colombier break;
829a747e4fSDavid du Colombier case Rcreate:
839a747e4fSDavid du Colombier sprint(buf, "Rcreate tag %ud qid " QIDFMT " iounit %ud ", tag,
849a747e4fSDavid du Colombier f->qid.path, f->qid.vers, qidtype(tmp, f->qid.type), f->iounit);
859a747e4fSDavid du Colombier break;
869a747e4fSDavid du Colombier case Tread: /* 116 */
879a747e4fSDavid du Colombier sprint(buf, "Tread tag %ud fid %d offset %lld count %ud",
889a747e4fSDavid du Colombier tag, fid, f->offset, f->count);
899a747e4fSDavid du Colombier break;
909a747e4fSDavid du Colombier case Rread:
919a747e4fSDavid du Colombier n = sprint(buf, "Rread tag %ud count %ud ", tag, f->count);
929a747e4fSDavid du Colombier dumpsome(buf+n, f->data, f->count);
939a747e4fSDavid du Colombier break;
949a747e4fSDavid du Colombier case Twrite: /* 118 */
959a747e4fSDavid du Colombier n = sprint(buf, "Twrite tag %ud fid %d offset %lld count %ud ",
969a747e4fSDavid du Colombier tag, fid, f->offset, f->count);
979a747e4fSDavid du Colombier dumpsome(buf+n, f->data, f->count);
989a747e4fSDavid du Colombier break;
999a747e4fSDavid du Colombier case Rwrite:
1009a747e4fSDavid du Colombier sprint(buf, "Rwrite tag %ud count %ud", tag, f->count);
1019a747e4fSDavid du Colombier break;
1029a747e4fSDavid du Colombier case Tclunk: /* 120 */
1039a747e4fSDavid du Colombier sprint(buf, "Tclunk tag %ud fid %ud", tag, fid);
1049a747e4fSDavid du Colombier break;
1059a747e4fSDavid du Colombier case Rclunk:
1069a747e4fSDavid du Colombier sprint(buf, "Rclunk tag %ud", tag);
1079a747e4fSDavid du Colombier break;
1089a747e4fSDavid du Colombier case Tremove: /* 122 */
1099a747e4fSDavid du Colombier sprint(buf, "Tremove tag %ud fid %ud", tag, fid);
1109a747e4fSDavid du Colombier break;
1119a747e4fSDavid du Colombier case Rremove:
1129a747e4fSDavid du Colombier sprint(buf, "Rremove tag %ud", tag);
1139a747e4fSDavid du Colombier break;
1149a747e4fSDavid du Colombier case Tstat: /* 124 */
1159a747e4fSDavid du Colombier sprint(buf, "Tstat tag %ud fid %ud", tag, fid);
1169a747e4fSDavid du Colombier break;
1179a747e4fSDavid du Colombier case Rstat:
1189a747e4fSDavid du Colombier n = sprint(buf, "Rstat tag %ud ", tag);
1199a747e4fSDavid du Colombier if(f->nstat > sizeof tmp)
1209a747e4fSDavid du Colombier sprint(buf+n, " stat(%d bytes)", f->nstat);
1219a747e4fSDavid du Colombier else{
1229a747e4fSDavid du Colombier d = (Dir*)tmp;
1239a747e4fSDavid du Colombier (old9p?convM2Dold:convM2D)(f->stat, f->nstat, d, (char*)(d+1));
1249a747e4fSDavid du Colombier sprint(buf+n, " stat ");
1259a747e4fSDavid du Colombier fdirconv(buf+n+6, d);
1269a747e4fSDavid du Colombier }
1279a747e4fSDavid du Colombier break;
1289a747e4fSDavid du Colombier case Twstat: /* 126 */
1299a747e4fSDavid du Colombier n = sprint(buf, "Twstat tag %ud fid %ud", tag, fid);
1309a747e4fSDavid du Colombier if(f->nstat > sizeof tmp)
1319a747e4fSDavid du Colombier sprint(buf+n, " stat(%d bytes)", f->nstat);
1329a747e4fSDavid du Colombier else{
1339a747e4fSDavid du Colombier d = (Dir*)tmp;
1349a747e4fSDavid du Colombier (old9p?convM2Dold:convM2D)(f->stat, f->nstat, d, (char*)(d+1));
1359a747e4fSDavid du Colombier sprint(buf+n, " stat ");
1369a747e4fSDavid du Colombier fdirconv(buf+n+6, d);
1379a747e4fSDavid du Colombier }
1389a747e4fSDavid du Colombier break;
1399a747e4fSDavid du Colombier case Rwstat:
1409a747e4fSDavid du Colombier sprint(buf, "Rwstat tag %ud", tag);
1419a747e4fSDavid du Colombier break;
1429a747e4fSDavid du Colombier default:
1439a747e4fSDavid du Colombier sprint(buf, "unknown type %d", type);
1449a747e4fSDavid du Colombier }
1459a747e4fSDavid du Colombier strconv(buf, f1);
1469a747e4fSDavid du Colombier return(sizeof(Fcall*));
1479a747e4fSDavid du Colombier }
1489a747e4fSDavid du Colombier
1499a747e4fSDavid du Colombier static char*
qidtype(char * s,uchar t)1509a747e4fSDavid du Colombier qidtype(char *s, uchar t)
1519a747e4fSDavid du Colombier {
1529a747e4fSDavid du Colombier char *p;
1539a747e4fSDavid du Colombier
1549a747e4fSDavid du Colombier p = s;
1559a747e4fSDavid du Colombier if(t & QTDIR)
1569a747e4fSDavid du Colombier *p++ = 'd';
1579a747e4fSDavid du Colombier if(t & QTAPPEND)
1589a747e4fSDavid du Colombier *p++ = 'a';
1599a747e4fSDavid du Colombier if(t & QTEXCL)
1609a747e4fSDavid du Colombier *p++ = 'l';
1619a747e4fSDavid du Colombier if(t & QTMOUNT)
1629a747e4fSDavid du Colombier *p++ = 'm';
16350a9bdd4SDavid du Colombier if(t & QTAUTH)
16450a9bdd4SDavid du Colombier *p++ = 'A';
1659a747e4fSDavid du Colombier *p = '\0';
1669a747e4fSDavid du Colombier return s;
1679a747e4fSDavid du Colombier }
1689a747e4fSDavid du Colombier
1699a747e4fSDavid du Colombier int
dirconv(va_list * arg,Fconv * f)1709a747e4fSDavid du Colombier dirconv(va_list *arg, Fconv *f)
1719a747e4fSDavid du Colombier {
1729a747e4fSDavid du Colombier char buf[160];
1739a747e4fSDavid du Colombier
1749a747e4fSDavid du Colombier fdirconv(buf, va_arg(*arg, Dir*));
1759a747e4fSDavid du Colombier strconv(buf, f);
1769a747e4fSDavid du Colombier return(sizeof(Dir*));
1779a747e4fSDavid du Colombier }
1789a747e4fSDavid du Colombier
1799a747e4fSDavid du Colombier static void
fdirconv(char * buf,Dir * d)1809a747e4fSDavid du Colombier fdirconv(char *buf, Dir *d)
1819a747e4fSDavid du Colombier {
1829a747e4fSDavid du Colombier char tmp[16];
1839a747e4fSDavid du Colombier
1849a747e4fSDavid du Colombier sprint(buf, "'%s' '%s' '%s' '%s' "
1859a747e4fSDavid du Colombier "q " QIDFMT " m %#luo "
1869a747e4fSDavid du Colombier "at %ld mt %ld l %lld "
1879a747e4fSDavid du Colombier "t %d d %d",
1889a747e4fSDavid du Colombier d->name, d->uid, d->gid, d->muid,
1899a747e4fSDavid du Colombier d->qid.path, d->qid.vers, qidtype(tmp, d->qid.type), d->mode,
1909a747e4fSDavid du Colombier d->atime, d->mtime, d->length,
1919a747e4fSDavid du Colombier d->type, d->dev);
1929a747e4fSDavid du Colombier }
1939a747e4fSDavid du Colombier
1949a747e4fSDavid du Colombier /*
1959a747e4fSDavid du Colombier * dump out count (or DUMPL, if count is bigger) bytes from
1969a747e4fSDavid du Colombier * buf to ans, as a string if they are all printable,
1979a747e4fSDavid du Colombier * else as a series of hex bytes
1989a747e4fSDavid du Colombier */
1999a747e4fSDavid du Colombier #define DUMPL 64
2009a747e4fSDavid du Colombier
2019a747e4fSDavid du Colombier static uint
dumpsome(char * ans,char * buf,long count)2029a747e4fSDavid du Colombier dumpsome(char *ans, char *buf, long count)
2039a747e4fSDavid du Colombier {
2049a747e4fSDavid du Colombier int i, printable;
2059a747e4fSDavid du Colombier char *p;
2069a747e4fSDavid du Colombier
2079a747e4fSDavid du Colombier printable = 1;
2089a747e4fSDavid du Colombier if(count > DUMPL)
2099a747e4fSDavid du Colombier count = DUMPL;
2109a747e4fSDavid du Colombier for(i=0; i<count && printable; i++)
2119a747e4fSDavid du Colombier if((buf[i]<32 && buf[i] !='\n' && buf[i] !='\t') || (uchar)buf[i]>127)
2129a747e4fSDavid du Colombier printable = 0;
2139a747e4fSDavid du Colombier p = ans;
2149a747e4fSDavid du Colombier *p++ = '\'';
2159a747e4fSDavid du Colombier if(printable){
2169a747e4fSDavid du Colombier memmove(p, buf, count);
2179a747e4fSDavid du Colombier p += count;
2189a747e4fSDavid du Colombier }else{
2199a747e4fSDavid du Colombier for(i=0; i<count; i++){
2209a747e4fSDavid du Colombier if(i>0 && i%4==0)
2219a747e4fSDavid du Colombier *p++ = ' ';
2229a747e4fSDavid du Colombier sprint(p, "%2.2ux", (uchar)buf[i]);
2239a747e4fSDavid du Colombier p += 2;
2249a747e4fSDavid du Colombier }
2259a747e4fSDavid du Colombier }
2269a747e4fSDavid du Colombier *p++ = '\'';
2279a747e4fSDavid du Colombier *p = 0;
2289a747e4fSDavid du Colombier return p - ans;
2299a747e4fSDavid du Colombier }
230