| plan 9 kernel history: overview | file list | diff list |
1999/0807/mpc/devsac.c (diff list | history)
| 1999/0608/sys/src/9/mpc/devsac.c:4,9 – 1999/0609/sys/src/9/mpc/devsac.c:4,10 (short | long) | ||
| 1999/0608 | #include "dat.h" #include "fns.h" #include "io.h" | |
| 1999/0609 | #include "../port/error.h" | |
| 1999/0608 | /* * Rather than reading /adm/users, which is a lot of work for | |
| 1999/0608/sys/src/9/mpc/devsac.c:73,104 – 1999/0609/sys/src/9/mpc/devsac.c:74,104 | ||
| 1999/0608 | Powner = 64, }; | |
| 1999/0609 | static uchar *data = SACMEM; static int blocksize; static Sac root; | |
| 1999/0608 |
| |
| 1999/0609 | static void sacdir(Chan *, SacDir*, char*); static ulong getl(void *p); static vlong getv(void *p); static Sac *saccpy(Sac *s); static Sac *saclookup(Sac *s, char *name); static int sacdirread(Chan *, char *p, long off, long cnt); static void loadblock(void *buf, uchar *offset, int blocksize); static void sacfree(Sac*); | |
| 1999/0608 |
| |
| 1999/0609 | static void sacinit(void) | |
| 1999/0608 | { SacHeader *hdr; | |
| 1999/0609 | print("sacinit\n"); | |
| 1999/0608 | hdr = (SacHeader*)data; if(getl(hdr->magic) != Magic) { | |
| 1999/0609 | print("devsac: bad magic\n"); | |
| 1999/0608 | return; } blocksize = getl(hdr->blocksize); | |
| 1999/0609 | print("blocksize = %d\n", blocksize); | |
| 1999/0608 | root.SacDir = *(SacDir*)(data + sizeof(SacHeader)); } | |
| 1999/0608/sys/src/9/mpc/devsac.c:123,129 – 1999/0609/sys/src/9/mpc/devsac.c:123,129 | ||
| 1999/0608 | return c; } | |
| 1999/0609 | static Chan* | |
| 1999/0608 | sacclone(Chan *c, Chan *nc) { nc = devclone(c, nc); | |
| 1999/0608/sys/src/9/mpc/devsac.c:131,145 – 1999/0609/sys/src/9/mpc/devsac.c:131,147 | ||
| 1999/0608 | return nc; } | |
| 1999/0609 | static int sacwalk(Chan *c, char *name) | |
| 1999/0608 | { Sac *sac; | |
| 1999/0609 | Path *op; | |
| 1999/0608 | ||
| 1999/0609 | print("sacwalk\n"); | |
| 1999/0608 | isdir(c); | |
| 1999/0609 | if(name[0]=='.' && name[1]==0) | |
| 1999/0608 | return 1; | |
| 1999/0609 | sac = c->aux; | |
| 1999/0608 | sac = saclookup(sac, name); if(sac == nil) { strncpy(up->error, Enonexist, NAMELEN); | |
| 1999/0608/sys/src/9/mpc/devsac.c:148,235 – 1999/0609/sys/src/9/mpc/devsac.c:150,214 | ||
| 1999/0608 | c->aux = sac; c->qid = (Qid){getl(sac->qid), 0}; op = c->path; | |
| 1999/0609 | print("op=%ux name = %s\n", op, name); | |
| 1999/0608 | c->path = ptenter(&syspt, op, name); decref(op); return 1; } | |
| 1999/0609 | static Chan* sacopen(Chan *c, int omode) | |
| 1999/0608 | { | |
| 1999/0609 | ulong t, mode; Sac *sac; static int access[] = { 0400, 0200, 0600, 0100 }; | |
| 1999/0608 |
| |
| 1999/0609 | sac = c->aux; mode = getl(sac->mode); if(strcmp(up->user, sac->uid) == 0) mode = mode; else if(strcmp(up->user, sac->gid) == 0) mode = mode<<3; else mode = mode<<6; | |
| 1999/0608 |
| |
| 1999/0609 | t = access[omode&3]; if((t & mode) != t) error(Eperm); c->offset = 0; c->mode = openmode(omode); c->flag |= COPEN; return c; | |
| 1999/0608 | } | |
| 1999/0609 | static long sacread(Chan *c, void *a, long n, vlong off) | |
| 1999/0608 | { Sac *sac; char *buf, *buf2; | |
| 1999/0609 | int nn, cnt, i, j; | |
| 1999/0608 | uchar *blocks; vlong length; | |
| 1999/0609 | buf = a; cnt = n; if(c->qid.path & CHDIR){ cnt = (cnt/DIRLEN)*DIRLEN; | |
| 1999/0608 | if(off%DIRLEN) | |
| 1999/0609 | error("i/o error"); return sacdirread(c, buf, off, cnt); | |
| 1999/0608 | } | |
| 1999/0609 | print("data read\n"); sac = c->aux; | |
| 1999/0608 | length = getv(sac->length); | |
| 1999/0609 | if(off >= length) | |
| 1999/0608 | return 0; | |
| 1999/0609 | n = cnt; | |
| 1999/0608 | blocks = data + getv(sac->blocks); buf2 = malloc(blocksize); while(cnt > 0) { | |
| 1999/0608/sys/src/9/mpc/devsac.c:236,303 – 1999/0609/sys/src/9/mpc/devsac.c:215,261 | ||
| 1999/0608 | i = off/blocksize; loadblock(buf2, blocks+i*8, blocksize); j = off-i*blocksize; | |
| 1999/0609 | nn = blocksize-j; if(nn > cnt) nn = cnt; memmove(buf, buf2+j, nn); cnt -= nn; off += nn; | |
| 1999/0608 | } free(buf2); | |
| 1999/0609 | return n; | |
| 1999/0608 | } | |
| 1999/0609 | static long sacwrite(Chan *, void *, long, vlong) | |
| 1999/0608 | { | |
| 1999/0609 | error(Eperm); | |
| 1999/0608 | return 0; } | |
| 1999/0609 | static void sacclose(Chan* c) | |
| 1999/0608 | { | |
| 1999/0609 | Sac *sac = c->aux; print("close %ux\n", sac); c->aux = nil; sacfree(sac); | |
| 1999/0608 | } | |
| 1999/0609 | static void sacstat(Chan *c, char *db) | |
| 1999/0608 | { | |
| 1999/0609 | sacdir(c, c->aux, db); | |
| 1999/0608 | } | |
| 1999/0609 | static Sac* | |
| 1999/0608 | saccpy(Sac *s) { Sac *ss; ss = malloc(sizeof(Sac)); | |
| 1999/0609 | print("saccpy = %ux\n", ss); | |
| 1999/0608 | *ss = *s; if(ss->path) incref(ss->path); | |
| 1999/0608/sys/src/9/mpc/devsac.c:304,310 – 1999/0609/sys/src/9/mpc/devsac.c:262,268 | ||
| 1999/0608 | return ss; } | |
| 1999/0609 | static SacPath * | |
| 1999/0608 | sacpathalloc(SacPath *p, vlong blocks, int entry) { SacPath *pp = malloc(sizeof(SacPath)); | |
| 1999/0608/sys/src/9/mpc/devsac.c:327,333 – 1999/0609/sys/src/9/mpc/devsac.c:285,291 | ||
| 1999/0608 | } | |
| 1999/0609 | static void | |
| 1999/0608 | sacfree(Sac *s) { sacpathfree(s->path); | |
| 1999/0608/sys/src/9/mpc/devsac.c:334,341 – 1999/0609/sys/src/9/mpc/devsac.c:292,299 | ||
| 1999/0608 | free(s); } | |
| 1999/0609 | static void sacdir(Chan *c, SacDir *s, char *buf) | |
| 1999/0608 | { Dir dir; | |
| 1999/0608/sys/src/9/mpc/devsac.c:349,358 – 1999/0609/sys/src/9/mpc/devsac.c:307,318 | ||
| 1999/0608 | strcpy(dir.gid, s->gid); dir.atime = getl(s->atime); dir.mtime = getl(s->mtime); | |
| 1999/0609 | dir.type = devtab[c->type]->dc; dir.dev = c->dev; | |
| 1999/0608 | convD2M(&dir, buf); } | |
| 1999/0609 | static void | |
| 1999/0608 | loadblock(void *buf, uchar *offset, int blocksize) { vlong block, n; | |
| 1999/0608/sys/src/9/mpc/devsac.c:364,378 – 1999/0609/sys/src/9/mpc/devsac.c:324,339 | ||
| 1999/0608 | if(n < 0) n = -n; n -= block; | |
| 1999/0609 | print("blocksize = %d, block = %lld n = %lld\n", blocksize, block, n); | |
| 1999/0608 | if(unsac(buf, data+block, blocksize, n)<0) panic("unsac failed!"); } else { | |
| 1999/0609 | print("memmove: blocksize = %d\n", blocksize); | |
| 1999/0608 | memmove(buf, data+block, blocksize); } } | |
| 1999/0609 | static Sac* | |
| 1999/0608 | sacparent(Sac *s) { uchar *blocks; | |
| 1999/0608/sys/src/9/mpc/devsac.c:382,394 – 1999/0609/sys/src/9/mpc/devsac.c:343,355 | ||
| 1999/0608 | p = s->path; if(p == nil || p->up == nil) { | |
| 1999/0609 | sacpathfree(p); | |
| 1999/0608 | *s = root; return s; } p = p->up; | |
| 1999/0609 | print("sacparent = %lld %d\n", p->blocks, p->entry); | |
| 1999/0608 | blocks = data + p->blocks; per = blocksize/sizeof(SacDir); i = p->entry/per; | |
| 1999/0608/sys/src/9/mpc/devsac.c:395,415 – 1999/0609/sys/src/9/mpc/devsac.c:356,379 | ||
| 1999/0608 | buf = malloc(per*sizeof(SacDir)); loadblock(buf, blocks + i*8, per*sizeof(SacDir)); s->SacDir = buf[p->entry-i*per]; | |
| 1999/0609 | print("sacparent = %s\n", s->name); | |
| 1999/0608 | free(buf); incref(p); | |
| 1999/0609 | sacpathfree(s->path); | |
| 1999/0608 | s->path = p; return s; } | |
| 1999/0609 | static int sacdirread(Chan *c, char *p, long off, long cnt) | |
| 1999/0608 | { uchar *blocks; SacDir *buf; int iblock, per, i, j, ndir; | |
| 1999/0609 | Sac *s; | |
| 1999/0608 | ||
| 1999/0609 | print("sacdirread %d %d\n", off, cnt); s = c->aux; | |
| 1999/0608 | blocks = data + getv(s->blocks); per = blocksize/sizeof(SacDir); ndir = getv(s->length); | |
| 1999/0608/sys/src/9/mpc/devsac.c:428,434 – 1999/0609/sys/src/9/mpc/devsac.c:392,398 | ||
| 1999/0608 | iblock = j; } j *= per; | |
| 1999/0609 | sacdir(c, buf+i-j, p); | |
| 1999/0608 | p += DIRLEN; } free(buf); | |
| 1999/0608/sys/src/9/mpc/devsac.c:435,445 – 1999/0609/sys/src/9/mpc/devsac.c:399,409 | ||
| 1999/0608 | return cnt*DIRLEN; } | |
| 1999/0609 | static Sac* | |
| 1999/0608 | saclookup(Sac *s, char *name) { int ndir; | |
| 1999/0609 | int i, j, k, per; | |
| 1999/0608 | uchar *blocks; SacDir *buf; int iblock; | |
| 1999/0608/sys/src/9/mpc/devsac.c:453,488 – 1999/0609/sys/src/9/mpc/devsac.c:417,424 | ||
| 1999/0608 | buf = malloc(per*sizeof(SacDir)); iblock = -1; | |
| 1999/0609 | // linear search for(i=0; i<ndir; i++) { | |
| 1999/0608 | j = i/per; if(j != iblock) { loadblock(buf, blocks + j*8, per*sizeof(SacDir)); | |
| 1999/0608/sys/src/9/mpc/devsac.c:492,606 – 1999/0609/sys/src/9/mpc/devsac.c:428,445 | ||
| 1999/0608 | sd = buf+i-j; k = strcmp(name, sd->name); if(k == 0) { | |
| 1999/0609 | print("walk %s %lld %d\n", name, getv(s->blocks), i); s->path = sacpathalloc(s->path, getv(s->blocks), i); | |
| 1999/0608 | s->SacDir = *sd; free(buf); | |
| 1999/0609 | return s; | |
| 1999/0608 | } | |
| 1999/0609 | free(buf); | |
| 1999/0608 | return 0; } | |
| 1999/0609 | static ulong | |
| 1999/0608 | getl(void *p) { uchar *a = p; | |
| 1999/0608/sys/src/9/mpc/devsac.c:608,614 – 1999/0609/sys/src/9/mpc/devsac.c:447,453 | ||
| 1999/0608 | return (a[0]<<24) | (a[1]<<16) | (a[2]<<8) | a[3]; } | |
| 1999/0609 | static vlong | |
| 1999/0608 | getv(void *p) { uchar *a = p; | |
| 1999/0609/sys/src/9/mpc/devsac.c:98,104 – 1999/0610/sys/src/9/mpc/devsac.c:98,103 (short | long) | ||
| 1999/0608 | return; } blocksize = getl(hdr->blocksize); | |
| 1999/0609 |
| |
| 1999/0608 | root.SacDir = *(SacDir*)(data + sizeof(SacHeader)); } | |
| 1999/0609/sys/src/9/mpc/devsac.c:137,143 – 1999/0610/sys/src/9/mpc/devsac.c:136,143 | ||
| 1999/0608 | Sac *sac; | |
| 1999/0609 | Path *op; | |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0610 | //print("walk %s\n", name); | |
| 1999/0608 | isdir(c); | |
| 1999/0609 | if(name[0]=='.' && name[1]==0) | |
| 1999/0608 | return 1; | |
| 1999/0609/sys/src/9/mpc/devsac.c:150,156 – 1999/0610/sys/src/9/mpc/devsac.c:150,155 | ||
| 1999/0608 | c->aux = sac; c->qid = (Qid){getl(sac->qid), 0}; op = c->path; | |
| 1999/0609 |
| |
| 1999/0608 | c->path = ptenter(&syspt, op, name); decref(op); return 1; | |
| 1999/0609/sys/src/9/mpc/devsac.c:199,206 – 1999/0610/sys/src/9/mpc/devsac.c:198,205 | ||
| 1999/0609 | error("i/o error"); return sacdirread(c, buf, off, cnt); | |
| 1999/0608 | } | |
| 1999/0609 |
| |
| 1999/0610 | //print("sacread: %s %llx %d\n", sac->name, off, n); | |
| 1999/0608 | length = getv(sac->length); | |
| 1999/0609 | if(off >= length) | |
| 1999/0608 | return 0; | |
| 1999/0609/sys/src/9/mpc/devsac.c:221,226 – 1999/0610/sys/src/9/mpc/devsac.c:220,226 | ||
| 1999/0609 | memmove(buf, buf2+j, nn); cnt -= nn; off += nn; | |
| 1999/0610 | buf += nn; | |
| 1999/0608 | } free(buf2); | |
| 1999/0609 | return n; | |
| 1999/0609/sys/src/9/mpc/devsac.c:237,243 – 1999/0610/sys/src/9/mpc/devsac.c:237,242 | ||
| 1999/0609 | sacclose(Chan* c) | |
| 1999/0608 | { | |
| 1999/0609 | Sac *sac = c->aux; | |
| 1999/0608 | } | |
| 1999/0609/sys/src/9/mpc/devsac.c:255,261 – 1999/0610/sys/src/9/mpc/devsac.c:254,259 | ||
| 1999/0608 | Sac *ss; ss = malloc(sizeof(Sac)); | |
| 1999/0609 |
| |
| 1999/0608 | *ss = *s; if(ss->path) incref(ss->path); | |
| 1999/0609/sys/src/9/mpc/devsac.c:324,334 – 1999/0610/sys/src/9/mpc/devsac.c:322,330 | ||
| 1999/0608 | if(n < 0) n = -n; n -= block; | |
| 1999/0609 |
| |
| 1999/0608 | if(unsac(buf, data+block, blocksize, n)<0) panic("unsac failed!"); } else { | |
| 1999/0609 |
| |
| 1999/0608 | memmove(buf, data+block, blocksize); } } | |
| 1999/0609/sys/src/9/mpc/devsac.c:349,355 – 1999/0610/sys/src/9/mpc/devsac.c:345,350 | ||
| 1999/0608 | } p = p->up; | |
| 1999/0609 |
| |
| 1999/0608 | blocks = data + p->blocks; per = blocksize/sizeof(SacDir); i = p->entry/per; | |
| 1999/0609/sys/src/9/mpc/devsac.c:356,362 – 1999/0610/sys/src/9/mpc/devsac.c:351,356 | ||
| 1999/0608 | buf = malloc(per*sizeof(SacDir)); loadblock(buf, blocks + i*8, per*sizeof(SacDir)); s->SacDir = buf[p->entry-i*per]; | |
| 1999/0609 |
| |
| 1999/0608 | free(buf); incref(p); | |
| 1999/0609 | sacpathfree(s->path); | |
| 1999/0609/sys/src/9/mpc/devsac.c:372,378 – 1999/0610/sys/src/9/mpc/devsac.c:366,371 | ||
| 1999/0608 | int iblock, per, i, j, ndir; | |
| 1999/0609 | Sac *s; | |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0608 | blocks = data + getv(s->blocks); per = blocksize/sizeof(SacDir); | |
| 1999/0609/sys/src/9/mpc/devsac.c:428,434 – 1999/0610/sys/src/9/mpc/devsac.c:421,426 | ||
| 1999/0608 | sd = buf+i-j; k = strcmp(name, sd->name); if(k == 0) { | |
| 1999/0609 |
| |
| 1999/0608 | s->SacDir = *sd; free(buf); | |
| 1999/0610/sys/src/9/mpc/devsac.c:134,140 – 1999/0727/sys/src/9/mpc/devsac.c:134,139 (short | long) | ||
| 1999/0609 | sacwalk(Chan *c, char *name) | |
| 1999/0608 | { Sac *sac; | |
| 1999/0609 |
| |
| 1999/0608 | ||
| 1999/0610 | //print("walk %s\n", name); | |
| 1999/0610/sys/src/9/mpc/devsac.c:149,157 – 1999/0727/sys/src/9/mpc/devsac.c:148,153 | ||
| 1999/0608 | } c->aux = sac; c->qid = (Qid){getl(sac->qid), 0}; | |
| 1999/0727/sys/src/9/mpc/devsac.c:17,22 – 1999/0806/sys/src/9/mpc/devsac.c:17,23 (short | long) | ||
| 1999/0608 | { OPERM = 0x3, /* mask of all permission types in open mode */ Nram = 512, | |
| 1999/0806 | CacheSize = 20, | |
| 1999/0608 | }; typedef struct SacPath SacPath; | |
| 1999/0727/sys/src/9/mpc/devsac.c:23,28 – 1999/0806/sys/src/9/mpc/devsac.c:24,30 | ||
| 1999/0608 | typedef struct Sac Sac; typedef struct SacHeader SacHeader; typedef struct SacDir SacDir; | |
| 1999/0806 | typedef struct Cache Cache; | |
| 1999/0608 | enum { Magic = 0x5acf5, | |
| 1999/0727/sys/src/9/mpc/devsac.c:64,69 – 1999/0806/sys/src/9/mpc/devsac.c:66,78 | ||
| 1999/0608 | int entry; }; | |
| 1999/0806 | struct Cache { long block; ulong age; uchar *data; }; | |
| 1999/0608 | enum { Pexec = 1, | |
| 1999/0727/sys/src/9/mpc/devsac.c:77,82 – 1999/0806/sys/src/9/mpc/devsac.c:86,93 | ||
| 1999/0609 | static uchar *data = SACMEM; static int blocksize; static Sac root; | |
| 1999/0806 | static Cache cache[CacheSize]; static ulong cacheage; | |
| 1999/0608 | ||
| 1999/0609 | static void sacdir(Chan *, SacDir*, char*); static ulong getl(void *p); | |
| 1999/0727/sys/src/9/mpc/devsac.c:91,96 – 1999/0806/sys/src/9/mpc/devsac.c:102,110 | ||
| 1999/0609 | sacinit(void) | |
| 1999/0608 | { SacHeader *hdr; | |
| 1999/0806 | uchar *p; int i; | |
| 1999/0609 | print("sacinit\n"); | |
| 1999/0608 | hdr = (SacHeader*)data; if(getl(hdr->magic) != Magic) { | |
| 1999/0727/sys/src/9/mpc/devsac.c:99,104 – 1999/0806/sys/src/9/mpc/devsac.c:113,125 | ||
| 1999/0608 | } blocksize = getl(hdr->blocksize); root.SacDir = *(SacDir*)(data + sizeof(SacHeader)); | |
| 1999/0806 | p = malloc(CacheSize*blocksize); if(p == nil) error("allocating cache"); for(i=0; i<CacheSize; i++) { cache[i].data = p; p += blocksize; } | |
| 1999/0608 | } static Chan* | |
| 1999/0727/sys/src/9/mpc/devsac.c:310,319 – 1999/0806/sys/src/9/mpc/devsac.c:331,362 | ||
| 1999/0608 | loadblock(void *buf, uchar *offset, int blocksize) { vlong block, n; | |
| 1999/0806 | ulong age; int i, j; | |
| 1999/0608 | block = getv(offset); if(block < 0) { block = -block; | |
| 1999/0806 | cacheage++; // age has wraped if(cacheage == 0) { for(i=0; i<CacheSize; i++) cache[i].age = 0; } j = 0; age = cache[0].age; for(i=0; i<CacheSize; i++) { if(cache[i].age < age) { age = cache[i].age; j = i; } if(cache[i].block != block) continue; memmove(buf, cache[i].data, blocksize); cache[i].age = cacheage; return; } | |
| 1999/0608 | n = getv(offset+8); if(n < 0) n = -n; | |
| 1999/0727/sys/src/9/mpc/devsac.c:320,325 – 1999/0806/sys/src/9/mpc/devsac.c:363,371 | ||
| 1999/0608 | n -= block; if(unsac(buf, data+block, blocksize, n)<0) panic("unsac failed!"); | |
| 1999/0806 | memmove(cache[j].data, buf, blocksize); cache[j].age = cacheage; cache[j].block = block; | |
| 1999/0608 | } else { memmove(buf, data+block, blocksize); } | |
| 1999/0806/sys/src/9/mpc/devsac.c:18,23 – 1999/0807/sys/src/9/mpc/devsac.c:18,24 (short | long) | ||
| 1999/0608 | OPERM = 0x3, /* mask of all permission types in open mode */ Nram = 512, | |
| 1999/0806 | CacheSize = 20, | |
| 1999/0807 | OffsetSize = 4, /* size in bytes of an offset */ | |
| 1999/0608 | }; typedef struct SacPath SacPath; | |
| 1999/0806/sys/src/9/mpc/devsac.c:62,69 – 1999/0807/sys/src/9/mpc/devsac.c:63,71 | ||
| 1999/0608 | { Ref; SacPath *up; | |
| 1999/0807 | long blocks; | |
| 1999/0608 | int entry; | |
| 1999/0807 | int nentry; | |
| 1999/0608 | }; | |
| 1999/0806 | struct Cache | |
| 1999/0806/sys/src/9/mpc/devsac.c:91,97 – 1999/0807/sys/src/9/mpc/devsac.c:93,98 | ||
| 1999/0608 | ||
| 1999/0609 | static void sacdir(Chan *, SacDir*, char*); static ulong getl(void *p); | |
| 1999/0806/sys/src/9/mpc/devsac.c:199,211 – 1999/0807/sys/src/9/mpc/devsac.c:200,213 | ||
| 1999/0608 | ||
| 1999/0609 | static long | |
| 1999/0807 | sacread(Chan *c, void *a, long n, vlong voff) | |
| 1999/0608 | { Sac *sac; char *buf, *buf2; | |
| 1999/0609 | int nn, cnt, i, j; | |
| 1999/0608 | uchar *blocks; | |
| 1999/0807 | long length; long off = voff; | |
| 1999/0608 | ||
| 1999/0609 | buf = a; cnt = n; | |
| 1999/0806/sys/src/9/mpc/devsac.c:216,223 – 1999/0807/sys/src/9/mpc/devsac.c:218,224 | ||
| 1999/0609 | return sacdirread(c, buf, off, cnt); | |
| 1999/0608 | } | |
| 1999/0609 | sac = c->aux; | |
| 1999/0610 |
| |
| 1999/0608 |
| |
| 1999/0807 | length = getl(sac->length); | |
| 1999/0609 | if(off >= length) | |
| 1999/0608 | return 0; if(cnt > length-off) | |
| 1999/0806/sys/src/9/mpc/devsac.c:225,237 – 1999/0807/sys/src/9/mpc/devsac.c:226,241 | ||
| 1999/0608 | if(cnt == 0) return 0; | |
| 1999/0609 | n = cnt; | |
| 1999/0608 |
| |
| 1999/0807 | blocks = data + getl(sac->blocks); | |
| 1999/0608 | buf2 = malloc(blocksize); while(cnt > 0) { i = off/blocksize; | |
| 1999/0807 | nn = blocksize; if(nn > length-i*blocksize) nn = length-i*blocksize; loadblock(buf2, blocks+i*OffsetSize, nn); | |
| 1999/0608 | j = off-i*blocksize; | |
| 1999/0609 |
| |
| 1999/0807 | nn -= j; | |
| 1999/0609 | if(nn > cnt) nn = cnt; memmove(buf, buf2+j, nn); | |
| 1999/0806/sys/src/9/mpc/devsac.c:278,289 – 1999/0807/sys/src/9/mpc/devsac.c:282,294 | ||
| 1999/0608 | } | |
| 1999/0609 | static SacPath * | |
| 1999/0608 |
| |
| 1999/0807 | sacpathalloc(SacPath *p, long blocks, int entry, int nentry) | |
| 1999/0608 | { SacPath *pp = malloc(sizeof(SacPath)); pp->ref = 1; pp->blocks = blocks; pp->entry = entry; | |
| 1999/0807 | pp->nentry = nentry; | |
| 1999/0608 | pp->up = p; return pp; } | |
| 1999/0806/sys/src/9/mpc/devsac.c:315,325 – 1999/0807/sys/src/9/mpc/devsac.c:320,330 | ||
| 1999/0608 | memmove(dir.name, s->name, NAMELEN); dir.qid = (Qid){getl(s->qid), 0}; dir.mode = getl(s->mode); | |
| 1999/0807 | dir.length = getl(s->length); | |
| 1999/0608 | if(dir.mode &CHDIR) dir.length *= DIRLEN; | |
| 1999/0807 | memmove(dir.uid, s->uid, NAMELEN); memmove(dir.gid, s->gid, NAMELEN); | |
| 1999/0608 | dir.atime = getl(s->atime); dir.mtime = getl(s->mtime); | |
| 1999/0609 | dir.type = devtab[c->type]->dc; | |
| 1999/0806/sys/src/9/mpc/devsac.c:330,340 – 1999/0807/sys/src/9/mpc/devsac.c:335,345 | ||
| 1999/0609 | static void | |
| 1999/0608 | loadblock(void *buf, uchar *offset, int blocksize) { | |
| 1999/0807 | long block, n; | |
| 1999/0806 | ulong age; int i, j; | |
| 1999/0608 |
| |
| 1999/0807 | block = getl(offset); | |
| 1999/0608 | if(block < 0) { block = -block; | |
| 1999/0806 | cacheage++; | |
| 1999/0806/sys/src/9/mpc/devsac.c:357,363 – 1999/0807/sys/src/9/mpc/devsac.c:362,368 | ||
| 1999/0806 | return; } | |
| 1999/0608 |
| |
| 1999/0807 | n = getl(offset+OffsetSize); | |
| 1999/0608 | if(n < 0) n = -n; n -= block; | |
| 1999/0806/sys/src/9/mpc/devsac.c:376,382 – 1999/0807/sys/src/9/mpc/devsac.c:381,387 | ||
| 1999/0608 | { uchar *blocks; SacDir *buf; | |
| 1999/0807 | int per, i, n; | |
| 1999/0608 | SacPath *p; p = s->path; | |
| 1999/0806/sys/src/9/mpc/devsac.c:390,397 – 1999/0807/sys/src/9/mpc/devsac.c:395,405 | ||
| 1999/0608 | blocks = data + p->blocks; per = blocksize/sizeof(SacDir); i = p->entry/per; | |
| 1999/0807 | n = per; if(n > p->nentry-i*per) n = p->nentry-i*per; | |
| 1999/0608 | buf = malloc(per*sizeof(SacDir)); | |
| 1999/0807 | loadblock(buf, blocks + i*OffsetSize, n*sizeof(SacDir)); | |
| 1999/0608 | s->SacDir = buf[p->entry-i*per]; free(buf); incref(p); | |
| 1999/0806/sys/src/9/mpc/devsac.c:405,417 – 1999/0807/sys/src/9/mpc/devsac.c:413,425 | ||
| 1999/0608 | { uchar *blocks; SacDir *buf; | |
| 1999/0807 | int iblock, per, i, j, n, ndir; | |
| 1999/0609 | Sac *s; | |
| 1999/0608 | ||
| 1999/0609 | s = c->aux; | |
| 1999/0608 |
| |
| 1999/0807 | blocks = data + getl(s->blocks); | |
| 1999/0608 | per = blocksize/sizeof(SacDir); | |
| 1999/0807 | ndir = getl(s->length); | |
| 1999/0608 | off /= DIRLEN; cnt /= DIRLEN; if(off >= ndir) | |
| 1999/0806/sys/src/9/mpc/devsac.c:423,429 – 1999/0807/sys/src/9/mpc/devsac.c:431,440 | ||
| 1999/0608 | for(i=off; i<off+cnt; i++) { j = i/per; if(j != iblock) { | |
| 1999/0807 | n = per; if(n > ndir-j*per) n = ndir-j*per; loadblock(buf, blocks + j*OffsetSize, n*sizeof(SacDir)); | |
| 1999/0608 | iblock = j; } j *= per; | |
| 1999/0806/sys/src/9/mpc/devsac.c:438,444 – 1999/0807/sys/src/9/mpc/devsac.c:449,455 | ||
| 1999/0608 | saclookup(Sac *s, char *name) { int ndir; | |
| 1999/0609 |
| |
| 1999/0807 | int i, j, k, n, per; | |
| 1999/0608 | uchar *blocks; SacDir *buf; int iblock; | |
| 1999/0806/sys/src/9/mpc/devsac.c:446,454 – 1999/0807/sys/src/9/mpc/devsac.c:457,465 | ||
| 1999/0608 | if(strcmp(name, "..") == 0) return sacparent(s); | |
| 1999/0807 | blocks = data + getl(s->blocks); | |
| 1999/0608 | per = blocksize/sizeof(SacDir); | |
| 1999/0807 | ndir = getl(s->length); | |
| 1999/0608 | buf = malloc(per*sizeof(SacDir)); iblock = -1; | |
| 1999/0806/sys/src/9/mpc/devsac.c:456,462 – 1999/0807/sys/src/9/mpc/devsac.c:467,476 | ||
| 1999/0609 | for(i=0; i<ndir; i++) { | |
| 1999/0608 | j = i/per; if(j != iblock) { | |
| 1999/0807 | n = per; if(n > ndir-j*per) n = ndir-j*per; loadblock(buf, blocks + j*OffsetSize, n*sizeof(SacDir)); | |
| 1999/0608 | iblock = j; } j *= per; | |
| 1999/0806/sys/src/9/mpc/devsac.c:463,469 – 1999/0807/sys/src/9/mpc/devsac.c:477,483 | ||
| 1999/0608 | sd = buf+i-j; k = strcmp(name, sd->name); if(k == 0) { | |
| 1999/0609 |
| |
| 1999/0807 | s->path = sacpathalloc(s->path, getl(s->blocks), i, ndir); | |
| 1999/0608 | s->SacDir = *sd; free(buf); | |
| 1999/0609 | return s; | |
| 1999/0806/sys/src/9/mpc/devsac.c:479,501 – 1999/0807/sys/src/9/mpc/devsac.c:493,498 | ||
| 1999/0608 | uchar *a = p; return (a[0]<<24) | (a[1]<<16) | (a[2]<<8) | a[3]; | |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807/sys/src/9/mpc/devsac.c:162,167 – 1999/1231/sys/src/9/mpc/devsac.c:162,169 (short | long) | ||
| 1999/0608 | isdir(c); | |
| 1999/0609 | if(name[0]=='.' && name[1]==0) | |
| 1999/0608 | return 1; | |
| 1999/1231 | if(name[0]=='.' && name[1]=='.' && name[2]==0) return 1; | |
| 1999/0609 | sac = c->aux; | |
| 1999/0608 | sac = saclookup(sac, name); if(sac == nil) { | |
| 1999/1231/sys/src/9/mpc/devsac.c:6,18 – 2000/0516/sys/src/9/mpc/devsac.c:6,11 (short | long) | ||
| 1999/0608 | #include "io.h" | |
| 1999/0609 | #include "../port/error.h" | |
| 1999/0608 |
| |
| 1999/1231/sys/src/9/mpc/devsac.c:85,91 – 2000/0516/sys/src/9/mpc/devsac.c:78,85 | ||
| 1999/0608 | Powner = 64, }; | |
| 1999/0609 |
| |
| 2000/0516 | static char *sacfs = "fs.sac"; static uchar *data; | |
| 1999/0609 | static int blocksize; static Sac root; | |
| 1999/0806 | static Cache cache[CacheSize]; | |
| 1999/1231/sys/src/9/mpc/devsac.c:104,112 – 2000/0516/sys/src/9/mpc/devsac.c:98,123 | ||
| 1999/0608 | { SacHeader *hdr; | |
| 1999/0806 | uchar *p; | |
| 2000/0516 | char *s; | |
| 1999/0806 | int i; | |
| 1999/0609 | print("sacinit\n"); | |
| 2000/0516 | s = getconf("flash"); if(s == nil) { print("devsac: no flash file system\n"); return; } p = (uchar*)strtoul(s, 0, 0); if(p == 0) { print("devsac: bad address for flash file system\n"); return; } data = tarlookup(p, sacfs, &i); if(data == 0) { print("devsac: could not find file: %s\n", sacfs); return; } | |
| 1999/0608 | hdr = (SacHeader*)data; if(getl(hdr->magic) != Magic) { | |
| 1999/0609 | print("devsac: bad magic\n"); | |
| 2000/0516/sys/src/9/mpc/devsac.c:173,180 – 2000/1208/sys/src/9/mpc/devsac.c:173,178 (short | long) | ||
| 1999/0608 | isdir(c); | |
| 1999/0609 | if(name[0]=='.' && name[1]==0) | |
| 1999/0608 | return 1; | |
| 1999/1231 |
| |
| 1999/0609 | sac = c->aux; | |
| 1999/0608 | sac = saclookup(sac, name); if(sac == nil) { | |
| 2000/1208/sys/src/9/mpc/devsac.c:1,528 – 2001/0527/sys/src/9/mpc/devsac.c:0 (short | long) | ||
|
Deleted.
rsc Mon Mar 7 10:28:39 2005 | ||
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0806 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0806 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0806 |
| |
| 1999/0608 |
| |
| 2000/0516 |
| |
| 1999/0609 |
| |
| 1999/0806 |
| |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0806 |
| |
| 2000/0516 |
| |
| 1999/0806 |
| |
| 1999/0609 |
| |
| 2000/0516 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0806 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0610 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0807 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0609 |
| |
| 1999/0610 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0806 |
| |
| 1999/0608 | ||
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0806 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0806 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0609 |
| |
| 1999/0608 | ||
| 1999/0609 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0807 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |
| 1999/0609 |
| |
| 1999/0608 |
| |