From 511bd861436ccf901394426164b72c00d6f246db Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 25 Mar 2003 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2003-03-25 --- pc/devfloppy.c | 5 +++ port/dev.c | 13 ++++++- port/devenv.c | 104 ++++++++++++++++++++++++++++++------------------- port/portdat.h | 4 +- 4 files changed, 82 insertions(+), 44 deletions(-) diff --git a/pc/devfloppy.c b/pc/devfloppy.c index 56e863e977b5c63719eeb9a9616d3ce0cdbdd61c..806b4546d35e5d52b5ec02c74497e57f34a4ff76 100644 --- a/pc/devfloppy.c +++ b/pc/devfloppy.c @@ -119,6 +119,7 @@ Dirtab floppydir[]={ enum { CMdebug, + CMnodebug, CMeject, CMformat, CMreset, @@ -127,6 +128,7 @@ enum static Cmdtab floppyctlmsg[] = { CMdebug, "debug", 1, + CMnodebug, "nodebug", 1, CMeject, "eject", 1, CMformat, "format", 0, CMreset, "reset", 1, @@ -474,6 +476,9 @@ floppywrite(Chan *c, void *a, long n, vlong off) case CMdebug: floppydebug = 1; break; + case CMnodebug: + floppydebug = 0; + break; } poperror(); qunlock(&fl); diff --git a/port/dev.c b/port/dev.c index f366f291329995c45cabd75862f05c5348fadf13..f585acc0484a7617b723e335f390e7c9d9f47e27 100644 --- a/port/dev.c +++ b/port/dev.c @@ -83,11 +83,20 @@ devdir(Chan *c, Qid qid, char *n, vlong length, char *user, long perm, Dir *db) * the zeroth element of the table MUST be the directory itself for .. */ int -devgen(Chan *c, char*, Dirtab *tab, int ntab, int i, Dir *dp) +devgen(Chan *c, char *name, Dirtab *tab, int ntab, int i, Dir *dp) { if(tab == 0) return -1; - if(i != DEVDOTDOT){ + if(i == DEVDOTDOT){ + /* nothing */ + }else if(name){ + for(i=1; i= ntab) diff --git a/port/devenv.c b/port/devenv.c index a922193587c7e986e6956683f97cf024cc80fcd6..4df4496cca45db96f5e2ab7a03e1ecb342e9ca4b 100644 --- a/port/devenv.c +++ b/port/devenv.c @@ -15,8 +15,22 @@ static int envwriteable(Chan *c); static Egrp confegrp; /* global environment group containing the kernel configuration */ +static Evalue* +envlookup(Egrp *eg, char *name, ulong qidpath) +{ + Evalue *e; + int i; + + for(i=0; inent; i++){ + e = eg->ent[i]; + if(e->qid.path == qidpath || (name && e->name[0]==name[0] && strcmp(e->name, name) == 0)) + return e; + } + return nil; +} + static int -envgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp) +envgen(Chan *c, char *name, Dirtab*, int, int s, Dir *dp) { Egrp *eg; Evalue *e; @@ -28,8 +42,11 @@ envgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp) eg = envgrp(c); rlock(eg); - for(e = eg->entries; e && s; e = e->link) - s--; + e = 0; + if(name) + e = envlookup(eg, name, -1); + else if(s < eg->nent) + e = eg->ent[s]; if(e == 0) { runlock(eg); @@ -43,16 +60,6 @@ envgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp) return 1; } -static Evalue* -envlookup(Egrp *eg, char *name, ulong qidpath) -{ - Evalue *e; - for(e = eg->entries; e; e = e->link) - if(e->qid.path == qidpath || (name && strcmp(e->name, name) == 0)) - return e; - return nil; -} - static Chan* envattach(char *spec) { @@ -135,6 +142,7 @@ envcreate(Chan *c, char *name, int omode, ulong) { Egrp *eg; Evalue *e; + Evalue **ent; if(c->qid.type != QTDIR) error(Eperm); @@ -155,11 +163,18 @@ envcreate(Chan *c, char *name, int omode, ulong) e->name = smalloc(strlen(name)+1); strcpy(e->name, name); + if(eg->nent == eg->ment){ + eg->ment += 32; + ent = smalloc(sizeof(eg->ent[0])*eg->ment); + if(eg->nent) + memmove(ent, eg->ent, sizeof(eg->ent[0])*eg->nent); + free(eg->ent); + eg->ent = ent; + } e->qid.path = ++eg->path; e->qid.vers = 0; eg->vers++; - e->link = eg->entries; - eg->entries = e; + eg->ent[eg->nent++] = e; c->qid = e->qid; wunlock(eg); @@ -173,29 +188,28 @@ envcreate(Chan *c, char *name, int omode, ulong) static void envremove(Chan *c) { + int i; Egrp *eg; - Evalue *e, **l; + Evalue *e; if(c->qid.type & QTDIR) error(Eperm); eg = envgrp(c); wlock(eg); - l = &eg->entries; - for(e = *l; e; e = e->link) { - if(e->qid.path == c->qid.path) + e = 0; + for(i=0; inent; i++){ + if(eg->ent[i]->qid.path == c->qid.path){ + e = eg->ent[i]; + eg->nent--; + eg->ent[i] = eg->ent[eg->nent]; + eg->vers++; break; - l = &e->link; - } - - if(e == 0) { - wunlock(eg); - error(Enonexist); + } } - - *l = e->link; - eg->vers++; wunlock(eg); + if(e == 0) + error(Enonexist); free(e->name); if(e->value) free(e->value); @@ -308,39 +322,44 @@ Dev envdevtab = { void envcpy(Egrp *to, Egrp *from) { - Evalue **l, *ne, *e; + int i; + Evalue *ne, *e; - l = &to->entries; rlock(from); - for(e = from->entries; e; e = e->link) { + to->ment = (from->nent+31)&~31; + to->ent = smalloc(to->ment*sizeof(to->ent[0])); + for(i=0; inent; i++){ + e = from->ent[i]; ne = smalloc(sizeof(Evalue)); ne->name = smalloc(strlen(e->name)+1); strcpy(ne->name, e->name); - if(e->value) { + if(e->value){ ne->value = smalloc(e->len); memmove(ne->value, e->value, e->len); ne->len = e->len; } ne->qid.path = ++to->path; - *l = ne; - l = &ne->link; + to->ent[i] = ne; } + to->nent = from->nent; runlock(from); } void closeegrp(Egrp *eg) { - Evalue *e, *next; + int i; + Evalue *e; - if(decref(eg) == 0) { - for(e = eg->entries; e; e = next) { - next = e->link; + if(decref(eg) == 0){ + for(i=0; inent; i++){ + e = eg->ent[i]; free(e->name); if(e->value) free(e->value); free(e); } + free(eg->ent); free(eg); } } @@ -385,7 +404,7 @@ getconfenv(void) Egrp *eg = &confegrp; Evalue *e; char *p, *q; - int n; + int i, n; rlock(eg); if(waserror()) { @@ -395,13 +414,16 @@ getconfenv(void) /* determine size */ n = 0; - for(e=eg->entries; e; e=e->link) + for(i=0; inent; i++){ + e = eg->ent[i]; n += strlen(e->name) + e->len + 2; + } p = malloc(n + 1); if(p == nil) error(Enomem); q = p; - for(e=eg->entries; e; e=e->link) { + for(i=0; inent; i++){ + e = eg->ent[i]; strcpy(q, e->name); q += strlen(q) + 1; memmove(q, e->value, e->len); diff --git a/port/portdat.h b/port/portdat.h index d7da58ccd9b192a3352b6be6982f68208fe6c4c4..fa464013b2a83593e4a4bf0c3cb678352da5624f 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -441,7 +441,9 @@ struct Egrp { Ref; RWlock; - Evalue *entries; + Evalue **ent; + int nent; + int ment; ulong path; /* qid.path of next Evalue to be allocated */ ulong vers; /* of Egrp */ };