diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-18 22:02:07 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-06-18 22:02:07 +0200 |
commit | 4b9845d942aa02b54751240ef50e479a370bb549 (patch) | |
tree | 5a7d71c0b54759038b223afce6b614df340695cc /sys/src/9/port/devshr.c | |
parent | b302cc1097773066a42bbab82ead0a4747fa1789 (diff) |
devshr: fix wstat, style
- same problem with wstat, if we error then owner has been already updated...
- avoid smalloc while holding qlock in wstat, do it before
- pikeshedd style...
Diffstat (limited to 'sys/src/9/port/devshr.c')
-rw-r--r-- | sys/src/9/port/devshr.c | 69 |
1 files changed, 36 insertions, 33 deletions
diff --git a/sys/src/9/port/devshr.c b/sys/src/9/port/devshr.c index 35e73629b..03739a31d 100644 --- a/sys/src/9/port/devshr.c +++ b/sys/src/9/port/devshr.c @@ -89,7 +89,7 @@ putmpt(Mpt *mpt) { if(decref(mpt)) return; - if(mpt->m.to) + if(mpt->m.to != nil) cclose(mpt->m.to); free(mpt->name); free(mpt->owner); @@ -148,9 +148,9 @@ shrclone(Chan *c) nc = devclone(c); sch = smalloc(sizeof(*sch)); memmove(sch, och, sizeof(*sch)); - if(sch->shr) + if(sch->shr != nil) incref(sch->shr); - if(sch->mpt) + if(sch->mpt != nil) incref(sch->mpt); sch->chan = nc; nc->aux = sch; @@ -165,9 +165,9 @@ shrclunk(Chan *c) sch = tosch(c); c->aux = nil; sch->chan = nil; - if(sch->mpt) + if(sch->mpt != nil) putmpt(sch->mpt); - if(sch->shr) + if(sch->shr != nil) putshr(sch->shr); free(sch); } @@ -226,7 +226,7 @@ shrwalk(Chan *c, Chan *nc, char **name, int nname) sch->shr = nil; } else if(sch->level == Qcroot || sch->level == Qroot) { qlock(&shrslk); - for(shr = shrs; shr; shr = shr->next) + for(shr = shrs; shr != nil; shr = shr->next) if(strcmp(nam, shr->name) == 0){ incref(shr); break; @@ -242,7 +242,7 @@ shrwalk(Chan *c, Chan *nc, char **name, int nname) shr = sch->shr; h = &shr->umh; rlock(&h->lock); - for(m = h->mount; m; m = m->next){ + for(m = h->mount; m != nil; m = m->next){ mpt = tompt(m); if(strcmp(nam, mpt->name) == 0){ incref(mpt); @@ -259,7 +259,7 @@ shrwalk(Chan *c, Chan *nc, char **name, int nname) h = &shr->umh; wq2 = nil; rlock(&h->lock); - for(m = h->mount; m && wq2 == nil; m = m->next){ + for(m = h->mount; m != nil && wq2 == nil; m = m->next){ if(m->to == nil) continue; if(waserror()) @@ -302,7 +302,7 @@ shrgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp) case Qroot: case Qcroot: qlock(&shrslk); - for(shr = shrs; shr && s; shr = shr->next) + for(shr = shrs; shr != nil && s > 0; shr = shr->next) s--; if(shr == nil){ qunlock(&shrslk); @@ -321,7 +321,7 @@ shrgen(Chan *c, char*, Dirtab*, int, int s, Dir *dp) shr = sch->shr; h = &shr->umh; rlock(&h->lock); - for(m = h->mount; m && s; m = m->next) + for(m = h->mount; m != nil && s > 0; m = m->next) s--; if(m == nil){ runlock(&h->lock); @@ -469,7 +469,7 @@ shrcreate(Chan *c, char *name, int omode, ulong perm) qunlock(&shrslk); nexterror(); } - for(shr = shrs; shr; shr = shr->next) + for(shr = shrs; shr != nil; shr = shr->next) if(strcmp(name, shr->name) == 0) error(Eexist); @@ -494,7 +494,7 @@ shrcreate(Chan *c, char *name, int omode, ulong perm) case Qcshr: if(up->pgrp->noattach) error(Enoattach); - if((perm & DMDIR) || openmode(omode) != OWRITE) + if((perm & DMDIR) != 0 || openmode(omode) != OWRITE) error(Eperm); shr = sch->shr; @@ -511,7 +511,7 @@ shrcreate(Chan *c, char *name, int omode, ulong perm) wunlock(&h->lock); nexterror(); } - for(m = h->mount; m; m = m->next){ + for(m = h->mount; m != nil; m = m->next){ mpt = tompt(m); if(strcmp(name, mpt->name) == 0) error(Eexist); @@ -574,13 +574,13 @@ shrremove(Chan *c) h = &shr->umh; qlock(&shrslk); rlock(&h->lock); - if(h->mount){ + if(h->mount != nil){ runlock(&h->lock); qunlock(&shrslk); error("directory not empty"); } runlock(&h->lock); - for(sl = &shrs; *sl; sl = &((*sl)->next)) + for(sl = &shrs; *sl != nil; sl = &((*sl)->next)) if(*sl == shr){ *sl = shr->next; shr->next = nil; @@ -594,7 +594,7 @@ shrremove(Chan *c) m = &mpt->m; h = &shr->umh; wlock(&h->lock); - for(ml = &h->mount; *ml; ml = &((*ml)->next)) + for(ml = &h->mount; *ml != nil; ml = &((*ml)->next)) if(*ml == m){ *ml = m->next; m->next = nil; @@ -618,6 +618,15 @@ shrwstat(Chan *c, uchar *dp, int n) Ent *ent; Dir d; + strs = smalloc(n); + if(waserror()){ + free(strs); + nexterror(); + } + n = convM2D(dp, n, &d, strs); + if(n == 0) + error(Eshortstat); + h = nil; sch = tosch(c); switch(sch->level){ @@ -645,27 +654,17 @@ shrwstat(Chan *c, uchar *dp, int n) if(strcmp(ent->owner, up->user) && !iseve()) error(Eperm); - strs = smalloc(n); - if(waserror()){ - free(strs); - nexterror(); - } - n = convM2D(dp, n, &d, strs); - if(n == 0) - error(Eshortstat); if(d.mode != ~0UL) ent->perm = d.mode & 0777; - if(d.uid && *d.uid) - kstrdup(&ent->owner, d.uid); - if(d.name && *d.name && strcmp(ent->name, d.name) != 0) { + if(d.name != nil && *d.name && strcmp(ent->name, d.name) != 0) { if(strchr(d.name, '/') != nil) error(Ebadchar); if(strlen(d.name) >= sizeof(up->genbuf)) error(Etoolong); kstrdup(&ent->name, d.name); } - poperror(); - free(strs); + if(d.uid != nil && *d.uid) + kstrdup(&ent->owner, d.uid); switch(sch->level){ case Qcshr: @@ -677,6 +676,10 @@ shrwstat(Chan *c, uchar *dp, int n) wunlock(&h->lock); break; } + + poperror(); + free(strs); + return n; } @@ -771,7 +774,7 @@ shrwrite(Chan *c, void *va, long n, vlong) m->to = c0; wunlock(&h->lock); - if(bc) + if(bc != nil) cclose(bc); return n; @@ -810,7 +813,7 @@ Dev shrdevtab = { static void chowner(Ent *ent, char *old, char *new) { - if(ent->owner!=nil && strcmp(old, ent->owner)==0) + if(ent->owner != nil && strcmp(old, ent->owner) == 0) kstrdup(&ent->owner, new); } @@ -821,9 +824,9 @@ shrrenameuser(char *old, char *new) Mount *m; qlock(&shrslk); - for(shr = shrs; shr; shr = shr->next){ + for(shr = shrs; shr != nil; shr = shr->next){ wlock(&shr->umh.lock); - for(m = shr->umh.mount; m; m = m->next) + for(m = shr->umh.mount; m != nil; m = m->next) chowner(tompt(m), old, new); wunlock(&shr->umh.lock); chowner(shr, old, new); |