/*
 * pure-myaddr.c : get my IP address
 *
 * $Id: pure-myaddr.c,v 1.1 2000/12/30 16:31:42 simm Exp $
 */

#include "pure.h"

const char DEFAULT_PEER[] = "irc.friend.td.nu";

static u_long pure_getmyaddr_by_hostname( void )
{
	char hostname[256];
	struct hostent* hp;
	int i;
	struct in_addr addr;

	gethostname( hostname, sizeof( hostname ) );
	hp = gethostbyname( hostname );
	for ( i = 0 ; hp -> h_addr_list[i] ; ++i )
		;
	memcpy( &addr, hp -> h_addr_list[i-1], sizeof(struct in_addr) );
	return ntohl( addr.s_addr );
}

static u_long pure_getmyaddr_by_peer( char* peername )
{
	struct hostent* hp;
	u_long peeraddr;
	int sock, len;
	struct sockaddr_in peer, myhost;

	hp = gethostbyname( peername );
	if ( !hp )
		hp = gethostbyname( DEFAULT_PEER );
	peeraddr = ntohl( ( (struct in_addr*)hp -> h_addr_list[0] ) -> s_addr );

	sock = socket( AF_INET, SOCK_DGRAM, 0 );
	if ( sock < 0 ) return 0;
	memset( &peer, 0, sizeof( peer ) );
	peer.sin_family = AF_INET;
	peer.sin_addr.s_addr = htonl( peeraddr );
	peer.sin_port = htons( 7 );
	if ( connect( sock, (struct sockaddr*)&peer, sizeof(peer) ) ) return 0;
	len = sizeof(myhost);
	if ( getsockname( sock, (struct sockaddr*)&myhost, &len ) ) return 0;
	close( sock );
	return ntohl( myhost.sin_addr.s_addr );
}

int pure_getmyaddr( net_peer* peer )
{
	if ( !(peer->name) )
		peer->address = pure_getmyaddr_by_hostname();
	else if ( peer->name[0] != '-' || peer->name[1] != '\0' )
		peer->address = pure_getmyaddr_by_peer(peer->name);
	else
		peer->address = ntohl( 0 );

	return 0;
}


syntax highlighted by Code2HTML, v. 0.9.1