package org.ibex.nestedvm;
import org.ibex.nestedvm.util.*;
+// FEATURE: This is ugly, this stuff needs to be in org.ibex.util or something
+import org.ibex.classgen.util.Sort;
import java.io.*;
import java.util.*;
import java.net.*;
return n;
}
- // FIXME: UDP is totally broken
+ // FEATURE: UDP is totally broken
static class SocketFD extends FD {
public static final int TYPE_STREAM = 0;
}
return 0;
}
-
-
- /*public int sys_opensocket(int cstring, int port) throws FaultException, ErrnoException {
- String hostname = cstring(cstring);
- try {
- FD fd = new SocketFD(new Socket(hostname,port));
- int n = addFD(fd);
- if(n == -1) fd.close();
- return n;
- } catch(IOException e) {
- return -EIO;
- }
- }
-
- private static class ListenSocketFD extends FD {
- ServerSocket s;
- public ListenSocketFD(ServerSocket s) { this.s = s; }
- public int flags() { return 0; }
- // FEATURE: What should these be?
- public FStat _fstat() { return new FStat(); }
- public void _close() { try { s.close(); } catch(IOException e) { } }
- }
-
- public int sys_listensocket(int port) {
- try {
- ListenSocketFD fd = new ListenSocketFD(new ServerSocket(port));
- int n = addFD(fd);
- if(n == -1) fd.close();
- return n;
- } catch(IOException e) {
- return -EIO;
- }
- }
-
- public int sys_accept(int fdn) {
- if(fdn < 0 || fdn >= OPEN_MAX) return -EBADFD;
- if(fds[fdn] == null) return -EBADFD;
- if(!(fds[fdn] instanceof ListenSocketFD)) return -EBADFD;
- try {
- ServerSocket s = ((ListenSocketFD)fds[fdn]).s;
- SocketFD fd = new SocketFD(s.accept());
- int n = addFD(fd);
- if(n == -1) fd.close();
- return n;
- } catch(IOException e) {
- return -EIO;
- }
- }*/
// FEATURE: Run through the fork/wait stuff one more time
public static class GlobalState {
}
}
- private static class MP implements Sort.Sortable {
+ private static class MP implements Sort.Comparable {
public MP(String path, FS fs) { this.path = path; this.fs = fs; }
public String path;
public FS fs;
mps = newMPS;
}
+ // FEATURE: We shouldn't need to special case the root dir, it should work in the MP array
private Object fsop(int op, UnixRuntime r, String normalizedPath, int arg1, int arg2) throws ErrnoException {
int pl = normalizedPath.length();
if(pl != 0) {
for(int i=0;i<list.length;i++) {
MP mp = list[i];
int mpl = mp.path.length();
- if(normalizedPath.startsWith(mp.path) && (pl == mpl || (pl < mpl && normalizedPath.charAt(mpl) == '/')))
+ if(normalizedPath.startsWith(mp.path) && (pl == mpl || normalizedPath.charAt(mpl) == '/'))
return dispatch(mp.fs,op,r,pl == mpl ? "" : normalizedPath.substring(mpl+1),arg1,arg2);
}
}
return dispatch(root,op,r,normalizedPath,arg1,arg2);
}
+ // FEATURE: move this into FS so some filesystem can override it directly (devfs)
private static Object dispatch(FS fs, int op, UnixRuntime r, String path, int arg1, int arg2) throws ErrnoException {
switch(op) {
case OPEN: return fs.open(r,path,arg1,arg2);
}
public synchronized Object exec(UnixRuntime r, String path) throws ErrnoException {
- // FIXME: Hideous hack to make a standalone busybox possible
+ // HACK: Hideous hack to make a standalone busybox possible
if(path.equals("bin/busybox") && Boolean.valueOf(getSystemProperty("nestedvm.busyboxhack")).booleanValue())
return r.getClass();
FStat fstat = stat(r,path);
if(path.startsWith("fd/")) {
int n;
try {
- n = Integer.parseInt(path.substring(4));
+ n = Integer.parseInt(path.substring(3));
} catch(NumberFormatException e) {
return null;
}