package org.jerlang.erts.prim_inet; import static org.jerlang.type.Boolean.am_true; import org.jerlang.Process; import org.jerlang.ProcessRegistry; import org.jerlang.erts.Erlang; import org.jerlang.erts.PrimInet; import org.jerlang.erts.erlang.Error; import org.jerlang.type.Atom; import org.jerlang.type.Integer; import org.jerlang.type.List; import org.jerlang.type.PortID; import org.jerlang.type.Term; import org.jerlang.type.Tuple; public class PrimInetClose { private static final Atom linger = Atom.of("linger"); private static final Atom ok = Atom.of("ok"); private static final Tuple linger_ok = Tuple.of(ok, Tuple.of(am_true, Integer.ZERO)); private PrimInetClose() { } public static Term dispatch(List params) { switch (params.length()) { case 1: PortID socket = params.head().toPortID(); return close_1(socket); default: throw Error.badarg; } } public static Term close_1(PortID socket) { Term r1 = PrimInet.getopt(socket, linger); if (linger_ok.equals(r1)) { return close_port(socket); } else { Process p = ProcessRegistry.self().toProcess(); // TODO: implement receive to wait until all // TODO: messages have been processed } throw new Error("not implemented"); } private static Term close_port(PortID socket) { Erlang.port_close(socket); // TODO: catch, receive return ok; } }