Annotation of embedaddon/coova-chilli/src/main-radconfig.c, revision 1.1.1.1
1.1 misho 1: /*
2: *
3: * chilli - ChilliSpot.org. A Wireless LAN Access Point Controller.
4: * Copyright (C) 2003, 2004, 2005 Mondru AB.
5: * Copyright (C) 2006 PicoPoint B.V.
6: * Copyright (c) 2006-2007 David Bird <david@coova.com>
7: *
8: * The contents of this file may be used under the terms of the GNU
9: * General Public License Version 2, provided that the above copyright
10: * notice and this permission notice is included in all copies or
11: * substantial portions of the software.
12: *
13: */
14:
15: #include "system.h"
16: #include "syserr.h"
17: #include "cmdline.h"
18: #include "dhcp.h"
19: #include "radius.h"
20: #include "radius_chillispot.h"
21: #include "radius_wispr.h"
22: #include "redir.h"
23: #include "chilli.h"
24: #include "options.h"
25:
26: #define ADMIN_TIMEOUT 10
27:
28: static int chilliauth_cb(struct radius_t *radius,
29: struct radius_packet_t *pack,
30: struct radius_packet_t *pack_req, void *cbp) {
31: struct radius_attr_t *attr = NULL;
32: /*char attrs[RADIUS_ATTR_VLEN+1];*/
33: size_t offset = 0;
34:
35: if (!pack) {
36: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Radius request timed out");
37: return 0;
38: }
39:
40: if ((pack->code != RADIUS_CODE_ACCESS_REJECT) &&
41: (pack->code != RADIUS_CODE_ACCESS_CHALLENGE) &&
42: (pack->code != RADIUS_CODE_ACCESS_ACCEPT)) {
43: sys_err(LOG_ERR, __FILE__, __LINE__, 0,
44: "Unknown radius access reply code %d", pack->code);
45: return 0;
46: }
47:
48: /* ACCESS-ACCEPT */
49: if (pack->code != RADIUS_CODE_ACCESS_ACCEPT) {
50: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Administrative-User Login Failed");
51: return 0;
52: }
53:
54: while (!radius_getnextattr(pack, &attr,
55: RADIUS_ATTR_VENDOR_SPECIFIC,
56: RADIUS_VENDOR_CHILLISPOT,
57: RADIUS_ATTR_CHILLISPOT_CONFIG,
58: 0, &offset)) {
59: char value[RADIUS_ATTR_VLEN+1] = "";
60: strncpy(value, (const char *)attr->v.t, attr->l - 2);
61: printf("%s\n", value);
62: }
63:
64: return 0;
65:
66: }
67:
68: int static chilliauth() {
69: unsigned char hwaddr[6];
70: struct radius_t *radius=0;
71: struct timeval idleTime;
72: int endtime, now;
73: int maxfd = 0;
74: fd_set fds;
75: int status;
76: int ret=-1;
77:
78: if (!options.adminuser || !options.adminpasswd) return 1;
79:
80: if (radius_new(&radius, &options.radiuslisten, 0, 0, NULL, 0, NULL, NULL, NULL)) {
81: log_err(0, "Failed to create radius");
82: return ret;
83: }
84:
85: /* get dhcpif mac */
86: memset(hwaddr, 0, sizeof(hwaddr));
87:
88: #ifdef SIOCGIFHWADDR
89: if (!options.nasmac && options.dhcpif) {
90: struct ifreq ifr;
91: int fd;
92: if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) >= 0) {
93: memset(&ifr, 0, sizeof(ifr));
94: strncpy(ifr.ifr_name, options.dhcpif, IFNAMSIZ);
95: if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) {
96: log_err(errno, "ioctl(d=%d, request=%d) failed", fd, SIOCGIFHWADDR);
97: }
98: memcpy(hwaddr, ifr.ifr_hwaddr.sa_data, PKT_ETH_ALEN);
99: close(fd);
100: }
101: }
102: #endif
103:
104: radius_set(radius, hwaddr, (options.debug & DEBUG_RADIUS));
105: radius_set_cb_auth_conf(radius, chilliauth_cb);
106:
107: ret = chilliauth_radius(radius);
108:
109: if (radius->fd <= 0) {
110: log_err(0, "not a valid socket!");
111: return ret;
112: }
113:
114: maxfd = radius->fd;
115:
116: now = time(NULL);
117: endtime = now + ADMIN_TIMEOUT;
118:
119: while (endtime > now) {
120:
121: FD_ZERO(&fds);
122: FD_SET(radius->fd, &fds);
123:
124: idleTime.tv_sec = 0;
125: idleTime.tv_usec = REDIR_RADIUS_SELECT_TIME;
126: radius_timeleft(radius, &idleTime);
127:
128: switch (status = select(maxfd + 1, &fds, NULL, NULL, &idleTime)) {
129: case -1:
130: sys_err(LOG_ERR, __FILE__, __LINE__, errno, "select() returned -1!");
131: break;
132: case 0:
133: radius_timeout(radius);
134: default:
135: break;
136: }
137:
138: if (status > 0) {
139: if (FD_ISSET(radius->fd, &fds)) {
140: if (radius_decaps(radius) < 0) {
141: sys_err(LOG_ERR, __FILE__, __LINE__, 0, "radius_ind() failed!");
142: }
143: else {
144: ret = 0;
145: }
146: break;
147: }
148: }
149:
150: now = time(NULL);
151: }
152:
153: radius_free(radius);
154: return ret;
155: }
156:
157: int main(int argc, char **argv)
158: {
159: if (process_options(argc, argv, 1))
160: exit(1);
161:
162: return chilliauth();
163: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>