From 8ab8295384ace533b8f17260b07e74327995658e Mon Sep 17 00:00:00 2001 From: neal Date: Wed, 8 Oct 2008 16:07:58 +0000 Subject: viengoos/ 2008-10-08 Neal H. Walfield * rm.h (enum rm_method_id): Add RM_read. (rm_method_id_string): Handle it. (read): New RPC. * server.c (server_loop): Implement the read RPC. newlib/ 2008-10-08 Neal H. Walfield * addon/newlib/libc/sys/hurd/readr.c: Include . (read): Implement. --- newlib/ChangeLog | 5 +++++ newlib/addon/newlib/libc/sys/hurd/readr.c | 18 ++++++++++++++++-- viengoos/ChangeLog | 7 +++++++ viengoos/rm.h | 6 ++++++ viengoos/server.c | 24 +++++++++++++++++++++++- 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 9d2c310..b1a8624 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2008-10-08 Neal H. Walfield + + * addon/newlib/libc/sys/hurd/readr.c: Include . + (read): Implement. + 2008-06-27 Neal H. Walfield * Makefile.am (noinst_LIBRARIES): Remove variable. diff --git a/newlib/addon/newlib/libc/sys/hurd/readr.c b/newlib/addon/newlib/libc/sys/hurd/readr.c index bc1d6a0..1177a41 100644 --- a/newlib/addon/newlib/libc/sys/hurd/readr.c +++ b/newlib/addon/newlib/libc/sys/hurd/readr.c @@ -4,11 +4,25 @@ #include #include +#include + _ssize_t read (int fd, void *buf, size_t cnt) { - errno = EOPNOTSUPP; - return -1; + if (fd != 0) + { + errno = EBADF; + return -1; + } + + if (cnt == 0) + return 0; + + struct io_buffer buffer; + rm_read (cnt, &buffer); + + memcpy (buf, buffer.data, buffer.len); + return buffer.len; } _ssize_t diff --git a/viengoos/ChangeLog b/viengoos/ChangeLog index e3b88a7..a3f14ea 100644 --- a/viengoos/ChangeLog +++ b/viengoos/ChangeLog @@ -1,3 +1,10 @@ +2008-10-08 Neal H. Walfield + + * rm.h (enum rm_method_id): Add RM_read. + (rm_method_id_string): Handle it. + (read): New RPC. + * server.c (server_loop): Implement the read RPC. + 2008-08-15 Neal H. Walfield * server.c (server_loop): In the implementation of cap_read, if diff --git a/viengoos/rm.h b/viengoos/rm.h index 04e2a06..366e759 100644 --- a/viengoos/rm.h +++ b/viengoos/rm.h @@ -31,6 +31,7 @@ enum rm_method_id { RM_write = 100, + RM_read, RM_as_dump, }; @@ -41,6 +42,8 @@ rm_method_id_string (int id) { case RM_write: return "write"; + case RM_read: + return "read"; case RM_as_dump: return "as_dump"; case RM_folio_alloc: @@ -107,6 +110,9 @@ struct io_buffer /* Echo the character CHR on the manager console. */ RPC_SIMPLE(write, 1, 0, struct io_buffer, io) +/* Read up to MAX characters from the console's input device. */ +RPC(read, 1, 1, int, max, struct io_buffer, io) + /* Dump the address space rooted at ROOT. */ RPC(as_dump, 2, 0, addr_t, principal, addr_t, root) diff --git a/viengoos/server.c b/viengoos/server.c index 3b72606..81f5411 100644 --- a/viengoos/server.c +++ b/viengoos/server.c @@ -307,7 +307,7 @@ server_loop (void) if (raise_fault) { - DEBUG (4, "fault (ip: %x; fault: %x.%c%s)!", + DEBUG (4, "Reflecting fault (ip: %x; fault: %x.%c%s)!", ip, fault, w ? 'w' : 'r', discarded ? " discarded" : ""); l4_word_t c = _L4_XCHG_REGS_DELIVER; @@ -527,6 +527,28 @@ server_loop (void) do_reply = 0; continue; } + else if (label == RM_read) + { + int max; + err = rm_read_send_unmarshal (&msg, &max); + if (err) + { + debug (0, "Read error!"); + REPLY (EINVAL); + } + + struct io_buffer buffer; + buffer.len = 0; + + if (max > 0) + { + buffer.len = 1; + buffer.data[0] = getchar (); + } + + rm_read_reply_marshal (&msg, buffer); + continue; + } do_reply = 1; -- cgit v1.2.3