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