xref: /plan9/sys/src/cmd/unix/u9fs/fcallconv.c (revision 9b7bf7df4595c26f1e9b67beb0c6e44c9876fb05)
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