shithub: riscv

Download patch

ref: 84109a3159249369d1869fd887a7040b766e4540
parent: 52a84514acca8c2afc7e33c6f3f7d95235cad75e
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;
 }
 
--