X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FRuntime.java;h=a758a503e8731ba653cb359bf350e514b3a8da9e;hp=0543fd0aff3ec0aabc137c5c3ba54ac324d39ca2;hb=8c7ea58a4a2eade641083daa87987c5b5425dda2;hpb=94617ade62211d11c80b1e87b2a4c822297dd43f diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java index 0543fd0..a758a50 100644 --- a/src/org/ibex/nestedvm/Runtime.java +++ b/src/org/ibex/nestedvm/Runtime.java @@ -157,7 +157,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { } } - addFD(new StdinFD(System.in)); + InputStream stdin = Boolean.valueOf(getSystemProperty("nestedvm.textstdin")).booleanValue() ? new TextInputStream(System.in) : System.in; + addFD(new StdinFD(stdin)); addFD(new StdoutFD(System.out)); addFD(new StdoutFD(System.err)); } @@ -729,6 +730,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { return hostFSDirFD(f,data); } + // FIXME: Truncate final Seekable.File sf; try { sf = new Seekable.File(f,write); @@ -801,6 +803,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { } /** The stat/fstat syscall helper */ + // FIXME: Populate uid/gid/nlink int stat(FStat fs, int addr) throws FaultException { memWrite(addr+0,(fs.dev()<<16)|(fs.inode()&0xffff)); // st_dev (top 16), // st_ino (bottom 16) memWrite(addr+4,((fs.type()&0xf000))|(fs.mode()&0xfff)); // st_mode @@ -1215,6 +1218,42 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { public FStat _fstat() { return new FStat() { public int type() { return S_IFCHR; } }; } } + // FEATURE: TextInputStream: This is pretty inefficient but it is only used for reading from the console on win32 + static class TextInputStream extends InputStream { + private int pushedBack = -1; + private final InputStream parent; + public TextInputStream(InputStream parent) { this.parent = parent; } + public int read() throws IOException { + if(pushedBack != -1) { int c = pushedBack; pushedBack = -1; return c; } + int c = parent.read(); + if(c == '\r' && (c = parent.read()) != '\n') { pushedBack = c; return '\r'; } + return c; + } + public int read(byte[] buf, int pos, int len) throws IOException { + boolean pb = false; + if(pushedBack != -1 && len > 0) { + buf[0] = (byte) pushedBack; + pushedBack = -1; + pos++; len--; pb = true; + } + int n = parent.read(buf,pos,len); + if(n == -1) return -1; + for(int i=0;i