diff options
author | Timo Teräs <timo.teras@iki.fi> | 2010-08-27 17:05:18 +0300 |
---|---|---|
committer | Timo Teräs <timo.teras@iki.fi> | 2010-08-27 17:05:18 +0300 |
commit | b8944ab71ccdc9951c6b74ef8ed8686d0329f99c (patch) | |
tree | a44327faefdfb99bf61d1249c044bfef66419267 /addr.c | |
parent | 29331f1c5e940499f282aea8155b89fae69f3fb8 (diff) | |
download | squark-b8944ab71ccdc9951c6b74ef8ed8686d0329f99c.tar.bz2 squark-b8944ab71ccdc9951c6b74ef8ed8686d0329f99c.tar.xz |
authdb: implement basics
Implement a shared memory based authentication cache. It's a simple
local cache indexed by IP-address, and keeps track of that IP's
auth info such as username, allowed categories and timeouts. This
provides basis for captive portal, per-user definable category
restrictions and implementation of soft blocks (block which can
be overridden by user by clicking a button on the blocked page).
Diffstat (limited to 'addr.c')
-rw-r--r-- | addr.c | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -0,0 +1,53 @@ +#include <string.h> + +#include "addr.h" + +int addr_len(const sockaddr_any *addr) +{ + switch (addr->any.sa_family) { + case AF_INET: + return sizeof(struct sockaddr_in); + default: + return 0; + } +} + +sockaddr_any *addr_parse(blob_t b, sockaddr_any *addr) +{ + memset(addr, 0, sizeof(*addr)); + addr->ipv4.sin_family = AF_INET; + addr->ipv4.sin_addr.s_addr = blob_inet_addr(b); + if (addr->ipv4.sin_addr.s_addr == -1) + return NULL; + return addr; +} + +unsigned long addr_hash(const sockaddr_any *addr) +{ + switch (addr->any.sa_family) { + case AF_INET: + return htonl(addr->ipv4.sin_addr.s_addr); + default: + return 0; + } +} + +const char *addr_print(const sockaddr_any *addr) +{ + switch (addr->any.sa_family) { + case AF_INET: + return inet_ntoa(addr->ipv4.sin_addr); + default: + return "unknown"; + } +} + +blob_t addr_get_hostaddr_blob(const sockaddr_any *addr) +{ + switch (addr->any.sa_family) { + case AF_INET: + return BLOB_BUF(&addr->ipv4.sin_addr); + default: + return BLOB_NULL; + } +} |