X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FUnixRuntime.java;h=e3afe98e3ae4e319fe310dfc36937603e3ced802;hp=32a3c7541aa667a1adafabb8b057e0ba651dcaad;hb=119cb20e2b9d594032653c8464717b1420b6abc7;hpb=897fa3c89674460aa4fad275f263cea2b341420d diff --git a/src/org/ibex/nestedvm/UnixRuntime.java b/src/org/ibex/nestedvm/UnixRuntime.java index 32a3c75..e3afe98 100644 --- a/src/org/ibex/nestedvm/UnixRuntime.java +++ b/src/org/ibex/nestedvm/UnixRuntime.java @@ -4,6 +4,8 @@ import org.ibex.nestedvm.util.*; import java.io.*; import java.util.*; +// FEATURE: vfork + public abstract class UnixRuntime extends Runtime implements Cloneable { /** The pid of this "process" */ private int pid; @@ -33,7 +35,9 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { // FEATURE: Do the proper mangling for non-unix hosts String userdir = getSystemProperty("user.dir"); - cwd = userdir != null && userdir.startsWith("/") && File.separatorChar == '/' ? userdir.substring(1) : ""; + cwd = + userdir != null && userdir.startsWith("/") && File.separatorChar == '/' && getSystemProperty("nestedvm.root") == null + ? userdir.substring(1) : ""; } // NOTE: getDisplayName() is a Java2 function @@ -59,7 +63,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { } String[] createEnv(String[] extra) { - String[] defaults = new String[5]; + String[] defaults = new String[6]; int n=0; if(extra == null) extra = new String[0]; if(!envHas("USER",extra) && getSystemProperty("user.name") != null) @@ -69,6 +73,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { if(!envHas("SHELL",extra)) defaults[n++] = "SHELL=/bin/sh"; if(!envHas("TERM",extra)) defaults[n++] = "TERM=vt100"; if(!envHas("TZ",extra)) defaults[n++] = "TZ=" + posixTZ(); + if(!envHas("PATH",extra)) defaults[n++] = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin"; String[] env = new String[extra.length+n]; for(int i=0;i= OPEN_MAX) return -EBADFD; + if(fds[oldd] == null) return -EBADFD; + FD fd = fds[oldd].dup(); + int newd = addFD(fd); + if(newd < 0) { fd.close(); return -ENFILE; } + return newd; + } + private int sys_stat(int cstring, int addr) throws FaultException, ErrnoException { FStat s = gs.stat(this,normalizePath(cstring(cstring))); if(s == null) return -ENOENT; @@ -451,6 +478,11 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { return 0; } + private int sys_unlink(int cstring) throws FaultException, ErrnoException { + gs.unlink(this,normalizePath(cstring(cstring))); + return 0; + } + private int sys_getcwd(int addr, int size) throws FaultException, ErrnoException { byte[] b = getBytes(cwd); if(size == 0) return -EINVAL; @@ -486,6 +518,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { protected static final int STAT = 2; protected static final int LSTAT = 3; protected static final int MKDIR = 4; + protected static final int UNLINK = 5; final UnixRuntime[] tasks; int nextPID = 1; @@ -589,6 +622,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { case STAT: return fs.stat(r,path); case LSTAT: return fs.lstat(r,path); case MKDIR: fs.mkdir(r,path,arg1); return null; + case UNLINK: fs.unlink(r,path); return null; default: throw new Error("should never happen"); } } @@ -597,6 +631,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { public final FStat stat(UnixRuntime r, String path) throws ErrnoException { return (FStat) fsop(STAT,r,path,0,0); } public final FStat lstat(UnixRuntime r, String path) throws ErrnoException { return (FStat) fsop(LSTAT,r,path,0,0); } public final void mkdir(UnixRuntime r, String path, int mode) throws ErrnoException { fsop(MKDIR,r,path,mode,0); } + public final void unlink(UnixRuntime r, String path) throws ErrnoException { fsop(UNLINK,r,path,0,0); } private Hashtable execCache = new Hashtable(); private static class CacheEnt { @@ -607,6 +642,9 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { } public synchronized Object exec(UnixRuntime r, String path) throws ErrnoException { + // FIXME: Hideous hack to make a standalone busybox possible + if(path.equals("bin/busybox") && r.getClass().getName().endsWith("BusyBox")) + return r.getClass(); FStat fstat = stat(r,path); if(fstat == null) return null; long mtime = fstat.mtime(); @@ -708,6 +746,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { // If this returns null it'll be turned into an ENOENT public abstract FStat stat(UnixRuntime r, String path) throws ErrnoException; public abstract void mkdir(UnixRuntime r, String path, int mode) throws ErrnoException; + public abstract void unlink(UnixRuntime r, String path) throws ErrnoException; } // FEATURE: chroot support in here @@ -731,7 +770,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { path.getChars(0,path.length(),in,0); while(in[inp] != 0) { - if(inp != 0) { + if(inp != 0 || cwdl==0) { if(in[inp] != '/') { out[outp++] = in[inp++]; continue; } while(in[inp] == '/') inp++; } @@ -784,8 +823,14 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { public File getRoot() { return root; } private static File hostRootDir() { + if(getSystemProperty("nestedvm.root") != null) { + File f = new File(getSystemProperty("nestedvm.root")); + if(f.isDirectory()) return f; + // fall through to case below + } String cwd = getSystemProperty("user.dir"); File f = new File(cwd != null ? cwd : "."); + if(!f.exists()) throw new Error("Couldn't get File for cwd"); f = new File(f.getAbsolutePath()); while(f.getParent() != null) f = new File(f.getParent()); return f; @@ -815,6 +860,13 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { return r.hostFSOpen(f,flags,mode,this); } + public void unlink(UnixRuntime r, String path) throws ErrnoException { + File f = hostFile(path); + if(r.sm != null && !r.sm.allowUnlink(f)) throw new ErrnoException(EPERM); + if(!f.exists()) throw new ErrnoException(ENOENT); + if(!f.delete()) throw new ErrnoException(EPERM); + } + public FStat stat(UnixRuntime r, String path) throws ErrnoException { File f = hostFile(path); if(r.sm != null && !r.sm.allowStat(f)) throw new ErrnoException(EACCES); @@ -1019,6 +1071,7 @@ public abstract class UnixRuntime extends Runtime implements Cloneable { return null; } - public void mkdir(UnixRuntime r, String path, int mode) throws ErrnoException { throw new ErrnoException(EACCES); } - } + public void mkdir(UnixRuntime r, String path, int mode) throws ErrnoException { throw new ErrnoException(EROFS); } + public void unlink(UnixRuntime r, String path) throws ErrnoException { throw new ErrnoException(EROFS); } + } }