add ftruncate() syscall
[nestedvm.git] / src / org / ibex / nestedvm / Runtime.java
index f6a00df..f286620 100644 (file)
@@ -1,3 +1,7 @@
+// Copyright 2000-2005 the Contributors, as shown in the revision logs.
+// Licensed under the Apache Public Source License 2.0 ("the License").
+// You may not use this file except in compliance with the License.
+
 // Copyright 2003 Brian Alliet
 // Based on org.xwt.imp.MIPS by Adam Megacz
 // Portions Copyright 2003 Adam Megacz
@@ -727,7 +731,6 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
         if((flags & ~(3|O_CREAT|O_EXCL|O_APPEND|O_TRUNC)) != 0) {
             if(STDERR_DIAG)
                 System.err.println("WARNING: Unsupported flags passed to open(\"" + f + "\"): " + toHex(flags & ~(3|O_CREAT|O_EXCL|O_APPEND|O_TRUNC)));
-           
             throw new ErrnoException(ENOTSUP);
         }
         boolean write = (flags&3) != RD_ONLY;
@@ -736,7 +739,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
         
         if((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
             try {
-                if(Platform.atomicCreateFile(f)) throw new ErrnoException(EEXIST);
+                if(!Platform.atomicCreateFile(f)) throw new ErrnoException(EEXIST);
             } catch(IOException e) {
                 throw new ErrnoException(EIO);
             }
@@ -806,6 +809,17 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
         copyout(buf,addr,n);
         return n;
     }
+
+    /** The ftruncate syscall */
+    private int sys_ftruncate(int fdn, long length) {
+      if (fdn < 0 || fdn >= OPEN_MAX) return -EBADFD;
+      if (fds[fdn] == null) return -EBADFD;
+
+      Seekable seekable = fds[fdn].seekable();
+      if (length < 0 || seekable == null) return -EINVAL;
+      try { seekable.resize(length); } catch (IOException e) { return -EIO; }
+      return 0;
+    }
     
     /** The close syscall */
     private int sys_close(int fdn) {
@@ -1019,7 +1033,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
                 return -ENOSYS;
         }
     }
-            
+          
     /** The syscall dispatcher.
         The should be called by subclasses when the syscall instruction is invoked.
         <i>syscall</i> should be the contents of V0 and <i>a</i>, <i>b</i>, <i>c</i>, and <i>d</i> should be 
@@ -1028,9 +1042,11 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
     protected final int syscall(int syscall, int a, int b, int c, int d, int e, int f) {
         try {
             int n = _syscall(syscall,a,b,c,d,e,f);
-            //if(n < 0) System.err.println("syscall: " + syscall + " returned " + n);
+            //if(n<0) throw new ErrnoException(-n);
             return n;
         } catch(ErrnoException ex) {
+            //System.err.println("While executing syscall: " + syscall + ":");
+            //if(syscall == SYS_open) try { System.err.println("Failed to open " + cstring(a) + " errno " + ex.errno); } catch(Exception e2) { }
             //ex.printStackTrace();
             return -ex.errno;
         } catch(FaultException ex) {
@@ -1053,6 +1069,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
             case SYS_close: return sys_close(a);
             case SYS_read: return sys_read(a,b,c);
             case SYS_lseek: return sys_lseek(a,b,c);
+            case SYS_ftruncate: return sys_ftruncate(a,b);
             case SYS_getpid: return sys_getpid();
             case SYS_calljava: return sys_calljava(a,b,c,d);
             case SYS_gettimeofday: return sys_gettimeofday(a,b);
@@ -1061,6 +1078,10 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
             case SYS_getpagesize: return sys_getpagesize();
             case SYS_fcntl: return sys_fcntl(a,b,c);
             case SYS_sysconf: return sys_sysconf(a);
+            case SYS_getuid: return sys_getuid();
+            case SYS_geteuid: return sys_geteuid();
+            case SYS_getgid: return sys_getgid();
+            case SYS_getegid: return sys_getegid();
             
             case SYS_memcpy: memcpy(a,b,c); return a;
             case SYS_memset: memset(a,b,c); return a;
@@ -1082,6 +1103,11 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
         }
     }
     
+    private int sys_getuid() { return 0; }
+    private int sys_geteuid() { return 0; }
+    private int sys_getgid() { return 0; }
+    private int sys_getegid() { return 0; }
+    
     public int xmalloc(int size) { int p=malloc(size); if(p==0) throw new RuntimeException("malloc() failed"); return p; }
     public int xrealloc(int addr,int newsize) { int p=realloc(addr,newsize); if(p==0) throw new RuntimeException("realloc() failed"); return p; }
     public int realloc(int addr, int newsize) { try { return call("realloc",addr,newsize); } catch(CallException e) { return 0; } }
@@ -1279,7 +1305,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
                 pos++; len--; pb = true;
             }
             int n = parent.read(buf,pos,len);
-            if(n == -1) return -1;
+            if(n == -1) return pb ? 1 : -1;
             for(int i=0;i<n;i++) {
                 if(buf[pos+i] == '\r') {
                     if(i==n-1) {