aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/lib
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-06-03 09:32:50 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-06-03 09:32:50 +0100
commite49b738ccfb422db6bbf5abb39aa6975bef8d32a (patch)
treeccba8bfd259c7a2d2677013df0dc6e077d90508e /extras/mini-os/lib
parent9efd150651fe690e2bc4e5675209c75adedd823c (diff)
downloadxen-e49b738ccfb422db6bbf5abb39aa6975bef8d32a.tar.gz
xen-e49b738ccfb422db6bbf5abb39aa6975bef8d32a.tar.bz2
xen-e49b738ccfb422db6bbf5abb39aa6975bef8d32a.zip
stubdom: Add console reading support
Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/lib')
-rw-r--r--extras/mini-os/lib/sys.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index 004e300728..7b171b66d5 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -213,8 +213,19 @@ int isatty(int fd)
int read(int fd, void *buf, size_t nbytes)
{
switch (files[fd].type) {
- case FTYPE_CONSOLE:
- return 0;
+ case FTYPE_CONSOLE: {
+ int ret;
+ DEFINE_WAIT(w);
+ while(1) {
+ add_waiter(w, console_queue);
+ ret = xencons_ring_recv(buf, nbytes);
+ if (ret)
+ break;
+ schedule();
+ }
+ remove_waiter(w);
+ return ret;
+ }
case FTYPE_FILE: {
ssize_t ret;
if (nbytes > PAGE_SIZE)
@@ -707,7 +718,12 @@ static int select_poll(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exce
FD_CLR(i, exceptfds);
break;
case FTYPE_CONSOLE:
- FD_CLR(i, readfds);
+ if (FD_ISSET(i, writefds)) {
+ if (xencons_ring_avail())
+ n++;
+ else
+ FD_CLR(i, readfds);
+ }
if (FD_ISSET(i, writefds))
n++;
FD_CLR(i, exceptfds);
@@ -809,6 +825,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
DEFINE_WAIT(w3);
DEFINE_WAIT(w4);
DEFINE_WAIT(w5);
+ DEFINE_WAIT(w6);
assert(thread == main_thread);
@@ -830,6 +847,7 @@ int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
add_waiter(w3, blkfront_queue);
add_waiter(w4, xenbus_watch_queue);
add_waiter(w5, kbdfront_queue);
+ add_waiter(w6, console_queue);
if (readfds)
myread = *readfds;
@@ -916,6 +934,7 @@ out:
remove_waiter(w3);
remove_waiter(w4);
remove_waiter(w5);
+ remove_waiter(w6);
return ret;
}