summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vt/fs.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2017-10-20 20:31:30 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2017-10-20 20:31:30 +0200
commit67d9c6b2f98888dc81154b0499bbd26171f908a6 (patch)
treeabb0a3d663e01c062a5b76af18cc7716530dc58f /sys/src/cmd/vt/fs.c
parent29411f58cfa62a7d05713070338d82b722364665 (diff)
vt: block when sending input to host (fixes truncated paste)
Diffstat (limited to 'sys/src/cmd/vt/fs.c')
-rw-r--r--sys/src/cmd/vt/fs.c29
1 files changed, 14 insertions, 15 deletions
diff --git a/sys/src/cmd/vt/fs.c b/sys/src/cmd/vt/fs.c
index 1c2b5ca23..bf66972b4 100644
--- a/sys/src/cmd/vt/fs.c
+++ b/sys/src/cmd/vt/fs.c
@@ -19,17 +19,16 @@ static void
fsreader(void*)
{
Req *r, *fr;
- Buf *b;
- int n;
+ char *s, *p;
- b = nil;
r = nil;
+ s = p = nil;
for(;;){
Alt a[] = {
{ flushreq, &fr, CHANRCV },
{ readreq, &r, r == nil ? CHANRCV : CHANNOP },
- { hc[0], &b, b == nil ? CHANRCV : CHANNOP },
- { nil, nil, b == nil || r == nil ? CHANEND : CHANNOBLK },
+ { hc[0], &s, s == nil ? CHANRCV : CHANNOP },
+ { nil, nil, s == nil || r == nil ? CHANEND : CHANNOBLK },
};
if(alt(a) == 0){
if(fr->oldreq == r){
@@ -38,18 +37,18 @@ fsreader(void*)
}
respond(fr, nil);
}
- if(b == nil || r == nil)
+ if(s == nil || r == nil)
continue;
+ if(p == nil)
+ p = s;
r->ofcall.count = 0;
- while((n = r->ifcall.count - r->ofcall.count) > 0){
- if(n > b->n)
- n = b->n;
- memmove((char*)r->ofcall.data + r->ofcall.count, b->s, n);
- r->ofcall.count += n;
- b->s += n, b->n -= n;
- if(b->n <= 0){
- free(b);
- if((b = nbrecvp(hc[0])) == nil)
+ while(r->ifcall.count > r->ofcall.count){
+ if(*p == 0)
+ break;
+ r->ofcall.data[r->ofcall.count++] = *p++;
+ if(*p == 0){
+ free(s);
+ if((p = s = nbrecvp(hc[0])) == nil)
break;
}
}