ref: 86c008e45d78ba698bafb3265f18794975209712
parent: 3047fe8ab68b8db233cbe02e44b55810bb45a93d
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Aug 27 19:27:46 EDT 2013
devshr, devaudio: openmode()/devopen() error handling
--- a/sys/src/9/port/devaudio.c
+++ b/sys/src/9/port/devaudio.c
@@ -177,18 +177,28 @@
adev = ac->adev;
if(c->qid.path == Qaudio){mode = openmode(omode);
- if(mode == OWRITE || mode == ORDWR)
- if(incref(&adev->audioopenw) != 1){- decref(&adev->audioopenw);
- error(Ebusy);
- }
- if(mode == OREAD || mode == ORDWR)
- if(incref(&adev->audioopenr) != 1){+ if(waserror()){+ if(mode == OREAD || mode == ORDWR)
decref(&adev->audioopenr);
- if(mode == ORDWR)
- decref(&adev->audioopenw);
+ nexterror();
+ }
+ if(mode == OREAD || mode == ORDWR)
+ if(incref(&adev->audioopenr) != 1)
error(Ebusy);
- }
+
+ if(waserror()){+ if(mode == OWRITE || mode == ORDWR)
+ decref(&adev->audioopenw);
+ nexterror();
+ }
+ if(mode == OWRITE || mode == ORDWR)
+ if(incref(&adev->audioopenw) != 1)
+ error(Ebusy);
+
+ c = devopen(c, omode, audiodir, nelem(audiodir), devgen);
+ poperror();
+ poperror();
+ return c;
}
return devopen(c, omode, audiodir, nelem(audiodir), devgen);
}
--- a/sys/src/9/port/devshr.c
+++ b/sys/src/9/port/devshr.c
@@ -375,10 +375,12 @@
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:
@@ -389,7 +391,7 @@
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)
@@ -396,7 +398,7 @@
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);
@@ -405,7 +407,7 @@
nc = mpt->m.to->mchan;
incref(nc);
runlock(&shr->umh.lock);
- if(openmode(omode) != nc->mode){+ if(mode != nc->mode){cclose(nc);
error(Eperm);
}
@@ -412,7 +414,7 @@
cclose(c);
return nc;
}
- c->mode = openmode(omode);
+ c->mode = mode;
c->flag |= COPEN;
c->offset = 0;
return c;
@@ -430,7 +432,9 @@
Mhead *h;
Mount *m;
Chan *nc;
+ int mode;
+ mode = openmode(omode);
sch = tosch(c);
switch(sch->level){case Qcroot:
@@ -460,7 +464,7 @@
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);
@@ -494,7 +498,7 @@
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;
@@ -539,7 +543,7 @@
break;
}
c->flag |= COPEN;
- c->mode = openmode(omode);
+ c->mode = mode;
return c;
}
--
⑨