X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FRuntime.java;h=2a91e3613ebda8733909fef05888a0aa83b9ce50;hp=f8a157925c630695aa5e38afddaa6464f92457cd;hb=b11e7c6c29f2b5f7b0828bf93eb741c4a30ec411;hpb=b9a61c0d0d94182340ac416abea42d07bc64baff diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java index f8a1579..2a91e36 100644 --- a/src/org/ibex/nestedvm/Runtime.java +++ b/src/org/ibex/nestedvm/Runtime.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. // Copyright 2003 Brian Alliet @@ -698,18 +698,18 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { return i; } - /** Hook for subclasses to do something when the process closes an FD */ - void _closedFD(FD fd) { } + /** Hooks for subclasses before and after the process closes an FD */ + void _preCloseFD(FD fd) { } + void _postCloseFD(FD fd) { } /** Closes file descriptor fdn and removes it from the file descriptor table */ public final boolean closeFD(int fdn) { if(state == EXITED || state == EXECED) throw new IllegalStateException("closeFD called in inappropriate state"); if(fdn < 0 || fdn >= OPEN_MAX) return false; if(fds[fdn] == null) return false; - - _closedFD(fds[fdn]); - + _preCloseFD(fds[fdn]); fds[fdn].close(); + _postCloseFD(fds[fdn]); fds[fdn] = null; return true; } @@ -767,10 +767,10 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { return null; } catch(IOException e) { throw new ErrnoException(EIO); } - return new SeekableFD(sf,flags) { protected FStat _fstat() { return hostFStat(f,data); } }; + return new SeekableFD(sf,flags) { protected FStat _fstat() { return hostFStat(f,sf,data); } }; } - FStat hostFStat(File f, Object data) { return new HostFStat(f); } + FStat hostFStat(File f, Seekable.File sf, Object data) { return new HostFStat(f,sf); } FD hostFSDirFD(File f, Object data) { return null; } @@ -1048,6 +1048,22 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { } } + final int fsync(int fdn) { + if(fdn < 0 || fdn >= OPEN_MAX) return -EBADFD; + if(fds[fdn] == null) return -EBADFD; + FD fd = fds[fdn]; + + Seekable s = fd.seekable(); + if (s == null) return -EINVAL; + + try { + s.sync(); + return 0; + } catch (IOException e) { + return -EIO; + } + } + /** The syscall dispatcher. The should be called by subclasses when the syscall instruction is invoked. syscall should be the contents of V0 and a, b, c, and d should be @@ -1097,6 +1113,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { case SYS_getgid: return sys_getgid(); case SYS_getegid: return sys_getegid(); + case SYS_fsync: return fsync(a); case SYS_memcpy: memcpy(a,b,c); return a; case SYS_memset: memset(a,b,c); return a; @@ -1192,6 +1209,14 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { /** File Descriptor class */ public static abstract class FD { private int refCount = 1; + private String normalizedPath = null; + private boolean deleteOnClose = false; + + public void setNormalizedPath(String path) { normalizedPath = path; } + public String getNormalizedPath() { return normalizedPath; } + + public void markDeleteOnClose() { deleteOnClose = true; } + public boolean isMarkedForDeleteOnClose() { return deleteOnClose; } /** Read some bytes. Should return the number of bytes read, 0 on EOF, or throw an IOException on error */ public int read(byte[] a, int off, int length) throws ErrnoException { throw new ErrnoException(EBADFD); } @@ -1396,10 +1421,13 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { static class HostFStat extends FStat { private final File f; + private final Seekable.File sf; private final boolean executable; - public HostFStat(File f) { this(f,false); } - public HostFStat(File f, boolean executable) { + public HostFStat(File f, Seekable.File sf) { this(f,sf,false); } + public HostFStat(File f, boolean executable) {this(f,null,executable);} + public HostFStat(File f, Seekable.File sf, boolean executable) { this.f = f; + this.sf = sf; this.executable = executable; } public int dev() { return 1; } @@ -1414,7 +1442,13 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { if(f.canWrite()) mode |= 0222; return mode; } - public int size() { return (int) f.length(); } + public int size() { + try { + return sf != null ? (int)sf.length() : (int)f.length(); + } catch (Exception x) { + return (int)f.length(); + } + } public int mtime() { return (int)(f.lastModified()/1000); } }