git: 9front

Download patch

ref: 19c87dbfd26bc5a183005492db2b5164c43c9f01
parent: a8905cea5d218b1285e35e9eacf73846d42ab151
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Oct 9 12:22:19 EDT 2012

vncv: cleanup

--- a/sys/src/cmd/vnc/wsys.c
+++ b/sys/src/cmd/vnc/wsys.c
@@ -178,7 +178,7 @@
 		goto Dup;
 	if(pipe(pfd) < 0)
 		goto Dup;
-	switch(rfork(RFPROC|RFFDG|RFMEM|RFNOWAIT)){
+	switch(rfork(RFPROC|RFFDG|RFMEM)){
 	case -1:
 		close(pfd[0]);
 		close(pfd[1]);
@@ -208,6 +208,22 @@
 static int snarffd = -1;
 static ulong snarfvers;
 
+static int
+gotsnarf(void)
+{
+	Dir *dir;
+	int ret;
+
+	if(snarffd < 0 || (dir = dirfstat(snarffd)) == nil)
+		return 0;
+
+	ret = dir->qid.vers != snarfvers;
+	snarfvers = dir->qid.vers;
+	free(dir);
+
+	return ret;
+}
+
 void 
 writesnarf(Vnc *v, long n)
 {
@@ -216,27 +232,26 @@
 	long m;
 
 	vnclock(v);
-	if((sfd = create("/dev/snarf", OWRITE, 0666)) < 0)
-		fd = -1;
-	else {
+	fd = -1;
+	if((sfd = create("/dev/snarf", OWRITE, 0666)) >= 0){
 		fd = tcs(-1, sfd);
 		close(sfd);
 	}
-	if(fd < 0){
-		vncunlock(v);
+	if(fd < 0)
 		vncgobble(v, n);
-		return;
+	else {
+		while(n > 0){
+			m = n;
+			if(m > sizeof(buf))
+				m = sizeof(buf);
+			vncrdbytes(v, buf, m);
+			n -= m;
+			write(fd, buf, m);
+		}
+		close(fd);
+		waitpid();
 	}
-	while(n > 0){
-		m = n;
-		if(m > sizeof(buf))
-			m = sizeof(buf);
-		vncrdbytes(v, buf, m);
-		n -= m;
-		write(fd, buf, m);
-	}
-	close(fd);
-	snarfvers++;
+	gotsnarf();
 	vncunlock(v);
 }
 
@@ -262,6 +277,7 @@
 			}
 		}
 		close(fd);
+		waitpid();
 	}
 	return snarf;
 }
@@ -269,7 +285,6 @@
 void
 checksnarf(Vnc *v)
 {
-	Dir *dir;
 	char *snarf;
 	int len;
 
@@ -283,10 +298,7 @@
 		sleep(1000);
 
 		vnclock(v);
-		dir = dirfstat(snarffd);
-		if(dir != nil && dir->qid.vers != snarfvers){
-			snarfvers = dir->qid.vers;
-
+		if(gotsnarf()){
 			snarf = getsnarf(&len);
 
 			vncwrchar(v, MCCut);
@@ -297,7 +309,6 @@
 
 			free(snarf);
 		}
-		free(dir);
 		vncunlock(v);
 	}
 }
--