2 * nas.c Functions to do with a NASLIST. This is here because
3 * radzap needs it as well.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 * Copyright 2000 The FreeRADIUS server project
22 * Copyright 2000 Miquel von Smoorenburg <miquels@cistron.nl>
23 * Copyright 2000 Alan DeKok <aland@ox.org>
26 static const char rcsid[] = "$Id$";
29 #include "libradius.h"
39 static NAS *naslist = NULL;
44 static void nas_free(NAS *cl)
58 int read_naslist_file(char *file)
72 if ((fp = fopen(file, "r")) == NULL) {
73 radlog(L_CONS|L_ERR, "cannot open %s", file);
76 while(fgets(buffer, 256, fp) != NULL) {
78 if (strchr(buffer, '\n') == NULL) {
79 radlog(L_ERR, "%s[%d]: line too long", file, lineno);
82 if (buffer[0] == '#' || buffer[0] == '\n')
86 if (!getword(&p, hostnm, sizeof(hostnm)) ||
87 !getword(&p, shortnm, sizeof(shortnm))) {
88 radlog(L_ERR, "%s[%d]: unexpected end of line", file, lineno);
91 (void)getword(&p, nastype, sizeof(nastype));
94 * Double-check lengths to be sure they're sane
96 if (strlen(hostnm) >= sizeof(nas->longname)) {
97 radlog(L_ERR, "%s[%d]: host name of length %d is greater than the allowed maximum of %d.",
99 strlen(hostnm), sizeof(nas->longname) - 1);
102 if (strlen(shortnm) > sizeof(nas->shortname)) {
103 radlog(L_ERR, "%s[%d]: short name of length %d is greater than the allowed maximum of %d.",
105 strlen(shortnm), sizeof(nas->shortname) - 1);
108 if (strlen(nastype) >= sizeof(nas->nastype)) {
109 radlog(L_ERR, "%s[%d]: NAS type of length %d is greater than the allowed maximum of %d.",
111 strlen(nastype), sizeof(nas->nastype) - 1);
116 * It should be OK now, let's create the buffer.
118 nas = rad_malloc(sizeof(NAS));
120 strcpy(nas->nastype, nastype);
121 strcpy(nas->shortname, shortnm);
123 if (strcmp(hostnm, "DEFAULT") == 0) {
125 strcpy(nas->longname, hostnm);
127 nas->ipaddr = ip_getaddr(hostnm);
128 ip_hostname(nas->longname, sizeof(nas->longname),
142 * Find a nas by IP address.
143 * If it can't be found, return the DEFAULT nas, instead.
145 NAS *nas_find(uint32_t ipaddr)
152 for (nas = naslist; nas; nas = nas->next) {
153 if (ipaddr == nas->ipaddr)
155 if (strcmp(nas->longname, "DEFAULT") == 0)
164 * Find a nas by name.
165 * If it can't be found, return the DEFAULT nas, instead.
167 NAS *nas_findbyname(char *nasname)
174 for (nas = naslist; nas; nas = nas->next) {
175 if (strcmp(nasname, nas->shortname) == 0 ||
176 strcmp(nasname, nas->longname) == 0)
178 if (strcmp(nas->longname, "DEFAULT") == 0)
187 * Find the name of a nas (prefer short name).
189 const char *nas_name(uint32_t ipaddr)
193 if ((nas = nas_find(ipaddr)) != NULL) {
194 if (nas->shortname[0])
195 return nas->shortname;
197 return nas->longname;
200 return client_name(ipaddr);
204 * Find the name of a nas (prefer short name) based on the request.
206 const char *nas_name2(RADIUS_PACKET *packet)
210 if ((nas = nas_find(packet->src_ipaddr)) != NULL) {
211 if (nas->shortname[0])
212 return nas->shortname;
214 return nas->longname;
217 return client_name(packet->src_ipaddr);