aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/lib
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-06-17 07:22:18 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-06-17 07:22:18 +0100
commitc12b25aa7ddb70cefacb119e1ff7573906a7284d (patch)
tree17b41bba8abef28a1c38977d920f7a8e961d7036 /extras/mini-os/lib
parent6f1d3ce238905fc7b4c563a3611576ca25a09a49 (diff)
downloadxen-c12b25aa7ddb70cefacb119e1ff7573906a7284d.tar.gz
xen-c12b25aa7ddb70cefacb119e1ff7573906a7284d.tar.bz2
xen-c12b25aa7ddb70cefacb119e1ff7573906a7284d.zip
minios: support secondary guest consoles.
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/lib')
-rw-r--r--extras/mini-os/lib/sys.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
index d0bc76a659..045481e73f 100644
--- a/extras/mini-os/lib/sys.c
+++ b/extras/mini-os/lib/sys.c
@@ -167,6 +167,18 @@ int mkdir(const char *pathname, mode_t mode)
return 0;
}
+int openpty(void)
+{
+ struct consfront_dev *dev;
+
+ dev = init_consfront(NULL);
+ dev->fd = alloc_fd(FTYPE_CONSOLE);
+ files[dev->fd].cons.dev = dev;
+
+ printk("fd(%d) = openpty\n", dev->fd);
+ return(dev->fd);
+}
+
int open(const char *pathname, int flags, ...)
{
int fs_fd, fd;
@@ -219,7 +231,7 @@ int read(int fd, void *buf, size_t nbytes)
DEFINE_WAIT(w);
while(1) {
add_waiter(w, console_queue);
- ret = xencons_ring_recv(buf, nbytes);
+ ret = xencons_ring_recv(files[fd].cons.dev, buf, nbytes);
if (ret)
break;
schedule();
@@ -286,7 +298,7 @@ int write(int fd, const void *buf, size_t nbytes)
{
switch (files[fd].type) {
case FTYPE_CONSOLE:
- console_print((char *)buf, nbytes);
+ console_print(files[fd].cons.dev, (char *)buf, nbytes);
return nbytes;
case FTYPE_FILE: {
ssize_t ret;
@@ -416,6 +428,10 @@ int close(int fd)
shutdown_fbfront(files[fd].fb.dev);
files[fd].type = FTYPE_NONE;
return 0;
+ case FTYPE_CONSOLE:
+ fini_console(files[fd].cons.dev);
+ files[fd].type = FTYPE_NONE;
+ return 0;
case FTYPE_NONE:
break;
}
@@ -735,7 +751,7 @@ static int select_poll(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exce
break;
case FTYPE_CONSOLE:
if (FD_ISSET(i, readfds)) {
- if (xencons_ring_avail())
+ if (xencons_ring_avail(files[i].cons.dev))
n++;
else
FD_CLR(i, readfds);