⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.c

📁 radius server在linux下的源码
💻 C
字号:
/* * files.c	Read config files into memory. * * Version:     $Id: client.c,v 1.27 2004/04/07 16:02:05 aland Exp $ * *   This program is free software; you can redistribute it and/or modify *   it under the terms of the GNU General Public License as published by *   the Free Software Foundation; either version 2 of the License, or *   (at your option) any later version. * *   This program is distributed in the hope that it will be useful, *   but WITHOUT ANY WARRANTY; without even the implied warranty of *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *   GNU General Public License for more details. * *   You should have received a copy of the GNU General Public License *   along with this program; if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * Copyright 2000  The FreeRADIUS server project * Copyright 2000  Miquel van Smoorenburg <miquels@cistron.nl> * Copyright 2000  Alan DeKok <aland@ox.org> */static const char rcsid[] = "$Id: client.c,v 1.27 2004/04/07 16:02:05 aland Exp $";#include "autoconf.h"#include "libradius.h"#include <sys/stat.h>#ifdef HAVE_NETINET_IN_H#	include <netinet/in.h>#endif#include <stdlib.h>#include <string.h>#include <netdb.h>#include <ctype.h>#include <fcntl.h>#include "radiusd.h"#include "conffile.h"/* *	Free a RADCLIENT list. */void clients_free(RADCLIENT *cl){	RADCLIENT *next;	while(cl) {		next = cl->next;		free(cl);		cl = next;	}}/* *	Read the clients file. */int read_clients_file(const char *file){	FILE *fp;	RADCLIENT *c;	char buffer[256];	char hostnm[256];	char secret[256];	char shortnm[256];	uint32_t mask;	int lineno = 0;	char *p;	int got_clients = FALSE;	clients_free(mainconfig.clients);	mainconfig.clients = NULL;	if ((fp = fopen(file, "r")) == NULL) {		/* The clients file is no longer required.  All configuration		   information is read from radiusd.conf and friends.  If		   clients exists it will be used, but if it doesn't no harm		   done. */		return 0;	}	while(fgets(buffer, 256, fp) != NULL) {		lineno++;		if (!feof(fp) && (strchr(buffer, '\n') == NULL)) {			radlog(L_ERR, "%s[%d]: line too long", file, lineno);			return -1;		}		/*		 *	Skip whitespace.		 */		p = buffer;		while (*p &&				((*p == ' ') || (*p == '\t')))			p++;		/*		 *	Skip comments and blank lines.		 */		if ((*p == '#') || (*p == '\n') || (*p == '\r'))			continue;		if (!getword(&p, hostnm, sizeof(hostnm)) ||				!getword(&p, secret, sizeof(secret))) {			radlog(L_ERR, "%s[%d]: unexpected end of line",					file, lineno);			return -1;		}		(void)getword(&p, shortnm, sizeof(shortnm));		/*		 *	Look for a mask in the hostname		 */		p = strchr(hostnm, '/');		mask = ~0;		if (p) {			int mask_length;			*p = '\0';			p++;			mask_length = atoi(p);			if ((mask_length < 0) || (mask_length > 32)) {				radlog(L_ERR, "%s[%d]: Invalid value '%s' for IP network mask.",				       file, lineno, p);				return -1;			}			if (mask_length == 0) {				mask = 0;			} else {				mask = ~0 << (32 - mask_length);			}		}		/*		 *	Double-check lengths to be sure they're sane		 */		if (strlen(hostnm) >= sizeof(c->longname)) {			radlog(L_ERR, "%s[%d]: host name of length %d is greater than the allowed maximum of %d.",			       file, lineno,			       (int) strlen(hostnm),			       (int) sizeof(c->longname) - 1);			return -1;		}		if (strlen(secret) >= sizeof(c->secret)) {			radlog(L_ERR, "%s[%d]: secret of length %d is greater than the allowed maximum of %d.",			       file, lineno,			       (int) strlen(secret),			       (int) sizeof(c->secret) - 1);			return -1;		}		if (strlen(shortnm) > sizeof(c->shortname)) {			radlog(L_ERR, "%s[%d]: short name of length %d is greater than the allowed maximum of %d.",			       file, lineno,			       (int) strlen(shortnm),			       (int) sizeof(c->shortname) - 1);			return -1;		}		/*		 *	It should be OK now, let's create the buffer.		 */		got_clients = TRUE;		c = rad_malloc(sizeof(RADCLIENT));		memset(c, 0, sizeof(*c));		c->ipaddr = ip_getaddr(hostnm);		if (c->ipaddr == INADDR_NONE) {			radlog(L_CONS|L_ERR, "%s[%d]: Failed to look up hostname %s",					file, lineno, hostnm);			return -1;		}		c->netmask = htonl(mask);		c->ipaddr &= c->netmask; /* addr & mask are in network order */		strcpy((char *)c->secret, secret);		strcpy(c->shortname, shortnm);		/*		 *	Only do DNS lookups for machines.  Just print		 *	the network as the long name.		 */		if ((~mask) == 0) {			NAS *nas;			ip_hostname(c->longname, sizeof(c->longname), c->ipaddr);			/*			 *	Pull information over from the NAS.			 */			nas = nas_find(c->ipaddr);			if (nas) {				/*				 *	No short name in the 'clients' file,				 *	try copying one over from the				 *	'naslist' file.				 */				if (c->shortname[0] == '\0') {					strcpy(c->shortname, nas->shortname);				}				/*				 *  Copy the nastype over, too.				 */				strcpy(c->nastype, nas->nastype);			}		} else {			hostnm[strlen(hostnm)] = '/';			strNcpy(c->longname, hostnm, sizeof(c->longname));		}		c->next = mainconfig.clients;		mainconfig.clients = c;	}	fclose(fp);	if (got_clients) {		radlog(L_INFO, "Using deprecated clients file.  Support for this will go away soon.");	}	return 0;}/* *	Find a client in the RADCLIENTS list. */RADCLIENT *client_find(uint32_t ipaddr){	RADCLIENT *cl;	RADCLIENT *match = NULL;	for (cl = mainconfig.clients; cl; cl = cl->next) {		if ((ipaddr & cl->netmask) == cl->ipaddr) {			if ((!match) ||			    (ntohl(cl->netmask) > ntohl(match->netmask))) {				match = cl;			}		}	}	return match;}/* *	Walk the RADCLIENT list displaying the clients.  This function *	is for debugging purposes. */void client_walk(void){	RADCLIENT *cl;	char host_ipaddr[16];	for (cl = mainconfig.clients; cl != NULL; cl = cl->next)		radlog(L_ERR, "client: client_walk: %s\n",				ip_ntoa(host_ipaddr, cl->ipaddr));}/* *	Find the name of a client (prefer short name). */const char *client_name(uint32_t ipaddr){	/* We don't call this unless we should know about the client. */	RADCLIENT *cl;	char host_ipaddr[16];	if ((cl = client_find(ipaddr)) != NULL) {		if (cl->shortname[0])			return cl->shortname;		else			return cl->longname;	}	/*	 * this isn't normally reachable, but if a loggable event happens just	 * after a client list change and a HUP, then we may not know this	 * information any more.	 *	 * If you see lots of these, then there's something wrong.	 */	radlog(L_ERR, "Trying to look up name of unknown client %s.\n",	       ip_ntoa(host_ipaddr, ipaddr));	return "UNKNOWN-CLIENT";}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -