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 van 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)
74 if ((fp = fopen(file, "r")) == NULL) {
75 /* The naslist file is no longer required. All configuration
76 information comes from radiusd.conf. If naslist exists it
77 will be used, but if it doesn't exist it will be silently
81 radlog(L_INFO, "Using deprecated naslist file. Support for this will go away soon.");
82 while(fgets(buffer, 256, fp) != NULL) {
84 if (!feof(fp) && (strchr(buffer, '\n') == NULL)) {
85 radlog(L_ERR, "%s[%d]: line too long", file, lineno);
88 if (buffer[0] == '#' || buffer[0] == '\n')
92 if (!getword(&p, hostnm, sizeof(hostnm)) ||
93 !getword(&p, shortnm, sizeof(shortnm))) {
94 radlog(L_ERR, "%s[%d]: unexpected end of line",
98 (void)getword(&p, nastype, sizeof(nastype));
101 * Double-check lengths to be sure they're sane
103 if (strlen(hostnm) >= sizeof(nas->longname)) {
104 radlog(L_ERR, "%s[%d]: host name of length %d is greater than the allowed maximum of %d.",
106 (int) strlen(hostnm),
107 (int) sizeof(nas->longname) - 1);
110 if (strlen(shortnm) > sizeof(nas->shortname)) {
111 radlog(L_ERR, "%s[%d]: short name of length %d is greater than the allowed maximum of %d.",
113 (int) strlen(shortnm),
114 (int) sizeof(nas->shortname) - 1);
117 if (strlen(nastype) >= sizeof(nas->nastype)) {
118 radlog(L_ERR, "%s[%d]: NAS type of length %d is greater than the allowed maximum of %d.",
120 (int) strlen(nastype),
121 (int) sizeof(nas->nastype) - 1);
126 * It should be OK now, let's create the buffer.
128 nas = rad_malloc(sizeof(NAS));
129 memset(nas, 0, sizeof(*nas));
131 strcpy(nas->nastype, nastype);
132 strcpy(nas->shortname, shortnm);
134 if (strcmp(hostnm, "DEFAULT") == 0) {
136 strcpy(nas->longname, hostnm);
138 nas->ipaddr = ip_getaddr(hostnm);
139 ip_hostname(nas->longname, sizeof(nas->longname),
153 * Find a nas by IP address.
154 * If it can't be found, return the DEFAULT nas, instead.
156 NAS *nas_find(uint32_t ipaddr)
163 for (nas = naslist; nas; nas = nas->next) {
164 if (ipaddr == nas->ipaddr)
166 if (strcmp(nas->longname, "DEFAULT") == 0)
175 * Find a nas by name.
176 * If it can't be found, return the DEFAULT nas, instead.
178 NAS *nas_findbyname(char *nasname)
185 for (nas = naslist; nas; nas = nas->next) {
186 if (strcmp(nasname, nas->shortname) == 0 ||
187 strcmp(nasname, nas->longname) == 0)
189 if (strcmp(nas->longname, "DEFAULT") == 0)
198 * Find the name of a nas (prefer short name).
200 const char *nas_name(uint32_t ipaddr)
204 if ((nas = nas_find(ipaddr)) != NULL) {
205 if (nas->shortname[0])
206 return nas->shortname;
208 return nas->longname;
211 return "UNKNOWN-NAS";
215 * Find the name of a nas (prefer short name) based on the request.
217 const char *nas_name2(RADIUS_PACKET *packet)
221 if ((nas = nas_find(packet->src_ipaddr)) != NULL) {
222 if (nas->shortname[0])
223 return nas->shortname;
225 return nas->longname;
228 return "UNKNOWN-NAS";
232 * Find the name of a nas (prefer short name) based on ipaddr,
233 * store in passed buffer. If NAS is unknown, return dotted quad.
235 char * nas_name3(char *buf, size_t buflen, uint32_t ipaddr)
239 if ((nas = nas_find(ipaddr)) != NULL) {
240 if (nas->shortname[0]) {
241 strNcpy(buf, (char *)nas->shortname, buflen);
245 strNcpy(buf, (char *)nas->longname, buflen);
249 ip_ntoa(buf, ipaddr);