Mercurial > hg > Papers > 2019 > mitsuki-master
view paper/src/console.c @ 51:3179b8daa958
update
author | mir3636 |
---|---|
date | Mon, 11 Feb 2019 23:22:07 +0900 |
parents | 891a05313312 |
children |
line wrap: on
line source
int consoleread (struct inode *ip, char *dst, int n) { uint target; int c; iunlock(ip); target = n; acquire(&input.lock); while (n > 0) { while (input.r == input.w) { if (proc->killed) { release(&input.lock); ilock(ip); return -1; } sleep(&input.r, &input.lock); } c = input.buf[input.r++ % INPUT_BUF]; if (c == C('D')) { // EOF if (n < target) { // Save ^D for next time, to make sure // caller gets a 0-byte result. input.r--; } break; } *dst++ = c; --n; if (c == '\n') { break; } } release(&input.lock); ilock(ip); return target - n; }