add ftruncate() syscall
[nestedvm.git] / src / org / ibex / nestedvm / Runtime.java
index e909b81..f286620 100644 (file)
@@ -809,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) {
@@ -1031,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) {
@@ -1056,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);
@@ -1291,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) {