import java.net.*;
import java.util.zip.*;
-
// Feature: port-level redirects
-public class Port extends Loader {
+public class Port extends TreeClassLoader {
final ThreadPool tp;
final InetAddress bindTo;
}
void spawn(InetAddress bindTo, int port) { new PortThread(bindTo, port).start(); }
+ private static final ClassLoader parentLoader = Port.class.getClassLoader();
private Port(String path, InetAddress bindTo, int port, ThreadPool tp) {
- super(path); this.bindTo = bindTo; this.port = port; this.tp = tp; }
-
- public void changed(Watched w) {
- //Log.warn(this, "Port: noticed change in " + w);
- super.changed(w);
- }
+ super(new File(path), parentLoader);
+ this.bindTo = bindTo; this.port = port; this.tp = tp; }
void dispatch(final Connection conn) throws Exception {
tp.appendTask(new Runnable() { public void run() {
String local = conn.getLocalAddress() + ":" + conn.getLocalPort();
String remote = conn.getRemoteHostname() + ":" + conn.getRemotePort();
try {
- final ClassLoader cl = getClassLoader();
- Class c = cl.loadClass("org.ibex.mail.Main");
+ // FIXME FIXME
+ Class c = loadClass("org.ibex.mail.Main");
if (c == null) throw new RuntimeException("couldn't find listener");
Log.info("["+local+"]", "connection from " + remote + " => " + c.getName());
Log.clearnotes();
- Thread.currentThread().setContextClassLoader(cl);
+ Thread.currentThread().setContextClassLoader(Port.this);
Listener l = (Listener)c.newInstance();
l.accept(conn);
} catch (org.ibex.io.Stream.EOF eof) {
public PortThread(InetAddress bindTo, int port) { this.bindTo = bindTo; this.port = port; }
public void run() {
try {
- Log.warn(this, "Now listening on address " + (bindTo == null ? "all interfaces" : bindTo.toString()) +
- ", port " + port);
+ Log.warn(this, "Now listening on address " + (bindTo==null?"all interfaces":bindTo.toString()) + ", port " + port);
ServerSocket ss = bindTo == null ? new ServerSocket(port) : new ServerSocket(port, 0, bindTo);
for(Socket s = ss.accept(); ; s = ss.accept()) try {
- dispatch(new Connection(s, "megacz.com"));
+ dispatch(new Connection(s, Main.defaultDomain));
} catch (Exception e) { Log.warn(Port.class, e); }
} catch (Exception e) { Log.error(Port.class, e);
} catch (Throwable t) {
Log.error(this, "serious error, aborting VM");
Log.error(this, t);
- Root.reboot();
+ Main.reboot();
}
}
}