265 lines · 3.6 KB · C
RawDownload
#include	"all.h" #ifdef OLD#define swaboff swab4#else#define swaboff swab8#endif intswabread(Device *d, Off b, void *c){	int e; 	e = devread(d->swab.d, b, c);	if(e == 0)		swab(c, 0);	return e;} intswabwrite(Device *d, Off b, void *c){	int e; 	swab(c, 1);	e = devwrite(d->swab.d, b, c);	swab(c, 0);	return e;} Devsizeswabsize(Device *d){	return devsize(d->swab.d);} Offswabsuper(Device *d){	return superaddr(d->swab.d);} Offswabraddr(Device *d){	return getraddr(d->swab.d);} voidswabream(Device *d, int top){	devream(d->swab.d, top);} voidswabrecover(Device *d){	devrecover(d->swab.d);} voidswabinit(Device *d){	devinit(d->swab.d);} voidswab2(void *c){	uchar *p;	int t; 	p = c; 	t = p[0];	p[0] = p[1];	p[1] = t;} voidswab4(void *c){	uchar *p;	int t; 	p = c; 	t = p[0];	p[0] = p[3];	p[3] = t; 	t = p[1];	p[1] = p[2];	p[2] = t;} voidswab8(void *c){	uchar *p;	int t; 	p = c; 	t = p[0];	p[0] = p[7];	p[7] = t; 	t = p[1];	p[1] = p[6];	p[6] = t; 	t = p[2];	p[2] = p[5];	p[5] = t; 	t = p[3];	p[3] = p[4];	p[4] = t;} /* * swab a block *	flag = 0 -- convert from foreign to native *	flag = 1 -- convert from native to foreign */voidswab(void *c, int flag){	uchar *p;	Tag *t;	int i, j;	Dentry *d;	Cache *h;	Bucket *b;	Superb *s;	Fbuf *f;	Off *l; 	/* swab the tag */	p = (uchar*)c;	t = (Tag*)(p + BUFSIZE);	if(!flag) {		swab2(&t->pad);		swab2(&t->tag);		swaboff(&t->path);	} 	/* swab each block type */	switch(t->tag) { 	default:		print("no swab for tag=%G rw=%d\n", t->tag, flag);		for(j=0; j<16; j++)			print(" %.2x", p[BUFSIZE+j]);		print("\n");		for(i=0; i<16; i++) {			print("%.4x", i*16);			for(j=0; j<16; j++)				print(" %.2x", p[i*16+j]);			print("\n");		}		panic("swab");		break; 	case Tsuper:		s = (Superb*)p;		swaboff(&s->fbuf.nfree);		for(i=0; i<FEPERBUF; i++)			swaboff(&s->fbuf.free[i]);#ifdef AUTOSWAB		swaboff(&s->magic);#endif		swaboff(&s->fstart);		swaboff(&s->fsize);		swaboff(&s->tfree);		swaboff(&s->qidgen);		swaboff(&s->cwraddr);		swaboff(&s->roraddr);		swaboff(&s->last);		swaboff(&s->next);		break; 	case Tdir:		for(i=0; i<DIRPERBUF; i++) {			d = (Dentry*)p + i;			swab2(&d->uid);			swab2(&d->gid);			swab2(&d->mode);			swab2(&d->muid);			swaboff(&d->qid.path);			swab4(&d->qid.version);			swaboff(&d->size);			for(j=0; j<NDBLOCK; j++)				swaboff(&d->dblock[j]);			for (j = 0; j < NIBLOCK; j++)				swaboff(&d->iblocks[j]);			swab4(&d->atime);			swab4(&d->mtime);		}		break; 	case Tind1:	case Tind2:#ifndef OLD	case Tind3:	case Tind4:	/* add more Tind tags here ... */#endif		l = (Off *)p;		for(i=0; i<INDPERBUF; i++) {			swaboff(l);			l++;		}		break; 	case Tfree:		f = (Fbuf*)p;		swaboff(&f->nfree);		for(i=0; i<FEPERBUF; i++)			swaboff(&f->free[i]);		break; 	case Tbuck:		for(i=0; i<BKPERBLK; i++) {			b = (Bucket*)p + i;			swab4(&b->agegen);			for(j=0; j<CEPERBK; j++) {				swab2(&b->entry[j].age);				swab2(&b->entry[j].state);				swaboff(&b->entry[j].waddr);			}		}		break; 	case Tcache:		h = (Cache*)p;		swaboff(&h->maddr);		swaboff(&h->msize);		swaboff(&h->caddr);		swaboff(&h->csize);		swaboff(&h->fsize);		swaboff(&h->wsize);		swaboff(&h->wmax);		swaboff(&h->sbaddr);		swaboff(&h->cwraddr);		swaboff(&h->roraddr);		swab4(&h->toytime);		swab4(&h->time);		break; 	case Tnone:	// unitialized	case Tfile:	// someone elses problem	case Tvirgo:	// bit map -- all bytes	case Tconfig:	// configuration string -- all bytes		break;	} 	/* swab the tag */	if(flag) {		swab2(&t->pad);		swab2(&t->tag);		swaboff(&t->path);	}}