diff options
author | Robert Morris <rtm@csail.mit.edu> | 2019-06-04 05:57:47 -0400 |
---|---|---|
committer | Robert Morris <rtm@csail.mit.edu> | 2019-06-04 05:57:47 -0400 |
commit | 8baac760500980d4b83e8de2e90265bfaa19df13 (patch) | |
tree | ceb59412ec44ff98c1281627fb648deaeedb0d04 /console.c | |
parent | cefe223bf5e4b68e5c1202f2f089a164ad656621 (diff) | |
download | xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.tar.gz xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.tar.bz2 xv6-labs-8baac760500980d4b83e8de2e90265bfaa19df13.zip |
support read() and write() bigger than one page
Diffstat (limited to 'console.c')
-rw-r--r-- | console.c | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -155,10 +155,11 @@ struct { #define C(x) ((x)-'@') // Contro int -consoleread(struct inode *ip, char *dst, int n) +consoleread(struct inode *ip, int user_dst, uint64 dst, int n) { uint target; int c; + char buf[1]; iunlock(ip); target = n; @@ -181,7 +182,10 @@ consoleread(struct inode *ip, char *dst, int n) } break; } - *dst++ = c; + buf[0] = c; + if(either_copyout(user_dst, dst, &buf[0], 1) == -1) + break; + dst++; --n; if(c == '\n') break; @@ -193,14 +197,18 @@ consoleread(struct inode *ip, char *dst, int n) } int -consolewrite(struct inode *ip, char *buf, int n) +consolewrite(struct inode *ip, int user_src, uint64 src, int n) { int i; iunlock(ip); acquire(&cons.lock); - for(i = 0; i < n; i++) - consputc(buf[i] & 0xff); + for(i = 0; i < n; i++){ + char c; + if(either_copyin(&c, user_src, src, 1) == -1) + break; + consputc(c); + } release(&cons.lock); ilock(ip); |