/*
* 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