diff options
Diffstat (limited to 'lib/libatm/ip_addr.c')
-rw-r--r-- | lib/libatm/ip_addr.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/lib/libatm/ip_addr.c b/lib/libatm/ip_addr.c new file mode 100644 index 0000000..81b9c77 --- /dev/null +++ b/lib/libatm/ip_addr.c @@ -0,0 +1,168 @@ +/* + * + * =================================== + * HARP | Host ATM Research Platform + * =================================== + * + * + * This Host ATM Research Platform ("HARP") file (the "Software") is + * made available by Network Computing Services, Inc. ("NetworkCS") + * "AS IS". NetworkCS does not provide maintenance, improvements or + * support of any kind. + * + * NETWORKCS MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED, + * INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE, AS TO ANY ELEMENT OF THE + * SOFTWARE OR ANY SUPPORT PROVIDED IN CONNECTION WITH THIS SOFTWARE. + * In no event shall NetworkCS be responsible for any damages, including + * but not limited to consequential damages, arising from or relating to + * any use of the Software or related support. + * + * Copyright 1994-1998 Network Computing Services, Inc. + * + * Copies of this Software may be made, however, the above copyright + * notice must be reproduced on all copies. + * + * @(#) $FreeBSD$ + * + */ + +/* + * User Space Library Functions + * ---------------------------- + * + * IP address utilities + * + */ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/socket.h> +#include <net/if.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netatm/port.h> +#include <netatm/atm.h> +#include <netatm/atm_if.h> +#include <netatm/atm_sap.h> +#include <netatm/atm_sys.h> +#include <netatm/atm_ioctl.h> + +#include <netdb.h> +#include <string.h> + +#include "libatm.h" + +#ifndef lint +__RCSID("@(#) $FreeBSD$"); +#endif + + +/* + * Get IP address + * + * Return an IP address in a socket address structure, given a character + * string with a domain name or a dotted decimal number. + * + * Arguments: + * p pointer to a host name or IP address + * + * Returns: + * null error was encountered + * struct sockaddr_in * a pointer to a socket address with the + * requested IP address + * + */ +struct sockaddr_in * +get_ip_addr(p) + char *p; +{ + struct hostent *ip_host; + static struct sockaddr_in sin; + + /* + * Get IP address of specified host name + */ + UM_ZERO(&sin, sizeof(sin)); + sin.sin_family = AF_INET; + if (p[0] >= '0' && p[0] <= '9') { + /* + * IP address is in dotted decimal format + */ + if ((sin.sin_addr.s_addr = inet_addr(p)) == -1) { + return((struct sockaddr_in *)0); + } + } else { + /* + * Host name is in domain name system format + */ + ip_host = gethostbyname(p); + if (!ip_host || + ip_host->h_addrtype != AF_INET) { + return((struct sockaddr_in *)0); + } + sin.sin_addr.s_addr = *(u_long *)ip_host->h_addr_list[0]; + } + return(&sin); +} + + +/* + * Format an IP address + * + * Return a text-formatted string with an IP address and domain name + * given a sockaddr_in with an IP address. + * + * Arguments: + * p pointer to sockaddr_in with an IP address + * + * Returns: + * char * pointer to a text-formatted string + * + */ +char * +format_ip_addr(addr) + struct in_addr *addr; +{ + static char host_name[128]; + char *ip_num; + struct hostent *ip_host; + + /* + * Initialize + */ + UM_ZERO(host_name, sizeof(host_name)); + + /* + * Check for a zero address + */ + if (!addr || addr->s_addr == 0) { + return("-"); + } + + /* + * Get address in dotted decimal format + */ + ip_num = inet_ntoa(*addr); + + /* + * Look up name in DNS + */ + ip_host = gethostbyaddr((char *)addr, sizeof(addr), AF_INET); + if (ip_host && ip_host->h_name && + strlen(ip_host->h_name)) { + /* + * Return host name followed by dotted decimal address + */ + strcpy(host_name, ip_host->h_name); + strcat(host_name, " ("); + strcat(host_name, ip_num); + strcat(host_name, ")"); + return(host_name); + } else { + /* + * No host name -- just return dotted decimal address + */ + return(ip_num); + } +} |