fbmuck-6.01/contrib/jresolver/
fbmuck-6.01/contrib/jresolver/org/
fbmuck-6.01/contrib/jresolver/org/fuzzball/
fbmuck-6.01/docs/devel/
fbmuck-6.01/game/
fbmuck-6.01/game/logs/
fbmuck-6.01/game/muf/
fbmuck-6.01/scripts/
fbmuck-6.01/src_docs/
package org.fuzzball;

import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.*;

class ResolverHandler extends Thread
{
	private static Hashtable addrCache = new Hashtable(8192);

	public ResolverHandler()
	{
	}

	public void run()
	{
		while (true)
		{
			try
			{
				String request = Resolver.getRequest();
				StringTokenizer st = new StringTokenizer(request, "(", true);
				String address = st.nextToken();
				st.nextToken();

				String remotePortStr = st.nextToken(")");
				st.nextToken();
				String localPortStr  = st.nextToken();

				int remotePort = Integer.parseInt(remotePortStr);
				int localPort  = Integer.parseInt(localPortStr);

				String hostname = getHostLookup(address);
				String username = getUserName(address, remotePort, localPort);

				System.out.println(address + "(" + remotePort + "):" + hostname + "(" + username + ")");
				System.out.flush();
			}
			catch (Exception _ex)
			{
			}
		}
	}

	String getHostLookup(String addr)
	{
		String host = null;

		synchronized (addrCache)
		{
			host = (String)addrCache.get(addr);
		}

		if (host == null)
		{
			try
			{
				InetAddress ia = InetAddress.getAllByName(addr)[0];
				host = ia.getHostName();
				synchronized (addrCache)
				{
					addrCache.put(addr, host);
				}
			}
			catch(UnknownHostException _ex)
			{
				host = addr;
			}
		}
		return host;
	}

	String getUserName(String addr, int remotePort, int localPort)
	{
		try
		{
			Socket sock = new Socket(addr, 113);
			sock.setSoTimeout(30000);
			BufferedReader authIn = new BufferedReader(new InputStreamReader(sock.getInputStream()));
			OutputStream authOut = sock.getOutputStream();

			authOut.write(("" + remotePort + "," + localPort + "\n").getBytes());
			String response = authIn.readLine();
			sock.close();

			StringTokenizer st = new StringTokenizer(response, ":");
			st.nextToken();
			String errcode = st.nextToken().trim();
			st.nextToken();
			response = st.nextToken().trim();

			if (errcode == null || !errcode.equals("USERID"))
				return "" + remotePort;
			if (response == null)
				return "" + remotePort;

			return response;
		}
		catch (Exception _ex)
		{
			return "" + remotePort;
		}
	}
}