M pc/devfloppy.c => pc/devfloppy.c +5 -0
@@ 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);
M port/dev.c => port/dev.c +11 -2
@@ 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; i++)
+ if(strcmp(tab[i].name, name) == 0)
+ break;
+ if(i==ntab)
+ return -1;
+ tab += i;
+ }else{
/* skip over the first element, that for . itself */
i++;
if(i >= ntab)
M port/devenv.c => port/devenv.c +63 -41
@@ 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; i<eg->nent; 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; i<eg->nent; 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; i<from->nent; 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; i<eg->nent; 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; i<eg->nent; 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; i<eg->nent; i++){
+ e = eg->ent[i];
strcpy(q, e->name);
q += strlen(q) + 1;
memmove(q, e->value, e->len);
M port/portdat.h => port/portdat.h +3 -1
@@ 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 */
};