diff --git a/.gitignore b/.gitignore
index 4b30ae0..8307483 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,16 @@
*.o
*.so
*.so.*
+*.obj
+*.lib
+*.dll*
+*.user
+*.sdf
+Lua.props
+Debug
+Release
+*.manifest
+*.swp
+*.suo
+x64
diff --git a/Lua51.props b/Lua51.props
new file mode 100644
index 0000000..1bd6256
--- /dev/null
+++ b/Lua51.props
@@ -0,0 +1,28 @@
+
+
+
+
+ ..\build\vc12\bin\lua\5.1\
+ ..\build\vc12\bin\lua\5.1\
+ ..\build\vc12\include\lua\5.1\
+ lua51.lib
+
+
+ <_PropertySheetDisplayName>Lua51
+
+
+
+
+ $(LUALIB_PATH)
+
+
+ $(LUABIN_PATH)
+
+
+ $(LUAINC_PATH)
+
+
+ $(LUALIB)
+
+
+
diff --git a/Lua52.props b/Lua52.props
new file mode 100644
index 0000000..01afcfa
--- /dev/null
+++ b/Lua52.props
@@ -0,0 +1,28 @@
+
+
+
+
+ ..\build\vc12\bin\lua\5.2\
+ ..\build\vc12\bin\lua\5.2\
+ ..\build\vc12\include\lua\5.2\
+ lua52.lib
+
+
+ <_PropertySheetDisplayName>Lua52
+
+
+
+
+ $(LUALIB_PATH)
+
+
+ $(LUABIN_PATH)
+
+
+ $(LUAINC_PATH)
+
+
+ $(LUALIB)
+
+
+
diff --git a/mime.vcxproj b/mime.vcxproj
index 95781f2..63f5452 100755
--- a/mime.vcxproj
+++ b/mime.vcxproj
@@ -21,6 +21,19 @@
+
+
+ Document
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)
+ $(LUABIN_PATH)$(Configuration)\%(Filename)%(Extension)
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)
+ $(LUABIN_PATH)$(Configuration)\%(Filename)%(Extension)
+ copy %(FullPath) $(LUALIB_PATH)$(Platform)\$(Configuration)
+ copy %(FullPath) $(LUALIB_PATH)$(Platform)\$(Configuration)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\%(Filename)%(Extension)
+
+
{128E8BD0-174A-48F0-8771-92B1E8D18713}
Win32Proj
@@ -52,25 +65,29 @@
+
+
+
+
<_ProjectFileVersion>11.0.50727.1
- $(SolutionDir)\$(Configuration)\mime\
+ $(LUABIN_PATH)$(Configuration)\mime\
$(Configuration)\
true
core
@@ -78,23 +95,23 @@
true
core
- $(SolutionDir)$(Platform)\$(Configuration)\mime\
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\mime\
- $(SolutionDir)\$(Configuration)\mime\
+ $(LUABIN_PATH)$(Configuration)\mime\
$(Configuration)\
false
core
false
- $(SolutionDir)$(Platform)\$(Configuration)\mime\
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\mime\
core
Disabled
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;_DEBUG;_WINDOWS;_USRDLL;MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;%(PreprocessorDefinitions)
true
EnableFastChecks
@@ -102,11 +119,12 @@
Level3
EditAndContinue
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;%(AdditionalDependencies)
+ $(LUALIB);%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Configuration);%(AdditionalLibraryDirectories)
true
$(OutDir)mime.pdb
Windows
@@ -114,12 +132,13 @@
$(OutDir)$(TargetName).lib
MachineX86
+ false
Disabled
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;_DEBUG;_WINDOWS;_USRDLL;MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebugDLL
@@ -127,11 +146,12 @@
Level3
ProgramDatabase
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;%(AdditionalDependencies)
+ $(LUALIB);%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
true
$(OutDir)mime.pdb
Windows
@@ -143,17 +163,18 @@
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;NDEBUG;_WINDOWS;_USRDLL;MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;%(PreprocessorDefinitions)
MultiThreadedDLL
Level4
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;%(AdditionalDependencies)
+ $(LUALIB);%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Configuration);%(AdditionalLibraryDirectories)
true
Windows
true
@@ -166,7 +187,7 @@
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;NDEBUG;_WINDOWS;_USRDLL;MIME_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;%(PreprocessorDefinitions)
MultiThreadedDLL
@@ -174,11 +195,12 @@
Level4
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;%(AdditionalDependencies)
+ $(LUALIB);%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
true
Windows
true
diff --git a/mime.vcxproj.filters b/mime.vcxproj.filters
new file mode 100644
index 0000000..621215b
--- /dev/null
+++ b/mime.vcxproj.filters
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ {fad87a86-297c-4881-a114-73b967bb3c92}
+
+
+
+
+ cdir
+
+
+
\ No newline at end of file
diff --git a/socket.vcxproj b/socket.vcxproj
index 0256c90..307a8ae 100755
--- a/socket.vcxproj
+++ b/socket.vcxproj
@@ -32,6 +32,98 @@
+
+
+ Document
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)
+ $(LUABIN_PATH)$(Configuration)\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\%(Filename)%(Extension)
+
+
+ Document
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)
+ $(LUABIN_PATH)$(Configuration)\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\%(Filename)%(Extension)
+
+
+
+
+ Document
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+
+
+ Document
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+
+
+ Document
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+
+
+ Document
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+
+
+ Document
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+
+
+ Document
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ $(LUABIN_PATH)$(Configuration)\socket\%(Filename)%(Extension)
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Platform)\$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+ copy %(FullPath) $(LUABIN_PATH)$(Configuration)\socket
+
+
{66E3CE14-884D-4AEA-9F20-15A0BEAF8C5A}
Win32Proj
@@ -63,25 +155,29 @@
+
+
+
+
<_ProjectFileVersion>11.0.50727.1
- $(SolutionDir)\$(Configuration)\socket\
+ $(LUALIB_PATH)$(Configuration)\socket\
$(Configuration)\
true
core
@@ -89,23 +185,23 @@
true
core
- $(SolutionDir)$(Platform)\$(Configuration)\socket\
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\
- $(SolutionDir)\$(Configuration)\socket\
+ $(LUALIB_PATH)$(Configuration)\socket\
$(Configuration)\
false
core
false
- $(SolutionDir)$(Platform)\$(Configuration)\socket\
+ $(LUABIN_PATH)$(Platform)\$(Configuration)\socket\
core
Disabled
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;_DEBUG;_WINDOWS;_USRDLL;LUASOCKET_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;LUASOCKET_DEBUG;%(PreprocessorDefinitions)
true
EnableFastChecks
@@ -113,11 +209,12 @@
Level3
EditAndContinue
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;ws2_32.lib;%(AdditionalDependencies)
+ $(LUALIB);ws2_32.lib;%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Configuration);%(AdditionalLibraryDirectories)
true
$(OutDir)mime.pdb
Windows
@@ -125,12 +222,13 @@
$(OutDir)$(TargetName).lib
MachineX86
+ false
Disabled
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;_DEBUG;_WINDOWS;_USRDLL;LUASOCKET_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;LUASOCKET_DEBUG;%(PreprocessorDefinitions)
EnableFastChecks
MultiThreadedDebugDLL
@@ -138,11 +236,12 @@
Level3
ProgramDatabase
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;ws2_32.lib;%(AdditionalDependencies)
+ $(LUALIB);ws2_32.lib;%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
true
$(OutDir)mime.pdb
Windows
@@ -154,17 +253,18 @@
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;NDEBUG;_WINDOWS;_USRDLL;LUASOCKET_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;%(PreprocessorDefinitions)
MultiThreadedDLL
Level4
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;ws2_32.lib;%(AdditionalDependencies)
+ $(LUALIB);ws2_32.lib;%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Configuration);%(AdditionalLibraryDirectories)
true
Windows
true
@@ -177,7 +277,7 @@
- ..\include;%(AdditionalIncludeDirectories)
+ $(LUAINC_PATH);%(AdditionalIncludeDirectories)
WIN32;NDEBUG;_WINDOWS;_USRDLL;LUASOCKET_API=__declspec(dllexport);_CRT_SECURE_NO_WARNINGS;LUA_COMPAT_MODULE;%(PreprocessorDefinitions)
MultiThreadedDLL
@@ -185,11 +285,12 @@
Level4
+ $(IntDir)$(TargetName)$(PlatformToolsetVersion).pdb
- lualib.lib;ws2_32.lib;%(AdditionalDependencies)
+ $(LUALIB);ws2_32.lib;%(AdditionalDependencies)
$(OutDir)$(TargetName).dll
- ..\bin\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
+ $(LUALIB_PATH)$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)
true
Windows
true
diff --git a/socket.vcxproj.filters b/socket.vcxproj.filters
new file mode 100644
index 0000000..38f2f07
--- /dev/null
+++ b/socket.vcxproj.filters
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ cdir
+
+
+ cdir
+
+
+ ldir
+
+
+ ldir
+
+
+ ldir
+
+
+ ldir
+
+
+ ldir
+
+
+ ldir
+
+
+
+
+ {b053460d-5439-4e3a-a2eb-c31a95b5691f}
+
+
+ {b301b82c-37cb-4e05-9333-194e92ed7a62}
+
+
+
\ No newline at end of file
diff --git a/src/inet.c b/src/inet.c
index 0469756..1c44464 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -79,24 +79,22 @@ static int inet_global_tohostname(lua_State *L) {
}
static int inet_global_getnameinfo(lua_State *L) {
+ char hbuf[NI_MAXHOST];
+ char sbuf[NI_MAXSERV];
int i, ret;
- char host[1024];
- char serv[32];
struct addrinfo hints;
struct addrinfo *resolved, *iter;
- const char *node = luaL_optstring(L, 1, NULL);
- const char *service = luaL_optstring(L, 2, NULL);
+ const char *host = luaL_optstring(L, 1, NULL);
+ const char *serv = luaL_optstring(L, 2, NULL);
- if (!(node || service))
- luaL_error(L, "You have to specify a hostname, a service, or both");
+ if (!(host || serv))
+ luaL_error(L, "host and serv cannot be both nil");
memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = PF_UNSPEC;
- /* getaddrinfo must get a node and a service argument */
- ret = getaddrinfo(node ? node : "127.0.0.1", service ? service : "7",
- &hints, &resolved);
+ ret = getaddrinfo(host, serv, &hints, &resolved);
if (ret != 0) {
lua_pushnil(L);
lua_pushstring(L, socket_gaistrerror(ret));
@@ -105,19 +103,19 @@ static int inet_global_getnameinfo(lua_State *L) {
lua_newtable(L);
for (i = 1, iter = resolved; iter; i++, iter = iter->ai_next) {
- getnameinfo(iter->ai_addr, (socklen_t) iter->ai_addrlen, host,
- node ? (socklen_t) sizeof(host) : 0, serv, service ? (socklen_t) sizeof(serv) : 0, 0);
-
- if (node) {
+ getnameinfo(iter->ai_addr, (socklen_t) iter->ai_addrlen,
+ hbuf, host? (socklen_t) sizeof(hbuf): 0,
+ sbuf, serv? (socklen_t) sizeof(sbuf): 0, 0);
+ if (host) {
lua_pushnumber(L, i);
- lua_pushstring(L, host);
+ lua_pushstring(L, hbuf);
lua_settable(L, -3);
}
}
freeaddrinfo(resolved);
- if (service) {
- lua_pushstring(L, serv);
+ if (serv) {
+ lua_pushstring(L, sbuf);
return 2;
} else {
return 1;
@@ -176,20 +174,10 @@ static int inet_global_getaddrinfo(lua_State *L)
}
lua_newtable(L);
for (iterator = resolved; iterator; iterator = iterator->ai_next) {
- char hbuf[NI_MAXHOST]
-#ifndef _WINDOWS
- ,sbuf[NI_MAXSERV]
-#endif
- ;
- ret = getnameinfo(iterator->ai_addr, (socklen_t) iterator->ai_addrlen, hbuf,
- (socklen_t) sizeof(hbuf),
-#ifdef _WINDOWS
- NULL, 0,
-#else
- sbuf, 0,
-#endif
- NI_NUMERICHOST);
- if(ret){
+ char hbuf[NI_MAXHOST];
+ ret = getnameinfo(iterator->ai_addr, (socklen_t) iterator->ai_addrlen,
+ hbuf, (socklen_t) sizeof(hbuf), NULL, 0, NI_NUMERICHOST);
+ if (ret){
lua_pushnil(L);
lua_pushstring(L, socket_gaistrerror(ret));
return 2;
@@ -218,7 +206,6 @@ static int inet_global_getaddrinfo(lua_State *L)
return 1;
}
-
/*-------------------------------------------------------------------------*\
* Gets the host name
\*-------------------------------------------------------------------------*/
@@ -237,7 +224,6 @@ static int inet_global_gethostname(lua_State *L)
}
-
/*=========================================================================*\
* Lua methods
\*=========================================================================*/
@@ -520,7 +506,7 @@ const char *inet_trybind(p_socket ps, const char *address, const char *serv,
* Some systems do not provide this so that we provide our own. It's not
* marvelously fast, but it works just fine.
\*-------------------------------------------------------------------------*/
-#ifdef INET_ATON
+#ifdef LUASOCKET_INET_ATON
int inet_aton(const char *cp, struct in_addr *inp)
{
unsigned int a = 0, b = 0, c = 0, d = 0;
@@ -547,7 +533,7 @@ int inet_aton(const char *cp, struct in_addr *inp)
* http://mingw-users.1079350.n2.nabble.com/IPv6-getaddrinfo-amp-inet-ntop-td5891996.html
\*-------------------------------------------------------------------------*/
-#ifdef INET_PTON
+#ifdef LUASOCKET_INET_PTON
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
{
if (af == AF_INET) {
@@ -572,19 +558,23 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt)
int inet_pton(int af, const char *src, void *dst)
{
- struct addrinfo hints, *res, *ressave;
+ struct addrinfo hints, *res;
+ int ret = 1;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = af;
- if (getaddrinfo(src, NULL, &hints, &res) != 0) {
- return -1;
+ hints.ai_flags = AI_NUMERICHOST;
+ if (getaddrinfo(src, NULL, &hints, &res) != 0) return -1;
+ if (af == AF_INET) {
+ struct sockaddr_in *in = (struct sockaddr_in *) res->ai_addr;
+ memcpy(dst, &in->sin_addr, sizeof(in->sin_addr));
+ } else if (af == AF_INET6) {
+ struct sockaddr_in6 *in = (struct sockaddr_in6 *) res->ai_addr;
+ memcpy(dst, &in->sin6_addr, sizeof(in->sin6_addr));
+ } else {
+ ret = -1;
}
- ressave = res;
- while (res) {
- memcpy(dst, res->ai_addr, res->ai_addrlen);
- res = res->ai_next;
- }
- freeaddrinfo(ressave);
- return 0;
+ freeaddrinfo(res);
+ return ret;
}
#endif
diff --git a/src/inet.h b/src/inet.h
index 252e293..1f1a96a 100644
--- a/src/inet.h
+++ b/src/inet.h
@@ -19,8 +19,7 @@
#include "timeout.h"
#ifdef _WIN32
-#define INET_ATON
-#define INET_PTON
+#define LUASOCKET_INET_ATON
#endif
int inet_open(lua_State *L);
@@ -39,11 +38,11 @@ int inet_meth_getsockname(lua_State *L, p_socket ps, int family);
int inet_optfamily(lua_State* L, int narg, const char* def);
int inet_optsocktype(lua_State* L, int narg, const char* def);
-#ifdef INET_ATON
+#ifdef LUASOCKET_INET_ATON
int inet_aton(const char *cp, struct in_addr *inp);
#endif
-#ifdef INET_PTON
+#ifdef LUASOCKET_INET_PTON
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
int inet_pton(int af, const char *src, void *dst);
#endif
diff --git a/src/io.h b/src/io.h
index 8cca08a..76a3e58 100644
--- a/src/io.h
+++ b/src/io.h
@@ -22,7 +22,7 @@ enum {
IO_DONE = 0, /* operation completed successfully */
IO_TIMEOUT = -1, /* operation timed out */
IO_CLOSED = -2, /* the connection has been closed */
- IO_UNKNOWN = -3
+ IO_UNKNOWN = -3
};
/* interface to error message function */
diff --git a/src/makefile b/src/makefile
index fbb26a0..94a2f9f 100644
--- a/src/makefile
+++ b/src/makefile
@@ -63,12 +63,13 @@ LDIR_mingw?=lua/$(LUAV)/lua
# LUAINC_win32:
# LUALIB_win32:
# where lua headers and libraries are found for win32 builds
-LUAINC_win32?="../../lua-5.1.3/src"
-LUALIB_win32?=/LIBPATH:"../../lua-5.1.3" lua$(LUAV).lib
-
+LUAINC_win32_base?=
+LUAINC_win32?=$(LUAINC_win32_base)/lua/$(LUAV)
+PLATFORM_win32?=Release
LUAPREFIX_win32?=
-CDIR_win32?=lua/$(LUAV)
-LDIR_win32?=lua/$(LUAV)/lua
+CDIR_win32?=lua/$(LUAV)/$(PLATFORM_win32)
+LDIR_win32?=lua/$(LUAV)/$(PLATFORM_win32)/lua
+LUALIB_win32?=$(LUAPREFIX_win32)/lua/$(LUAV)/$(PLATFORM_win32)
# prefix: /usr/local /usr /opt/local /sw
# the top of the default install tree
@@ -154,12 +155,12 @@ SOCKET_linux=usocket.o
SO_mingw=dll
O_mingw=o
CC_mingw=gcc
-DEF_mingw= -DLUASOCKET_$(DEBUG) -DLUA_COMPAT_MODULE -DWINVER=0x0501 \
- -DLUASOCKET_API='__declspec(dllexport)' \
+DEF_mingw= -DLUASOCKET_INET_PTON -DLUASOCKET_$(DEBUG) -DLUA_COMPAT_MODULE \
+ -DWINVER=0x0501 -DLUASOCKET_API='__declspec(dllexport)' \
-DMIME_API='__declspec(dllexport)'
CFLAGS_mingw= -I$(LUAINC) $(DEF) -pedantic -Wall -O2 -fno-common \
-fvisibility=hidden
-LDFLAGS_mingw= $(LUALIB) -shared -Wl,-s -lwsock32 -lws2_32 -o
+LDFLAGS_mingw= $(LUALIB) -shared -Wl,-s -lws2_32 -o
LD_mingw=gcc
SOCKET_mingw=wsocket.o
@@ -170,23 +171,25 @@ SOCKET_mingw=wsocket.o
SO_win32=dll
O_win32=obj
CC_win32=cl
-DEF_win32= /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_USRDLL" \
- /D "LUASOCKET_API=__declspec(dllexport)" /D "_CRT_SECURE_NO_WARNINGS" \
- /D "_WINDLL" /D "LUA_COMPAT_MODULE" /D "MIME_API=__declspec(dllexport)" \
- /D "LUASOCKET_$(DEBUG)"
-CFLAGS_win32=/I "$(LUAINC)" $(DEF) /O2 /Ot /MD /W3 /nologo
-LDFLAGS_win32= /nologo /link /NOLOGO /DLL /INCREMENTAL:NO \
- /MANIFEST /MANIFESTFILE:"intermediate.manifest" \
- /MANIFESTUAC:"level='asInvoker' uiAccess='false'" \
- /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /DYNAMICBASE:NO \
- /MACHINE:X86 $(LUALIB) ws2_32.lib /OUT:
+DEF_win32= //D "WIN32" //D "NDEBUG" //D "_WINDOWS" //D "_USRDLL" \
+ //D "LUASOCKET_API=__declspec(dllexport)" //D "_CRT_SECURE_NO_WARNINGS" \
+ //D "_WINDLL" //D "LUA_COMPAT_MODULE" \
+ //D "MIME_API=__declspec(dllexport)" \
+ //D "LUASOCKET_$(DEBUG)"
+CFLAGS_win32=//I "$(LUAINC)" $(DEF) //O2 //Ot //MD //W3 //nologo
+LDFLAGS_win32= //nologo //link //NOLOGO //DLL //INCREMENTAL:NO \
+ //MANIFEST //MANIFESTFILE:"intermediate.manifest" \
+ //MANIFESTUAC:"level='asInvoker' uiAccess='false'" \
+ //SUBSYSTEM:WINDOWS //OPT:REF //OPT:ICF //DYNAMICBASE:NO \
+ //MACHINE:X86 /LIBPATH:"$(shell cmd //c echo $(LUALIB))" \
+ lua$(subst .,,$(LUAV)).lib ws2_32.lib //OUT:
LD_win32=cl
SOCKET_win32=wsocket.obj
.SUFFIXES: .obj
.c.obj:
- $(CC) $(CFLAGS) /Fo"$@" /c $<
+ $(CC) $(CFLAGS) //Fo"$@" //c $<
#------
# Output file names
diff --git a/src/udp.c b/src/udp.c
index 2a51d1c..d48f6fe 100644
--- a/src/udp.c
+++ b/src/udp.c
@@ -155,31 +155,31 @@ static int meth_sendto(lua_State *L) {
p_timeout tm = &udp->tm;
int err;
switch (udp->family) {
- case PF_INET: {
- struct sockaddr_in addr;
- memset(&addr, 0, sizeof(addr));
- if (!inet_pton(AF_INET, ip, &addr.sin_addr))
+ case PF_INET: {
+ struct sockaddr_in addr;
+ memset(&addr, 0, sizeof(addr));
+ if (inet_pton(AF_INET, ip, &addr.sin_addr) != 1)
luaL_argerror(L, 3, "invalid ip address");
- addr.sin_family = AF_INET;
- addr.sin_port = htons(port);
- timeout_markstart(tm);
- err = socket_sendto(&udp->sock, data, count, &sent,
- (SA *) &addr, sizeof(addr), tm);
- break;
- }
- case PF_INET6: {
- struct sockaddr_in6 addr;
- memset(&addr, 0, sizeof(addr));
- if (!inet_pton(AF_INET6, ip, &addr.sin6_addr))
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(port);
+ timeout_markstart(tm);
+ err = socket_sendto(&udp->sock, data, count, &sent,
+ (SA *) &addr, sizeof(addr), tm);
+ break;
+ }
+ case PF_INET6: {
+ struct sockaddr_in6 addr;
+ memset(&addr, 0, sizeof(addr));
+ if (inet_pton(AF_INET6, ip, &addr.sin6_addr) != 1)
luaL_argerror(L, 3, "invalid ip address");
- addr.sin6_family = AF_INET6;
- addr.sin6_port = htons(port);
- timeout_markstart(tm);
- err = socket_sendto(&udp->sock, data, count, &sent,
- (SA *) &addr, sizeof(addr), tm);
- break;
- }
- default:
+ addr.sin6_family = AF_INET6;
+ addr.sin6_port = htons(port);
+ timeout_markstart(tm);
+ err = socket_sendto(&udp->sock, data, count, &sent,
+ (SA *) &addr, sizeof(addr), tm);
+ break;
+ }
+ default:
lua_pushnil(L);
lua_pushfstring(L, "unknown family %d", udp->family);
return 2;
@@ -229,38 +229,40 @@ static int meth_receivefrom(lua_State *L) {
timeout_markstart(tm);
count = MIN(count, sizeof(buffer));
switch (udp->family) {
- case PF_INET: {
- struct sockaddr_in addr;
- socklen_t addr_len = sizeof(addr);
- err = socket_recvfrom(&udp->sock, buffer, count, &got,
- (SA *) &addr, &addr_len, tm);
- /* Unlike TCP, recv() of zero is not closed, but a zero-length packet. */
- if (err == IO_CLOSED)
- err = IO_DONE;
- if (err == IO_DONE) {
- char addrstr[INET_ADDRSTRLEN];
- lua_pushlstring(L, buffer, got);
- if (!inet_ntop(AF_INET, &addr.sin_addr,
- addrstr, sizeof(addrstr))) {
- lua_pushnil(L);
- lua_pushstring(L, "invalid source address");
- return 2;
- }
- lua_pushstring(L, addrstr);
- lua_pushnumber(L, ntohs(addr.sin_port));
- return 3;
- }
- break;
- }
- case PF_INET6: {
- struct sockaddr_in6 addr;
- socklen_t addr_len = sizeof(addr);
- err = socket_recvfrom(&udp->sock, buffer, count, &got,
- (SA *) &addr, &addr_len, tm);
- /* Unlike TCP, recv() of zero is not closed, but a zero-length packet. */
- if (err == IO_CLOSED)
+ case PF_INET: {
+ struct sockaddr_in addr;
+ socklen_t addr_len = sizeof(addr);
+ err = socket_recvfrom(&udp->sock, buffer, count, &got,
+ (SA *) &addr, &addr_len, tm);
+ /* Unlike TCP, recv() of zero is not closed,
+ * but a zero-length packet. */
+ if (err == IO_CLOSED)
err = IO_DONE;
- if (err == IO_DONE) {
+ if (err == IO_DONE) {
+ char addrstr[INET_ADDRSTRLEN];
+ lua_pushlstring(L, buffer, got);
+ if (!inet_ntop(AF_INET, &addr.sin_addr,
+ addrstr, sizeof(addrstr))) {
+ lua_pushnil(L);
+ lua_pushstring(L, "invalid source address");
+ return 2;
+ }
+ lua_pushstring(L, addrstr);
+ lua_pushnumber(L, ntohs(addr.sin_port));
+ return 3;
+ }
+ break;
+ }
+ case PF_INET6: {
+ struct sockaddr_in6 addr;
+ socklen_t addr_len = sizeof(addr);
+ err = socket_recvfrom(&udp->sock, buffer, count, &got,
+ (SA *) &addr, &addr_len, tm);
+ /* Unlike TCP, recv() of zero is not closed,
+ * but a zero-length packet. */
+ if (err == IO_CLOSED)
+ err = IO_DONE;
+ if (err == IO_DONE) {
char addrstr[INET6_ADDRSTRLEN];
lua_pushlstring(L, buffer, got);
if (!inet_ntop(AF_INET6, &addr.sin6_addr,
@@ -272,9 +274,9 @@ static int meth_receivefrom(lua_State *L) {
lua_pushstring(L, addrstr);
lua_pushnumber(L, ntohs(addr.sin6_port));
return 3;
- }
- break;
- }
+ }
+ break;
+ }
default:
lua_pushnil(L);
lua_pushfstring(L, "unknown family %d", udp->family);
@@ -413,7 +415,7 @@ static int meth_setsockname(lua_State *L) {
const char *address = luaL_checkstring(L, 2);
const char *port = luaL_checkstring(L, 3);
const char *err;
- struct addrinfo bindhints;
+ struct addrinfo bindhints;
memset(&bindhints, 0, sizeof(bindhints));
bindhints.ai_socktype = SOCK_DGRAM;
bindhints.ai_family = udp->family;
@@ -461,9 +463,9 @@ static int udp_create(lua_State *L, int family) {
}
static int global_create(lua_State *L) {
- return udp_create(L, AF_INET);
+ return udp_create(L, AF_INET);
}
static int global_create6(lua_State *L) {
- return udp_create(L, AF_INET6);
+ return udp_create(L, AF_INET6);
}
diff --git a/src/wsocket.c b/src/wsocket.c
index 65f76bc..b4a4384 100644
--- a/src/wsocket.c
+++ b/src/wsocket.c
@@ -238,8 +238,10 @@ int socket_sendto(p_socket ps, const char *data, size_t count, size_t *sent,
/*-------------------------------------------------------------------------*\
* Receive with timeout
\*-------------------------------------------------------------------------*/
-int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm) {
- int err;
+int socket_recv(p_socket ps, char *data, size_t count, size_t *got,
+ p_timeout tm)
+{
+ int err, prev = IO_DONE;
*got = 0;
if (*ps == SOCKET_INVALID) return IO_CLOSED;
for ( ;; ) {
@@ -250,7 +252,14 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm
}
if (taken == 0) return IO_CLOSED;
err = WSAGetLastError();
- if (err != WSAEWOULDBLOCK) return err;
+ /* On UDP, a connreset simply means the previous send failed.
+ * So we try again.
+ * On TCP, it means our socket is now useless, so the error passes.
+ * (We will loop again, exiting because the same error will happen) */
+ if (err != WSAEWOULDBLOCK) {
+ if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
+ prev = err;
+ }
if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
}
}
@@ -259,8 +268,9 @@ int socket_recv(p_socket ps, char *data, size_t count, size_t *got, p_timeout tm
* Recvfrom with timeout
\*-------------------------------------------------------------------------*/
int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,
- SA *addr, socklen_t *len, p_timeout tm) {
- int err;
+ SA *addr, socklen_t *len, p_timeout tm)
+{
+ int err, prev = IO_DONE;
*got = 0;
if (*ps == SOCKET_INVALID) return IO_CLOSED;
for ( ;; ) {
@@ -271,7 +281,14 @@ int socket_recvfrom(p_socket ps, char *data, size_t count, size_t *got,
}
if (taken == 0) return IO_CLOSED;
err = WSAGetLastError();
- if (err != WSAEWOULDBLOCK) return err;
+ /* On UDP, a connreset simply means the previous send failed.
+ * So we try again.
+ * On TCP, it means our socket is now useless, so the error passes.
+ * (We will loop again, exiting because the same error will happen) */
+ if (err != WSAEWOULDBLOCK) {
+ if (err != WSAECONNRESET || prev == WSAECONNRESET) return err;
+ prev = err;
+ }
if ((err = socket_waitfd(ps, WAITFD_R, tm)) != IO_DONE) return err;
}
}