diff options
| author | rsc <rsc> | 2007-08-08 08:04:02 +0000 | 
|---|---|---|
| committer | rsc <rsc> | 2007-08-08 08:04:02 +0000 | 
| commit | 07018064bbc27a4b8aad99832fbe3a0e608775d9 (patch) | |
| tree | da670cc21e638e030a58d1f860b7fcfff682b0c9 | |
| parent | ca3d5776711f2580f6a9a9bbea410af1a88dfce2 (diff) | |
| download | xv6-labs-07018064bbc27a4b8aad99832fbe3a0e608775d9.tar.gz xv6-labs-07018064bbc27a4b8aad99832fbe3a0e608775d9.tar.bz2 xv6-labs-07018064bbc27a4b8aad99832fbe3a0e608775d9.zip | |
add EOF handling to console_read - works with cat
| -rw-r--r-- | console.c | 31 | 
1 files changed, 18 insertions, 13 deletions
| @@ -316,7 +316,7 @@ static uchar *charcode[4] = {  };  #define KBD_BUF 64 -char kbd_buf[KBD_BUF]; +uchar kbd_buf[KBD_BUF];  int kbd_r;  int kbd_w;  struct spinlock kbd_lock; @@ -389,24 +389,29 @@ out:  int  console_read(int minor, char *dst, int n)  { -  uint target = n; +  uint target; +  int c; +  target = n;    acquire(&kbd_lock); - -  while(kbd_w == kbd_r) { -    sleep(&kbd_r, &kbd_lock); -  } - -  while(n > 0 && kbd_w != kbd_r){ -    *dst = (kbd_buf[kbd_r]) & 0xff; -    cons_putc(*dst & 0xff); -    dst++; +  while(n > 0){ +    while(kbd_r == kbd_w) +      sleep(&kbd_r, &kbd_lock); +    c = kbd_buf[kbd_r++]; +    if(c == C('D')){  // EOF +      if(n < target){ +        // Save ^D for next time, to make sure +        // caller gets a 0-byte result. +        kbd_r--; +      } +      break; +    } +    *dst++ = c; +    cons_putc(c);      --n; -    kbd_r++;      if(kbd_r >= KBD_BUF)        kbd_r = 0;    } -    release(&kbd_lock);    return target - n; | 
