SockAddr.java
package eu.javaexperience.nativ.java;
import java.io.Closeable;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import eu.javaexperience.nativ.posix.INTEGER;
import eu.javaexperience.nativ.posix.Posix;
public class SockAddr implements Closeable
{
protected int family;
protected long ptr;
protected int size;
protected String host;
protected int port;
public String getHost()
{
return host;
}
public int getPort()
{
return port;
}
public int getFamily()
{
return family;
}
public long getAddrPointer()
{
return ptr;
}
public int getAddrLen()
{
return size;
}
@Override
protected void finalize() throws Throwable
{
close();
super.finalize();
}
@Override
public void close() throws IOException
{
long addr = ptr;
ptr = 0;
Posix.free(addr);
}
public static SockAddr fromSocketaddress(InetSocketAddress addr)
{
return fromIpv4(addr.getAddress().getHostAddress(), (short) addr.getPort());
}
public static SockAddr fromUds(String path)
{
SockAddr ret = new SockAddr();
ret.host = path;
ret.port = -1;
ret.family = Posix.AF_UNIX;
INTEGER addrl = new INTEGER();
ret.ptr = JavaNativeExtension.newSockaddrUn(path, addrl);
ret.size = addrl.getValue();
return ret;
}
//hack to specify UDS in IPv4 address socket everywhere in java.
public static SockAddr fromIpv4(String ip, int port)
{
if(port < 0)
{
return fromUds(ip);
}
SockAddr ret = new SockAddr();
ret.host = ip;
ret.port = port;
ret.family = Posix.AF_INET;
INTEGER addrl = new INTEGER();
ret.ptr = JavaNativeExtension.newSockaddrIn(ip, port, addrl);
ret.size = addrl.getValue();
return ret;
}
public static SockAddr fromIpv4(InetAddress host, int port)
{
if(port < 0)
{
return fromUds(host.getHostName());
}
return fromIpv4(host.getHostAddress(), port);
}
}