Home | History | Annotate | Download | only in radius
      1 /*
      2  * $Id: ip_util.c,v 1.1 2004/11/14 07:26:26 paulus Exp $
      3  *
      4  * Copyright (C) 1995,1996,1997 Lars Fenneberg
      5  *
      6  * Copyright 1992 Livingston Enterprises, Inc.
      7  *
      8  * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
      9  * and Merit Network, Inc. All Rights Reserved
     10  *
     11  * See the file COPYRIGHT for the respective terms and conditions.
     12  * If the file is missing contact me at lf (at) elemental.net
     13  * and I'll send you a copy.
     14  *
     15  */
     16 
     17 #include <includes.h>
     18 #include <radiusclient.h>
     19 
     20 /*
     21  * Function: rc_get_ipaddr
     22  *
     23  * Purpose: return an IP address in host long notation from a host
     24  *          name or address in dot notation.
     25  *
     26  * Returns: 0 on failure
     27  */
     28 
     29 UINT4 rc_get_ipaddr (char *host)
     30 {
     31 	struct hostent *hp;
     32 
     33 	if (rc_good_ipaddr (host) == 0)
     34 	{
     35 		return ntohl(inet_addr (host));
     36 	}
     37 	else if ((hp = gethostbyname (host)) == (struct hostent *) NULL)
     38 	{
     39 		error("rc_get_ipaddr: couldn't resolve hostname: %s", host);
     40 		return ((UINT4) 0);
     41 	}
     42 	return ntohl((*(UINT4 *) hp->h_addr));
     43 }
     44 
     45 /*
     46  * Function: rc_good_ipaddr
     47  *
     48  * Purpose: check for valid IP address in standard dot notation.
     49  *
     50  * Returns: 0 on success, -1 when failure
     51  *
     52  */
     53 
     54 int rc_good_ipaddr (char *addr)
     55 {
     56 	int             dot_count;
     57 	int             digit_count;
     58 
     59 	if (addr == NULL)
     60 		return (-1);
     61 
     62 	dot_count = 0;
     63 	digit_count = 0;
     64 	while (*addr != '\0' && *addr != ' ')
     65 	{
     66 		if (*addr == '.')
     67 		{
     68 			dot_count++;
     69 			digit_count = 0;
     70 		}
     71 		else if (!isdigit (*addr))
     72 		{
     73 			dot_count = 5;
     74 		}
     75 		else
     76 		{
     77 			digit_count++;
     78 			if (digit_count > 3)
     79 			{
     80 				dot_count = 5;
     81 			}
     82 		}
     83 		addr++;
     84 	}
     85 	if (dot_count != 3)
     86 	{
     87 		return (-1);
     88 	}
     89 	else
     90 	{
     91 		return (0);
     92 	}
     93 }
     94 
     95 /*
     96  * Function: rc_ip_hostname
     97  *
     98  * Purpose: Return a printable host name (or IP address in dot notation)
     99  *	    for the supplied IP address.
    100  *
    101  */
    102 
    103 const char *rc_ip_hostname (UINT4 h_ipaddr)
    104 {
    105 	struct hostent  *hp;
    106 	UINT4           n_ipaddr = htonl (h_ipaddr);
    107 
    108 	if ((hp = gethostbyaddr ((char *) &n_ipaddr, sizeof (struct in_addr),
    109 			    AF_INET)) == NULL) {
    110 		error("rc_ip_hostname: couldn't look up host by addr: %08lX", h_ipaddr);
    111 	}
    112 
    113 	return ((hp==NULL)?"unknown":hp->h_name);
    114 }
    115 
    116 /*
    117  * Function: rc_own_ipaddress
    118  *
    119  * Purpose: get the IP address of this host in host order
    120  *
    121  * Returns: IP address on success, 0 on failure
    122  *
    123  */
    124 
    125 UINT4 rc_own_ipaddress(void)
    126 {
    127 	static UINT4 this_host_ipaddr = 0;
    128 
    129 	if (!this_host_ipaddr) {
    130 		if ((this_host_ipaddr = rc_get_ipaddr (hostname)) == 0) {
    131 			error("rc_own_ipaddress: couldn't get own IP address");
    132 			return 0;
    133 		}
    134 	}
    135 
    136 	return this_host_ipaddr;
    137 }
    138