// 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;
}
FD _open(String path, int flags, int mode) throws ErrnoException {
- return gs.open(this,normalizePath(path),flags,mode);
+ path = normalizePath(path);
+ FD fd = gs.open(this,path,flags,mode);
+ if (fd != null && path != null) fd.setNormalizedPath(path);
+ return fd;
}
private int sys_getppid() {
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 {
return 0;
}
- static class Pipe {
+ public static class Pipe {
private final byte[] pipebuf = new byte[PIPE_BUF*4];
private int readPos;
private int writePos;
return n;
}
- void _closedFD(FD fd) {
+ void _preCloseFD(FD fd) {
// release all fcntl locks on this file
Seekable s = fd.seekable();
if (s == null) return;
} catch (IOException e) { throw new RuntimeException(e); }
}
+ void _postCloseFD(FD fd) {
+ if (fd.isMarkedForDeleteOnClose()) {
+ try { gs.unlink(this, fd.getNormalizedPath()); }
+ catch (Throwable t) {}
+ }
+ }
+
/** Implements the F_GETLK and F_SETLK cases of fcntl syscall.
* If l_start = 0 and l_len = 0 the lock refers to the entire file.
* Uses GlobalState to ensure locking across processes in the same JVM.
addMount("/dev",new DevFS());
addMount("/resource",new ResourceFS());
+ addMount("/cygdrive",new CygdriveFS());
}
}
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();
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);
+ if(!f.delete()) {
+ // Can't delete file immediately, so mark for
+ // delete on close all matching FDs
+ boolean marked = false;
+ for(int i=0;i<OPEN_MAX;i++) {
+ if(r.fds[i] != null) {
+ String fdpath = r.fds[i].getNormalizedPath();
+ if(fdpath != null && fdpath.equals(path)) {
+ r.fds[i].markDeleteOnClose();
+ marked = true;
+ }
+ }
+ }
+ if(!marked) throw new ErrnoException(EPERM);
+ }
}
public FStat stat(UnixRuntime r, String path) throws ErrnoException {
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);
if(path.startsWith("fd/")) {
int n;
try {
- n = Integer.parseInt(path.substring(4));
+ n = Integer.parseInt(path.substring(3));
} catch(NumberFormatException e) {
return null;
}