git: 9front

Download patch

ref: 1e6334b12ded6f28ed91c372f1d3e6d7c41a9a99
parent: 7a43f27b2a0c19c52f9245d244bf26f566a834c6
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Jun 18 18:09:40 EDT 2013

devsrv, devshr: wstat permissions

update permissions last in wstat so it will only get changed when there was
no error.

--- a/sys/src/9/port/devshr.c
+++ b/sys/src/9/port/devshr.c
@@ -654,8 +654,6 @@
 	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);
@@ -665,6 +663,8 @@
 	}
 	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:
--- a/sys/src/9/port/devsrv.c
+++ b/sys/src/9/port/devsrv.c
@@ -272,8 +272,6 @@
 	if(strcmp(sp->owner, up->user) != 0 && !iseve())
 		error(Eperm);
 
-	if(d.mode != ~0UL)
-		sp->perm = d.mode & 0777;
 	if(d.name != nil && *d.name && strcmp(sp->name, d.name) != 0) {
 		if(strchr(d.name, '/') != nil)
 			error(Ebadchar);
@@ -283,6 +281,8 @@
 	}
 	if(d.uid != nil && *d.uid)
 		kstrdup(&sp->owner, d.uid);
+	if(d.mode != ~0UL)
+		sp->perm = d.mode & 0777;
 
 	qunlock(&srvlk);
 	poperror();
--