📄 util.c
字号:
/*
*
* RADIUS
* Remote Authentication Dial In User Service
*
*
* Livingston Enterprises, Inc.
* 6920 Koll Center Parkway
* Pleasanton, CA 94566
*
* Copyright 1992 Livingston Enterprises, Inc.
*
* Permission to use, copy, modify, and distribute this software for any
* purpose and without fee is hereby granted, provided that this
* copyright and permission notice appear on all copies and supporting
* documentation, the name of Livingston Enterprises, Inc. not be used
* in advertising or publicity pertaining to distribution of the
* program without specific prior permission, and notice be given
* in supporting documentation that copying and distribution is by
* permission of Livingston Enterprises, Inc.
*
* Livingston Enterprises, Inc. makes no representations about
* the suitability of this software for any purpose. It is
* provided "as is" without express or implied warranty.
*
*/
static char sccsid[] =
"@(#)util.c 1.5 Copyright 2002 Livingston Enterprises Inc";
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <stdio.h>
#include <netdb.h>
#include <pwd.h>
#include <time.h>
#include <ctype.h>
#include "radius.h"
/*************************************************************************
*
* Function: ip_hostname
*
* Purpose: Return a printable host name (or IP address in dot notation)
* for the supplied IP address.
*
*************************************************************************/
char *
ip_hostname(ipaddr)
UINT4 ipaddr;
{
struct hostent *hp;
static char hstname[128];
UINT4 n_ipaddr;
n_ipaddr = htonl(ipaddr);
hp = gethostbyaddr((char *)&n_ipaddr, sizeof (struct in_addr), AF_INET);
if (hp == 0) {
ipaddr2str(hstname, ipaddr);
return(hstname);
}
return(hp->h_name);
}
/*************************************************************************
*
* Function: get_ipaddr
*
* Purpose: Return an IP address in host long notation from a host
* name or address in dot notation.
*
*************************************************************************/
UINT4
get_ipaddr(host)
char *host;
{
struct hostent *hp;
static char buffer[32];
UINT4 ipstr2long();
if(good_ipaddr(host) == 0) {
return(ipstr2long(host));
}
else if((hp = gethostbyname(host)) == (struct hostent *)NULL) {
return((UINT4)0);
}
return(ntohl(*(UINT4 *)hp->h_addr));
}
/*************************************************************************
*
* Function: good_ipaddr
*
* Purpose: Check for valid IP address in standard dot notation.
*
*************************************************************************/
good_ipaddr(addr)
char *addr;
{
int dot_count;
int digit_count;
dot_count = 0;
digit_count = 0;
while(*addr != '\0' && *addr != ' ') {
if(*addr == '.') {
dot_count++;
digit_count = 0;
}
else if(!isdigit(*addr)) {
dot_count = 5;
}
else {
digit_count++;
if(digit_count > 3) {
dot_count = 5;
}
}
addr++;
}
if(dot_count != 3) {
return(-1);
}
else {
return(0);
}
}
/*************************************************************************
*
* Function: ipaddr2str
*
* Purpose: Return an IP address in standard dot notation for the
* provided address in host long notation.
*
*************************************************************************/
ipaddr2str(buffer, ipaddr)
char *buffer;
UINT4 ipaddr;
{
int addr_byte[4];
int i;
UINT4 xbyte;
for(i = 0;i < 4;i++) {
xbyte = ipaddr >> (i*8);
xbyte = xbyte & (UINT4)0x000000FF;
addr_byte[i] = xbyte;
}
sprintf(buffer, "%u.%u.%u.%u", addr_byte[3], addr_byte[2],
addr_byte[1], addr_byte[0]);
}
/*************************************************************************
*
* Function: pairfree
*
* Purpose: Release the memory used by a list of attribute-value
* pairs.
*
*************************************************************************/
pairfree(pair)
VALUE_PAIR *pair;
{
VALUE_PAIR *next;
while(pair != (VALUE_PAIR *)NULL) {
next = pair->next;
free(pair);
pair = next;
}
}
/*************************************************************************
*
* Function: ipstr2long
*
* Purpose: Return an IP address in host long notation from
* one supplied in standard dot notation.
*
*************************************************************************/
UINT4
ipstr2long(ip_str)
char *ip_str;
{
char buf[6];
char *ptr;
int i;
int count;
UINT4 ipaddr;
int cur_byte;
ipaddr = (UINT4)0;
for(i = 0;i < 4;i++) {
ptr = buf;
count = 0;
*ptr = '\0';
while(*ip_str != '.' && *ip_str != '\0' && count < 4) {
if(!isdigit(*ip_str)) {
return((UINT4)0);
}
*ptr++ = *ip_str++;
count++;
}
if(count >= 4 || count == 0) {
return((UINT4)0);
}
*ptr = '\0';
cur_byte = atoi(buf);
if(cur_byte < 0 || cur_byte > 255) {
return((UINT4)0);
}
ip_str++;
ipaddr = ipaddr << 8 | (UINT4)cur_byte;
}
return(ipaddr);
}
#ifdef CHECK_KNOWNCLIENT
/* Function: knownclient() */
int knownclient(UINT4 address) {
FILE *fp;
char buffer[1024];
snprintf(buffer, 1024, "%s/%s", radius_dir, RADIUS_CLIENTS);
buffer[1023] = '\0';
if(!(fp = fopen(buffer, "r")))
return(0);
while(fgets(buffer, 1024, fp)) {
char *hostname, *secret;
UINT4 caddr;
if(*buffer == '#')
continue;
if(sscanf(buffer, "%s%s", hostname, secret) != 2)
continue;
caddr = get_ipaddr(hostname);
if(caddr == address) {
fclose(fp);
return(1);
}
}
fclose(fp);
return(0);
}
#endif /* CHECK_KNOWNCLIENT */
/********************************/
/* Function: get_local_ipaddr() */
/********************************/
UINT4 get_local_ipaddr() {
char hstname[256];
struct hostent *hp;
if(gethostname(hstname, sizeof(hstname)) == 0) {
if((hp=gethostbyname(hstname)) != (struct hostent *)NULL)
return(ntohl(*(UINT4 *)hp->h_addr));
}
return((UINT4)0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -