#include "all.h" #ifdef OLD #define swaboff swab4 #else #define swaboff swab8 #endif int swabread(Device *d, Off b, void *c) { int e; e = devread(d->swab.d, b, c); if(e == 0) swab(c, 0); return e; } int swabwrite(Device *d, Off b, void *c) { int e; swab(c, 1); e = devwrite(d->swab.d, b, c); swab(c, 0); return e; } Devsize swabsize(Device *d) { return devsize(d->swab.d); } Off swabsuper(Device *d) { return superaddr(d->swab.d); } Off swabraddr(Device *d) { return getraddr(d->swab.d); } void swabream(Device *d, int top) { devream(d->swab.d, top); } void swabrecover(Device *d) { devrecover(d->swab.d); } void swabinit(Device *d) { devinit(d->swab.d); } void swab2(void *c) { uchar *p; int t; p = c; t = p[0]; p[0] = p[1]; p[1] = t; } void swab4(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; } void swab8(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 */ void swab(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; ifbuf.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; iuid); swab2(&d->gid); swab2(&d->mode); swab2(&d->muid); swaboff(&d->qid.path); swab4(&d->qid.version); swaboff(&d->size); for(j=0; jdblock[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; infree); for(i=0; ifree[i]); break; case Tbuck: for(i=0; iagegen); for(j=0; jentry[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); } }