Annotation of embedaddon/coova-chilli/src/main-radconfig.c, revision 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>