1/* 2 * $Id: ip_util.c,v 1.1.1.1 2008/10/15 03:30:39 james26_jang 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@elemental.net 13 * and I'll send you a copy. 14 * 15 */ 16 17#include <config.h> 18#include <includes.h> 19#include <radiusclient.h> 20 21/* 22 * Function: rc_get_ipaddr 23 * 24 * Purpose: return an IP address in host long notation from a host 25 * name or address in dot notation. 26 * 27 * Returns: 0 on failure 28 */ 29 30UINT4 rc_get_ipaddr (char *host) 31{ 32 struct hostent *hp; 33 34 if (rc_good_ipaddr (host) == 0) 35 { 36 return ntohl(inet_addr (host)); 37 } 38 else if ((hp = gethostbyname (host)) == (struct hostent *) NULL) 39 { 40 rc_log(LOG_ERR,"rc_get_ipaddr: couldn't resolve hostname: %s", host); 41 return ((UINT4) 0); 42 } 43 return ntohl((*(UINT4 *) hp->h_addr)); 44} 45 46/* 47 * Function: rc_good_ipaddr 48 * 49 * Purpose: check for valid IP address in standard dot notation. 50 * 51 * Returns: 0 on success, -1 when failure 52 * 53 */ 54 55int rc_good_ipaddr (char *addr) 56{ 57 int dot_count; 58 int digit_count; 59 60 if (addr == NULL) 61 return (-1); 62 63 dot_count = 0; 64 digit_count = 0; 65 while (*addr != '\0' && *addr != ' ') 66 { 67 if (*addr == '.') 68 { 69 dot_count++; 70 digit_count = 0; 71 } 72 else if (!isdigit (*addr)) 73 { 74 dot_count = 5; 75 } 76 else 77 { 78 digit_count++; 79 if (digit_count > 3) 80 { 81 dot_count = 5; 82 } 83 } 84 addr++; 85 } 86 if (dot_count != 3) 87 { 88 return (-1); 89 } 90 else 91 { 92 return (0); 93 } 94} 95 96/* 97 * Function: rc_ip_hostname 98 * 99 * Purpose: Return a printable host name (or IP address in dot notation) 100 * for the supplied IP address. 101 * 102 */ 103 104const char *rc_ip_hostname (UINT4 h_ipaddr) 105{ 106 struct hostent *hp; 107 UINT4 n_ipaddr = htonl (h_ipaddr); 108 109 if ((hp = gethostbyaddr ((char *) &n_ipaddr, sizeof (struct in_addr), 110 AF_INET)) == NULL) { 111 rc_log(LOG_ERR,"rc_ip_hostname: couldn't look up host by addr: %08lX", h_ipaddr); 112 } 113 114 return ((hp==NULL)?"unknown":hp->h_name); 115} 116 117/* 118 * Function: rc_getport 119 * 120 * Purpose: get the port number for the supplied request type 121 * 122 */ 123 124unsigned short rc_getport(int type) 125{ 126 struct servent *svp; 127 128 if ((svp = getservbyname ((type==AUTH)?"radius":"radacct", "udp")) == NULL) 129 { 130 return ((type==AUTH)?PW_AUTH_UDP_PORT:PW_ACCT_UDP_PORT); 131 } else { 132 return ntohs ((unsigned short) svp->s_port); 133 } 134} 135 136/* 137 * Function: rc_own_hostname 138 * 139 * Purpose: get the hostname of this machine 140 * 141 * Returns -1 on failure, 0 on success 142 * 143 */ 144 145int 146rc_own_hostname(char *hostname, int len) 147{ 148#ifdef HAVE_UNAME 149 struct utsname uts; 150#endif 151 152#if defined(HAVE_UNAME) 153 if (uname(&uts) < 0) 154 { 155 rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname"); 156 return -1; 157 } 158 strncpy(hostname, uts.nodename, len); 159#elif defined(HAVE_GETHOSTNAME) 160 if (gethostname(hostname, len) < 0) 161 { 162 rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname"); 163 return -1; 164 } 165#elif defined(HAVE_SYSINFO) 166 if (sysinfo(SI_HOSTNAME, hostname, len) < 0) 167 { 168 rc_log(LOG_ERR,"rc_own_hostname: couldn't get own hostname"); 169 return -1; 170 } 171#else 172 return -1; 173#endif 174 175 return 0; 176} 177 178/* 179 * Function: rc_own_ipaddress 180 * 181 * Purpose: get the IP address of this host in host order 182 * 183 * Returns: IP address on success, 0 on failure 184 * 185 */ 186 187UINT4 rc_own_ipaddress(void) 188{ 189 static UINT4 this_host_ipaddr = 0; 190 char hostname[256]; 191 192 if (!this_host_ipaddr) { 193 if (rc_own_hostname(hostname, sizeof(hostname)) < 0) 194 return 0; 195 if ((this_host_ipaddr = rc_get_ipaddr (hostname)) == 0) { 196 rc_log(LOG_ERR, "rc_own_ipaddress: couldn't get own IP address"); 197 return 0; 198 } 199 } 200 201 return this_host_ipaddr; 202} 203