make jdk 1.1 compliant part 1
[nestedvm.git] / src / org / ibex / nestedvm / Runtime.java
index 2a4567f..64ebd33 100644 (file)
@@ -9,6 +9,8 @@ import java.io.*;
 import java.util.Arrays;
 
 public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
+    public static final String VERSION = "1.0";
+    
     /** True to write useful diagnostic information to stderr when things go wrong */
     final static boolean STDERR_DIAG = true;
     
@@ -357,7 +359,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
                 if(page == null) throw new WriteFaultException(a<<2);
                 int index = a&pageWordMask;
                 int n = min(c,pageWords-index);
-                Arrays.fill(page,index,index+n,fourBytes);
+                /* Arrays.fill(page,index,index+n,fourBytes);*/
+                for(int i=index;i<index+n;i++) page[i] = fourBytes;
                 a += n; c -= n;
             }
             addr = a<<2; count&=3;
@@ -719,8 +722,7 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
         
         if((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) {
             try {
-                // NOTE: createNewFile is a Java2 function
-                if(!f.createNewFile()) throw new ErrnoException(EEXIST);
+                if(Platform.atomicCreateFile(f)) throw new ErrnoException(EEXIST);
             } catch(IOException e) {
                 throw new ErrnoException(EIO);
             }
@@ -752,8 +754,13 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
     
     /** The open syscall */
     private int sys_open(int addr, int flags, int mode) throws ErrnoException, FaultException {
+        String name = cstring(addr);
+        
+        // HACK: TeX, or GPC, or something really sucks
+        if(name.length() == 1024 && getClass().getName().equals("tests.TeX")) name = name.trim();
+        
         flags &= ~O_NOCTTY; // this is meaningless under nestedvm
-        FD fd = _open(cstring(addr),flags,mode);
+        FD fd = _open(name,flags,mode);
         if(fd == null) return -ENOENT;
         int fdn = addFD(fd);
         if(fdn == -1) { fd.close(); return -ENFILE; }
@@ -1422,6 +1429,13 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable {
         }
     }
     
+    static byte[] getNullTerminatedBytes(String s) {
+        byte[] buf1 = getBytes(s);
+        byte[] buf2 = new byte[buf1.length+1];
+        System.arraycopy(buf1,0,buf2,0,buf1.length);
+        return buf2;
+    }
+    
     final static String toHex(int n) { return "0x" + Long.toString(n & 0xffffffffL, 16); }
     final static int min(int a, int b) { return a < b ? a : b; }
     final static int max(int a, int b) { return a > b ? a : b; }