Sch *sch;
Shr *shr;
Mpt *mpt;
+ int mode;
if(c->qid.type == QTDIR && omode != OREAD)
error(Eisdir);
+ mode = openmode(omode);
sch = tosch(c);
switch(sch->level){
default:
case Qshr:
case Qcshr:
shr = sch->shr;
- devpermcheck(shr->owner, shr->perm, openmode(omode));
+ devpermcheck(shr->owner, shr->perm, mode);
break;
case Qcmpt:
if(omode&OTRUNC)
error(Eexist);
shr = sch->shr;
mpt = sch->mpt;
- devpermcheck(mpt->owner, mpt->perm, openmode(omode));
+ devpermcheck(mpt->owner, mpt->perm, mode);
rlock(&shr->umh.lock);
if(mpt->m.to == nil || mpt->m.to->mchan == nil){
runlock(&shr->umh.lock);
nc = mpt->m.to->mchan;
incref(nc);
runlock(&shr->umh.lock);
- if(openmode(omode) != nc->mode){
+ if(mode != nc->mode){
cclose(nc);
error(Eperm);
}
cclose(c);
return nc;
}
- c->mode = openmode(omode);
+ c->mode = mode;
c->flag |= COPEN;
c->offset = 0;
return c;
Mhead *h;
Mount *m;
Chan *nc;
+ int mode;
+ mode = openmode(omode);
sch = tosch(c);
switch(sch->level){
case Qcroot:
case Qcroot:
if(up->pgrp->noattach)
error(Enoattach);
- if((perm & DMDIR) == 0 || openmode(omode) != OREAD)
+ if((perm & DMDIR) == 0 || mode != OREAD)
error(Eperm);
if(strlen(name) >= sizeof(up->genbuf))
error(Etoolong);
case Qcshr:
if(up->pgrp->noattach)
error(Enoattach);
- if((perm & DMDIR) != 0 || openmode(omode) != OWRITE)
+ if((perm & DMDIR) != 0 || mode != OWRITE)
error(Eperm);
shr = sch->shr;
incref(mpt);
mpt->m.mflag = (h->mount == nil) ? MCREATE : 0;
- mpt->m.head = h;
mpt->m.next = h->mount;
h->mount = &mpt->m;
break;
}
c->flag |= COPEN;
- c->mode = openmode(omode);
+ c->mode = mode;
return c;
}
if(*ml == m){
*ml = m->next;
m->next = nil;
- m->head = nil;
putmpt(mpt);
break;
}
if(strcmp(ent->owner, up->user) && !iseve())
error(Eperm);
- if(d.mode != ~0UL)
- ent->perm = d.mode & 0777;
if(d.name != nil && *d.name && strcmp(ent->name, d.name) != 0) {
if(strchr(d.name, '/') != nil)
error(Ebadchar);
}
if(d.uid != nil && *d.uid)
kstrdup(&ent->owner, d.uid);
+ if(d.mode != ~0UL)
+ ent->perm = d.mode & 0777;
switch(sch->level){
case Qcshr:
Chan *bc, *c0;
Mhead *h;
Mount *m;
- struct{
- Chan *chan;
- Chan *authchan;
- char *spec;
- int flags;
- }bogus;
if(up->pgrp->noattach)
error(Enoattach);
cclose(bc);
nexterror();
}
- bogus.flags = 0;
- bogus.chan = bc;
- bogus.authchan = nil;
- bogus.spec = aname;
- c0 = devtab[devno('M', 0)]->attach((char*)&bogus);
+ c0 = mntattach(bc, nil, aname, 0);
poperror();
cclose(bc);
poperror();