summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vnc/wsys.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-10-09 16:22:19 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-10-09 16:22:19 +0200
commitca9f286b6cb434790c2d084117e119b088b49061 (patch)
tree6eb6dd2bfd805cca1b565f00d73eb903bd0fb38a /sys/src/cmd/vnc/wsys.c
parent6f2ea2881704cf8c1e54c8688c045d038cd7cefd (diff)
vncv: cleanup
Diffstat (limited to 'sys/src/cmd/vnc/wsys.c')
-rw-r--r--sys/src/cmd/vnc/wsys.c57
1 files changed, 34 insertions, 23 deletions
diff --git a/sys/src/cmd/vnc/wsys.c b/sys/src/cmd/vnc/wsys.c
index 6b19cfb01..08e0e1946 100644
--- a/sys/src/cmd/vnc/wsys.c
+++ b/sys/src/cmd/vnc/wsys.c
@@ -178,7 +178,7 @@ tcs(int fd0, int fd1)
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 @@ Dup:
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 @@ writesnarf(Vnc *v, long n)
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;
- }
- while(n > 0){
- m = n;
- if(m > sizeof(buf))
- m = sizeof(buf);
- vncrdbytes(v, buf, m);
- n -= m;
- write(fd, buf, m);
+ 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();
}
- close(fd);
- snarfvers++;
+ gotsnarf();
vncunlock(v);
}
@@ -262,6 +277,7 @@ getsnarf(int *sz)
}
}
close(fd);
+ waitpid();
}
return snarf;
}
@@ -269,7 +285,6 @@ getsnarf(int *sz)
void
checksnarf(Vnc *v)
{
- Dir *dir;
char *snarf;
int len;
@@ -283,10 +298,7 @@ checksnarf(Vnc *v)
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 @@ checksnarf(Vnc *v)
free(snarf);
}
- free(dir);
vncunlock(v);
}
}