X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=src%2Forg%2Fibex%2Fnestedvm%2FUnixRuntime.java;h=5adcba04ff4b88c4eda148ec56a3d7fbf214d4b4;hb=refs%2Fheads%2Fmaster;hp=fed82d0c3c2a31f66b08be2b3808131a55535149;hpb=f89d273c01e149c574f57e329fa4d58aba71812d;p=nestedvm.git diff --git a/src/org/ibex/nestedvm/UnixRuntime.java b/src/org/ibex/nestedvm/UnixRuntime.java index fed82d0..5adcba0 100644 --- a/src/org/ibex/nestedvm/UnixRuntime.java +++ b/src/org/ibex/nestedvm/UnixRuntime.java @@ -1,5 +1,5 @@ // Copyright 2000-2005 the Contributors, as shown in the revision logs. -// Licensed under the Apache Public Source License 2.0 ("the License"). +// Licensed under the Apache License 2.0 ("the License"). // You may not use this file except in compliance with the License. package org.ibex.nestedvm; @@ -119,7 +119,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { } } - int _syscall(int syscall, int a, int b, int c, int d, int e, int f) throws ErrnoException, FaultException { + protected int _syscall(int syscall, int a, int b, int c, int d, int e, int f) throws ErrnoException, FaultException { switch(syscall) { case SYS_kill: return sys_kill(a,b); case SYS_fork: return sys_fork(); @@ -195,7 +195,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { private int sys_access(int cstring, int mode) throws ErrnoException, ReadFaultException { // FEATURE: sys_access - return gs.stat(this,cstring(cstring)) == null ? -ENOENT : 0; + return gs.stat(this,normalizePath(cstring(cstring))) == null ? -ENOENT : 0; } private int sys_realpath(int inAddr, int outAddr) throws FaultException { @@ -563,7 +563,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { return 0; } - static class Pipe { + public static class Pipe { private final byte[] pipebuf = new byte[PIPE_BUF*4]; private int readPos; private int writePos; @@ -1362,6 +1362,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { addMount("/dev",new DevFS()); addMount("/resource",new ResourceFS()); + addMount("/cygdrive",new CygdriveFS()); } } @@ -1601,7 +1602,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { protected File root; public File getRoot() { return root; } - private File hostFile(String path) { + protected File hostFile(String path) { char sep = File.separatorChar; if(sep != '/') { char buf[] = path.toCharArray(); @@ -1687,6 +1688,23 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { public int myDev() { return devno; } } } + + /* Implements the Cygwin notation for accessing MS Windows drive letters + * in a unix path. The path /cygdrive/c/myfile is converted to C:\file. + * As there is no POSIX standard for this, little checking is done. */ + public static class CygdriveFS extends HostFS { + protected File hostFile(String path) { + final char drive = path.charAt(0); + + if (drive < 'a' || drive > 'z' || path.charAt(1) != '/') + return null; + + path = drive + ":" + path.substring(1).replace('/', '\\'); + return new File(path); + } + + public CygdriveFS() { super("/"); } + } private static void putInt(byte[] buf, int off, int n) { buf[off+0] = (byte)((n>>>24)&0xff); @@ -1793,7 +1811,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { if(path.startsWith("fd/")) { int n; try { - n = Integer.parseInt(path.substring(4)); + n = Integer.parseInt(path.substring(3)); } catch(NumberFormatException e) { return null; }