Software /
code /
prosody
Comparison
util-src/net.c @ 8426:8b612ec00e4a
util.net: Add bindings to inet_ntop and inet_pton
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sun, 26 Nov 2017 02:26:13 +0100 |
parent | 7969:1c6a07606309 |
child | 9150:c1d5f52274cf |
comparison
equal
deleted
inserted
replaced
8425:91c220f43826 | 8426:8b612ec00e4a |
---|---|
123 | 123 |
124 #endif | 124 #endif |
125 return 1; | 125 return 1; |
126 } | 126 } |
127 | 127 |
128 static int lc_pton(lua_State *L) { | |
129 char buf[16]; | |
130 const char *ipaddr = luaL_checkstring(L, 1); | |
131 int errno_ = 0; | |
132 int family = strchr(ipaddr, ':') ? AF_INET6 : AF_INET; | |
133 | |
134 switch(inet_pton(family, ipaddr, &buf)) { | |
135 case 1: | |
136 lua_pushlstring(L, buf, family == AF_INET6 ? 16 : 4); | |
137 return 1; | |
138 | |
139 case -1: | |
140 errno_ = errno; | |
141 lua_pushnil(L); | |
142 lua_pushstring(L, strerror(errno_)); | |
143 lua_pushinteger(L, errno_); | |
144 return 3; | |
145 | |
146 default: | |
147 case 0: | |
148 lua_pushnil(L); | |
149 lua_pushstring(L, strerror(EINVAL)); | |
150 lua_pushinteger(L, EINVAL); | |
151 return 3; | |
152 } | |
153 | |
154 } | |
155 | |
156 static int lc_ntop(lua_State *L) { | |
157 char buf[INET6_ADDRSTRLEN]; | |
158 int family; | |
159 int errno_; | |
160 size_t l; | |
161 const char *ipaddr = luaL_checklstring(L, 1, &l); | |
162 | |
163 if(l == 16) { | |
164 family = AF_INET6; | |
165 } | |
166 else if(l == 4) { | |
167 family = AF_INET; | |
168 } | |
169 else { | |
170 lua_pushnil(L); | |
171 lua_pushstring(L, strerror(EAFNOSUPPORT)); | |
172 lua_pushinteger(L, EAFNOSUPPORT); | |
173 return 3; | |
174 } | |
175 | |
176 if(!inet_ntop(family, ipaddr, buf, INET6_ADDRSTRLEN)) | |
177 { | |
178 errno_ = errno; | |
179 lua_pushnil(L); | |
180 lua_pushstring(L, strerror(errno_)); | |
181 lua_pushinteger(L, errno_); | |
182 return 3; | |
183 } | |
184 | |
185 lua_pushstring(L, (const char *)(&buf)); | |
186 return 1; | |
187 } | |
188 | |
128 int luaopen_util_net(lua_State *L) { | 189 int luaopen_util_net(lua_State *L) { |
129 #if (LUA_VERSION_NUM > 501) | 190 #if (LUA_VERSION_NUM > 501) |
130 luaL_checkversion(L); | 191 luaL_checkversion(L); |
131 #endif | 192 #endif |
132 luaL_Reg exports[] = { | 193 luaL_Reg exports[] = { |
133 { "local_addresses", lc_local_addresses }, | 194 { "local_addresses", lc_local_addresses }, |
195 { "pton", lc_pton }, | |
196 { "ntop", lc_ntop }, | |
134 { NULL, NULL } | 197 { NULL, NULL } |
135 }; | 198 }; |
136 | 199 |
137 lua_createtable(L, 0, 1); | 200 lua_createtable(L, 0, 1); |
138 luaL_setfuncs(L, exports, 0); | 201 luaL_setfuncs(L, exports, 0); |