diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-08-18 16:10:25 -0700 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2014-08-18 16:10:25 -0700 |
commit | d8f735c3d602e961936c1f783c42917a9e6a869c (patch) | |
tree | 2896f5d3743047afc5245078d856fad9cf08dd6f /src/lua | |
parent | 2323c30e8ee4ac54331cb9e3dd56060254626655 (diff) | |
download | rspamd-d8f735c3d602e961936c1f783c42917a9e6a869c.tar.gz rspamd-d8f735c3d602e961936c1f783c42917a9e6a869c.zip |
Refactor lua_ip one more time.
Suggested by: clock via irc
Diffstat (limited to 'src/lua')
-rw-r--r-- | src/lua/lua_ip.c | 44 |
1 files changed, 27 insertions, 17 deletions
diff --git a/src/lua/lua_ip.c b/src/lua/lua_ip.c index 647594198..b0ffe1401 100644 --- a/src/lua/lua_ip.c +++ b/src/lua/lua_ip.c @@ -60,13 +60,23 @@ static const struct luaL_reg iplib_f[] = { {NULL, NULL} }; -#define NEW_IP(n, o, p) do { \ - (n) = g_slice_alloc (sizeof (struct rspamd_lua_ip)); \ - if ((o) != NULL) { memcpy ((n), (o) ? (o) : (n), sizeof (struct rspamd_lua_ip)); } \ - (p) = lua_newuserdata (L, sizeof (struct rspamd_lua_ip *)); \ - rspamd_lua_setclass (L, "rspamd{ip}", -1); \ - *(p) = (n); \ -} while(0) +static struct rspamd_lua_ip * +lua_ip_new (lua_State *L, struct rspamd_lua_ip *old) +{ + struct rspamd_lua_ip *ip, **pip; + + ip = g_slice_alloc (sizeof (*ip)); + + if (old != NULL) { + memcpy (ip, old, sizeof (*ip)); + } + pip = lua_newuserdata (L, sizeof (struct rspamd_lua_ip *)); + rspamd_lua_setclass (L, "rspamd{ip}", -1); + *pip = ip; + + + return ip; +} static struct rspamd_lua_ip * lua_check_ip (lua_State * L, gint pos) @@ -216,12 +226,12 @@ lua_ip_to_string (lua_State *L) static gint lua_ip_from_string (lua_State *L) { - struct rspamd_lua_ip *ip, **pip; + struct rspamd_lua_ip *ip; const gchar *ip_str; ip_str = luaL_checkstring (L, 1); if (ip_str) { - NEW_IP(ip, NULL, pip); + ip = lua_ip_new (L, NULL); ip->is_valid = rspamd_parse_inet_address (&ip->addr, ip_str); } else { @@ -264,11 +274,11 @@ static gint lua_ip_from_number (lua_State *L) { guint32 src[4], i; - struct rspamd_lua_ip *ip, **pip; + struct rspamd_lua_ip *ip; if (lua_gettop (L) == 1 && lua_isnumber (L, 1)) { /* Ipv4 version */ - NEW_IP(ip, NULL, pip); + ip = lua_ip_new (L, NULL); src[0] = lua_tointeger (L, 1); ip->addr.af = AF_INET; ip->is_valid = TRUE; @@ -280,7 +290,7 @@ lua_ip_from_number (lua_State *L) src[i] = htonl (lua_tonumber (L, i + 1)); } G_STATIC_ASSERT (sizeof (ip->addr.addr.s6.sin6_addr) >= sizeof (src)); - NEW_IP(ip, NULL, pip); + ip = lua_ip_new (L, NULL); ip->addr.af = AF_INET6; ip->is_valid = TRUE; memcpy (&ip->addr.addr.s6.sin6_addr, src, sizeof (src)); @@ -337,19 +347,19 @@ lua_ip_is_valid (lua_State *L) static gint lua_ip_apply_mask (lua_State *L) { - struct rspamd_lua_ip *ip = lua_check_ip (L, 1), *nip, **pip; + struct rspamd_lua_ip *ip = lua_check_ip (L, 1), *nip; gint mask; guint32 umsk, *p; mask = lua_tonumber (L, 2); if (mask > 0 && ip->is_valid) { if (ip->addr.af == AF_INET && mask <= 32) { - NEW_IP(nip, ip, pip); + nip = lua_ip_new (L, ip); umsk = htonl (G_MAXUINT32 << (32 - mask)); nip->addr.addr.s4.sin_addr.s_addr &= umsk; } else if (ip->addr.af == AF_INET && mask <= 128) { - NEW_IP(nip, ip, pip); + nip = lua_ip_new (L, ip); p = (uint32_t *)&nip->addr.addr.s6.sin6_addr; p += 3; while (mask > 0) { @@ -402,10 +412,10 @@ static gint lua_ip_copy (lua_State *L) { struct rspamd_lua_ip *ip = lua_check_ip (L, 1), - *nip, **pip; + *nip; if (ip) { - NEW_IP(nip, ip, pip); + nip = lua_ip_new (L, ip); } else { lua_pushnil (L); |