New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
socket() call uses non-IFS providers causing subsequent print/read to hang or misbehave #6860
Comments
From apm@atwss.comCreated by apm@prog8This is a bug report for perl from apm@prog8, ----------------------------------------------------------------- Desired result: Problem description: Fix: Patch: Inline Patchdiff -ruN perl-5.8.1/win32/Makefile perl-5.8.1-new/win32/Makefile
--- perl-5.8.1/win32/Makefile Thu Sep 25 14:14:19 2003
+++ perl-5.8.1-new/win32/Makefile Thu Oct 23 10:19:49 2003
@@ -326,7 +326,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD = -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD = -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
!ENDIF
ARCHDIR = ..\lib\$(ARCHNAME)
@@ -408,7 +408,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -ruN perl-5.8.1/win32/win32sck.c perl-5.8.1-new/win32/win32sck.c
--- perl-5.8.1/win32/win32sck.c Tue Sep 2 16:42:10 2003
+++ perl-5.8.1-new/win32/win32sck.c Wed Oct 22 16:03:40 2003
@@ -16,6 +16,11 @@
#define Win32_Winsock
#endif
#include <windows.h>
+#include <ws2spi.h>
+/* winsock2.h overrides winsock.h but does not include the following*/
+#define SO_SYNCHRONOUS_NONALERT 0x20
+#define SO_OPENTYPE 0x7008
+
#include "EXTERN.h"
#include "perl.h"
@@ -399,6 +404,63 @@
return r;
}
+#ifdef USE_SOCKETS_AS_HANDLES
+#define WIN32_OPEN_SOCKET(af, type, protocol) open_ifs_socket(af, type,
Perl Info
|
From artiom@phreaker.netAttached is the patch redone based on Steve Hay's |
From artiom@phreaker.netperl-5.8.1.patchdiff -rdu perl-5.8.1-old/win32/Makefile perl-5.8.1/win32/Makefile
--- perl-5.8.1-old/win32/Makefile 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/Makefile 2003-10-22 16:11:16.000000000 +0300
@@ -326,7 +326,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD = -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD = -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
!ENDIF
ARCHDIR = ..\lib\$(ARCHNAME)
@@ -408,7 +408,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -rdu perl-5.8.1-old/win32/win32.c perl-5.8.1/win32/win32.c
--- perl-5.8.1-old/win32/win32.c 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32.c 2004-07-28 20:37:50.000000000 +0300
@@ -5033,7 +5033,6 @@
New(1313, w32_pseudo_children, 1, child_tab);
w32_num_pseudo_children = 0;
# endif
- w32_init_socktype = 0;
w32_timerid = 0;
w32_poll_count = 0;
for (i=0; i < SIG_SIZE; i++) {
@@ -5087,7 +5086,6 @@
Newz(1313, dst->children, 1, child_tab);
dst->pseudo_id = 0;
Newz(1313, dst->pseudo_children, 1, child_tab);
- dst->thr_intern.Winit_socktype = 0;
dst->timerid = 0;
dst->poll_count = 0;
Copy(src->sigtable,dst->sigtable,SIG_SIZE,Sighandler_t);
diff -rdu perl-5.8.1-old/win32/win32.h perl-5.8.1/win32/win32.h
--- perl-5.8.1-old/win32/win32.h 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32.h 2004-07-28 20:37:42.000000000 +0300
@@ -358,9 +358,6 @@
char Wstrerror_buffer[512];
struct servent Wservent;
char Wgetlogin_buffer[128];
-# ifdef USE_SOCKETS_AS_HANDLES
- int Winit_socktype;
-# endif
# ifdef HAVE_DES_FCRYPT
char Wcrypt_buffer[30];
# endif
@@ -436,7 +433,6 @@
# define w32_getlogin_buffer (thr->i.Wgetlogin_buffer)
# define w32_crypt_buffer (thr->i.Wcrypt_buffer)
# define w32_servent (thr->i.Wservent)
-# define w32_init_socktype (thr->i.Winit_socktype)
# define w32_use_showwindow (thr->i.Wuse_showwindow)
# define w32_showwindow (thr->i.Wshowwindow)
#else
@@ -444,7 +440,6 @@
# define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer)
# define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer)
# define w32_servent (PL_sys_intern.thr_intern.Wservent)
-# define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype)
# define w32_use_showwindow (PL_sys_intern.thr_intern.Wuse_showwindow)
# define w32_showwindow (PL_sys_intern.thr_intern.Wshowwindow)
#endif /* USE_5005THREADS */
Only in perl-5.8.1/win32: win32.obj
Only in perl-5.8.1/win32: win32io.obj
diff -rdu perl-5.8.1-old/win32/win32sck.c perl-5.8.1/win32/win32sck.c
--- perl-5.8.1-old/win32/win32sck.c 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32sck.c 2004-07-28 20:39:34.000000000 +0300
@@ -16,6 +16,8 @@
#define Win32_Winsock
#endif
#include <windows.h>
+#include <ws2spi.h>
+
#include "EXTERN.h"
#include "perl.h"
@@ -99,22 +101,6 @@
void
set_socktype(void)
{
-#ifdef USE_SOCKETS_AS_HANDLES
-#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
- dTHX;
- if (!w32_init_socktype) {
-#endif
- int iSockOpt = SO_SYNCHRONOUS_NONALERT;
- /*
- * Enable the use of sockets as filehandles
- */
- setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
- (char *)&iSockOpt, sizeof(iSockOpt));
-#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
- w32_init_socktype = 1;
- }
-#endif
-#endif /* USE_SOCKETS_AS_HANDLES */
}
@@ -399,6 +385,63 @@
return r;
}
+#ifdef USE_SOCKETS_AS_HANDLES
+#define WIN32_OPEN_SOCKET(af, type, protocol) open_ifs_socket(af, type, protocol)
+
+void
+convert_proto_info_w2a(WSAPROTOCOL_INFOW *in, WSAPROTOCOL_INFOA *out)
+{
+ memcpy(out, in, sizeof(WSAPROTOCOL_INFOA));
+ wcstombs(out->szProtocol, in->szProtocol, sizeof(out->szProtocol));
+}
+
+SOCKET
+open_ifs_socket(int af, int type, int protocol)
+{
+ unsigned long proto_buffers_len = 0;
+ int error_code;
+ SOCKET out = INVALID_SOCKET;
+
+ if (WSCEnumProtocols(NULL, NULL, &proto_buffers_len, &error_code) == SOCKET_ERROR
+ && error_code == WSAENOBUFS)
+ {
+ WSAPROTOCOL_INFOW *proto_buffers = (WSAPROTOCOL_INFOW *) malloc(proto_buffers_len);
+ int protocols_available = 0;
+
+ if ((protocols_available = WSCEnumProtocols(NULL, proto_buffers,
+ &proto_buffers_len, &error_code)) != SOCKET_ERROR)
+ {
+ int i;
+ for (i = 0; i < protocols_available; i++)
+ {
+ WSAPROTOCOL_INFOA proto_info;
+
+ if ((af != AF_UNSPEC && af != proto_buffers[i].iAddressFamily)
+ || (type != proto_buffers[i].iSocketType)
+ || (protocol != 0 && protocol != proto_buffers[i].iProtocol))
+ continue;
+
+ if ((proto_buffers[i].dwServiceFlags1 & XP1_IFS_HANDLES) == 0)
+ continue;
+
+ convert_proto_info_w2a(&(proto_buffers[i]), &proto_info);
+
+ out = WSASocket(af, type, protocol, &proto_info, 0, 0);
+ break;
+ }
+ }
+
+ if (proto_buffers)
+ free(proto_buffers);
+ }
+
+ return out;
+}
+
+#else
+#define WIN32_OPEN_SOCKET(af, type, protocol) socket(af, type, protocol)
+#endif
+
SOCKET
win32_socket(int af, int type, int protocol)
{
@@ -408,7 +451,8 @@
SOCKET_TEST(s = socket(af, type, protocol), INVALID_SOCKET);
#else
StartSockets();
- if((s = socket(af, type, protocol)) == INVALID_SOCKET)
+
+ if((s = WIN32_OPEN_SOCKET(af, type, protocol)) == INVALID_SOCKET)
errno = WSAGetLastError();
else
s = OPEN_SOCKET(s); |
From artiom@phreaker.netSome more fixes to the patch, suggested by Steve Hay Also slightly updated README.win32 (included Winsock2 requirement) and |
From artiom@phreaker.netperl-5.8.1.patchdiff -rdu perl-5.8.1-old/README.win32 perl-5.8.1/README.win32
--- perl-5.8.1-old/README.win32 2004-07-28 20:34:42.000000000 +0300
+++ perl-5.8.1/README.win32 2004-07-31 15:27:40.000000000 +0300
@@ -745,6 +745,12 @@
Most C<socket()> related calls are supported, but they may not
behave as on Unix platforms. See L<perlport> for the full list.
+Perl requires Winsock2 to be installed on the system. If you're
+running Win95, you can download Winsock upgrade from here:
+
+http://www.microsoft.com/windows95/downloads/contents/WUAdminTools/S_WUNetworkingTools/W95Sockets2/Default.asp
+
+Later OS versions already include Winsock2 support.
Signal handling may not behave as on Unix platforms (where it
doesn't exactly "behave", either :). For instance, calling C<die()>
diff -rdu perl-5.8.1-old/win32/Makefile perl-5.8.1/win32/Makefile
--- perl-5.8.1-old/win32/Makefile 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/Makefile 2004-07-31 13:36:04.000000000 +0300
@@ -326,7 +326,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD = -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD = -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
!ENDIF
ARCHDIR = ..\lib\$(ARCHNAME)
@@ -408,7 +408,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -rdu perl-5.8.1-old/win32/include/sys/socket.h perl-5.8.1/win32/include/sys/socket.h
--- perl-5.8.1-old/win32/include/sys/socket.h 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/include/sys/socket.h 2004-07-31 14:27:02.000000000 +0300
@@ -15,7 +15,7 @@
# define Win32_Winsock
#endif
#include <windows.h>
-#include <winsock.h>
+#include <ws2spi.h>
#include "win32.h"
diff -rdu perl-5.8.1-old/win32/makefile.mk perl-5.8.1/win32/makefile.mk
--- perl-5.8.1-old/win32/makefile.mk 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/makefile.mk 2004-07-31 13:42:26.000000000 +0300
@@ -312,7 +312,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD *= -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD *= -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
.IF "$(CFG)" == "Debug"
.ELSE
@@ -425,7 +425,7 @@
LIBFILES = $(CRYPT_LIB) $(LIBC) \
-lmoldname -lkernel32 -luser32 -lgdi32 \
-lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 \
- -loleaut32 -lnetapi32 -luuid -lwsock32 -lmpr \
+ -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr \
-lwinmm -lversion -lodbc32
.IF "$(CFG)" == "Debug"
@@ -505,7 +505,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -rdu perl-5.8.1-old/win32/win32.c perl-5.8.1/win32/win32.c
--- perl-5.8.1-old/win32/win32.c 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32.c 2004-07-31 13:36:04.000000000 +0300
@@ -5033,7 +5033,6 @@
New(1313, w32_pseudo_children, 1, child_tab);
w32_num_pseudo_children = 0;
# endif
- w32_init_socktype = 0;
w32_timerid = 0;
w32_poll_count = 0;
for (i=0; i < SIG_SIZE; i++) {
@@ -5087,7 +5086,6 @@
Newz(1313, dst->children, 1, child_tab);
dst->pseudo_id = 0;
Newz(1313, dst->pseudo_children, 1, child_tab);
- dst->thr_intern.Winit_socktype = 0;
dst->timerid = 0;
dst->poll_count = 0;
Copy(src->sigtable,dst->sigtable,SIG_SIZE,Sighandler_t);
diff -rdu perl-5.8.1-old/win32/win32.h perl-5.8.1/win32/win32.h
--- perl-5.8.1-old/win32/win32.h 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32.h 2004-07-31 13:36:04.000000000 +0300
@@ -358,9 +358,6 @@
char Wstrerror_buffer[512];
struct servent Wservent;
char Wgetlogin_buffer[128];
-# ifdef USE_SOCKETS_AS_HANDLES
- int Winit_socktype;
-# endif
# ifdef HAVE_DES_FCRYPT
char Wcrypt_buffer[30];
# endif
@@ -436,7 +433,6 @@
# define w32_getlogin_buffer (thr->i.Wgetlogin_buffer)
# define w32_crypt_buffer (thr->i.Wcrypt_buffer)
# define w32_servent (thr->i.Wservent)
-# define w32_init_socktype (thr->i.Winit_socktype)
# define w32_use_showwindow (thr->i.Wuse_showwindow)
# define w32_showwindow (thr->i.Wshowwindow)
#else
@@ -444,7 +440,6 @@
# define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer)
# define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer)
# define w32_servent (PL_sys_intern.thr_intern.Wservent)
-# define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype)
# define w32_use_showwindow (PL_sys_intern.thr_intern.Wuse_showwindow)
# define w32_showwindow (PL_sys_intern.thr_intern.Wshowwindow)
#endif /* USE_5005THREADS */
diff -rdu perl-5.8.1-old/win32/win32sck.c perl-5.8.1/win32/win32sck.c
--- perl-5.8.1-old/win32/win32sck.c 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32sck.c 2004-07-31 14:21:44.000000000 +0300
@@ -16,6 +16,7 @@
#define Win32_Winsock
#endif
#include <windows.h>
+
#include "EXTERN.h"
#include "perl.h"
@@ -86,11 +87,11 @@
* initalize the winsock interface and insure that it is
* cleaned up at exit.
*/
- version = 0x101;
+ version = 0x2;
if(ret = WSAStartup(version, &retdata))
Perl_croak_nocontext("Unable to locate winsock library!\n");
if(retdata.wVersion != version)
- Perl_croak_nocontext("Could not find version 1.1 of winsock dll\n");
+ Perl_croak_nocontext("Could not find version 2.0 of winsock dll\n");
/* atexit((void (*)(void)) EndSockets); */
wsock_started = 1;
@@ -99,22 +100,6 @@
void
set_socktype(void)
{
-#ifdef USE_SOCKETS_AS_HANDLES
-#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
- dTHX;
- if (!w32_init_socktype) {
-#endif
- int iSockOpt = SO_SYNCHRONOUS_NONALERT;
- /*
- * Enable the use of sockets as filehandles
- */
- setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
- (char *)&iSockOpt, sizeof(iSockOpt));
-#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
- w32_init_socktype = 1;
- }
-#endif
-#endif /* USE_SOCKETS_AS_HANDLES */
}
@@ -399,6 +384,65 @@
return r;
}
+#ifdef USE_SOCKETS_AS_HANDLES
+#define WIN32_OPEN_SOCKET(af, type, protocol) open_ifs_socket(af, type, protocol)
+
+void
+convert_proto_info_w2a(WSAPROTOCOL_INFOW *in, WSAPROTOCOL_INFOA *out)
+{
+ Copy(in, out, 1, WSAPROTOCOL_INFOA);
+ wcstombs(out->szProtocol, in->szProtocol, sizeof(out->szProtocol));
+}
+
+SOCKET
+open_ifs_socket(int af, int type, int protocol)
+{
+ unsigned long proto_buffers_len = 0;
+ int error_code;
+ SOCKET out = INVALID_SOCKET;
+
+ if (WSCEnumProtocols(NULL, NULL, &proto_buffers_len, &error_code) == SOCKET_ERROR
+ && error_code == WSAENOBUFS)
+ {
+ WSAPROTOCOL_INFOW *proto_buffers;
+ int protocols_available = 0;
+
+ New(1, proto_buffers, proto_buffers_len / sizeof(WSAPROTOCOL_INFOW),
+ WSAPROTOCOL_INFOW);
+
+ if ((protocols_available = WSCEnumProtocols(NULL, proto_buffers,
+ &proto_buffers_len, &error_code)) != SOCKET_ERROR)
+ {
+ int i;
+ for (i = 0; i < protocols_available; i++)
+ {
+ WSAPROTOCOL_INFOA proto_info;
+
+ if ((af != AF_UNSPEC && af != proto_buffers[i].iAddressFamily)
+ || (type != proto_buffers[i].iSocketType)
+ || (protocol != 0 && protocol != proto_buffers[i].iProtocol))
+ continue;
+
+ if ((proto_buffers[i].dwServiceFlags1 & XP1_IFS_HANDLES) == 0)
+ continue;
+
+ convert_proto_info_w2a(&(proto_buffers[i]), &proto_info);
+
+ out = WSASocket(af, type, protocol, &proto_info, 0, 0);
+ break;
+ }
+ }
+
+ Safefree(proto_buffers);
+ }
+
+ return out;
+}
+
+#else
+#define WIN32_OPEN_SOCKET(af, type, protocol) socket(af, type, protocol)
+#endif
+
SOCKET
win32_socket(int af, int type, int protocol)
{
@@ -408,7 +452,8 @@
SOCKET_TEST(s = socket(af, type, protocol), INVALID_SOCKET);
#else
StartSockets();
- if((s = socket(af, type, protocol)) == INVALID_SOCKET)
+
+ if((s = WIN32_OPEN_SOCKET(af, type, protocol)) == INVALID_SOCKET)
errno = WSAGetLastError();
else
s = OPEN_SOCKET(s);
|
The RT System itself - Status changed from 'new' to 'open' |
From artiom@phreaker.netOne more revision for patch. Moved ws2spi.h header back to win32sck.c. Per Steve Hay's suggestion, two patches are available now: |
From artiom@phreaker.netperl-5.8.1-blead.patchdiff -rdu perl-5.8.1-old/README.win32 perl-5.8.1/README.win32
--- perl-5.8.1-old/README.win32 2004-07-28 20:34:42.000000000 +0300
+++ perl-5.8.1/README.win32 2004-07-31 15:27:40.000000000 +0300
@@ -745,6 +745,12 @@
Most C<socket()> related calls are supported, but they may not
behave as on Unix platforms. See L<perlport> for the full list.
+Perl requires Winsock2 to be installed on the system. If you're
+running Win95, you can download Winsock upgrade from here:
+
+http://www.microsoft.com/windows95/downloads/contents/WUAdminTools/S_WUNetworkingTools/W95Sockets2/Default.asp
+
+Later OS versions already include Winsock2 support.
Signal handling may not behave as on Unix platforms (where it
doesn't exactly "behave", either :). For instance, calling C<die()>
diff -rdu perl-5.8.1-old/win32/Makefile perl-5.8.1/win32/Makefile
--- perl-5.8.1-old/win32/Makefile 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/Makefile 2004-07-31 13:36:04.000000000 +0300
@@ -326,7 +326,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD = -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD = -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
!ENDIF
ARCHDIR = ..\lib\$(ARCHNAME)
@@ -408,7 +408,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -rdu perl-5.8.1-old/win32/makefile.mk perl-5.8.1/win32/makefile.mk
--- perl-5.8.1-old/win32/makefile.mk 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/makefile.mk 2004-07-31 13:42:26.000000000 +0300
@@ -312,7 +312,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD *= -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD *= -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
.IF "$(CFG)" == "Debug"
.ELSE
@@ -425,7 +425,7 @@
LIBFILES = $(CRYPT_LIB) $(LIBC) \
-lmoldname -lkernel32 -luser32 -lgdi32 \
-lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 \
- -loleaut32 -lnetapi32 -luuid -lwsock32 -lmpr \
+ -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr \
-lwinmm -lversion -lodbc32
.IF "$(CFG)" == "Debug"
@@ -505,7 +505,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -rdu perl-5.8.1-old/win32/win32.c perl-5.8.1/win32/win32.c
--- perl-5.8.1-old/win32/win32.c 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32.c 2004-07-31 13:36:04.000000000 +0300
@@ -5033,7 +5033,6 @@
New(1313, w32_pseudo_children, 1, child_tab);
w32_num_pseudo_children = 0;
# endif
- w32_init_socktype = 0;
w32_timerid = 0;
w32_poll_count = 0;
for (i=0; i < SIG_SIZE; i++) {
@@ -5087,7 +5086,6 @@
Newz(1313, dst->children, 1, child_tab);
dst->pseudo_id = 0;
Newz(1313, dst->pseudo_children, 1, child_tab);
- dst->thr_intern.Winit_socktype = 0;
dst->timerid = 0;
dst->poll_count = 0;
Copy(src->sigtable,dst->sigtable,SIG_SIZE,Sighandler_t);
diff -rdu perl-5.8.1-old/win32/win32.h perl-5.8.1/win32/win32.h
--- perl-5.8.1-old/win32/win32.h 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32.h 2004-07-31 13:36:04.000000000 +0300
@@ -358,9 +358,6 @@
char Wstrerror_buffer[512];
struct servent Wservent;
char Wgetlogin_buffer[128];
-# ifdef USE_SOCKETS_AS_HANDLES
- int Winit_socktype;
-# endif
# ifdef HAVE_DES_FCRYPT
char Wcrypt_buffer[30];
# endif
@@ -436,7 +433,6 @@
# define w32_getlogin_buffer (thr->i.Wgetlogin_buffer)
# define w32_crypt_buffer (thr->i.Wcrypt_buffer)
# define w32_servent (thr->i.Wservent)
-# define w32_init_socktype (thr->i.Winit_socktype)
# define w32_use_showwindow (thr->i.Wuse_showwindow)
# define w32_showwindow (thr->i.Wshowwindow)
#else
@@ -444,7 +440,6 @@
# define w32_getlogin_buffer (PL_sys_intern.thr_intern.Wgetlogin_buffer)
# define w32_crypt_buffer (PL_sys_intern.thr_intern.Wcrypt_buffer)
# define w32_servent (PL_sys_intern.thr_intern.Wservent)
-# define w32_init_socktype (PL_sys_intern.thr_intern.Winit_socktype)
# define w32_use_showwindow (PL_sys_intern.thr_intern.Wuse_showwindow)
# define w32_showwindow (PL_sys_intern.thr_intern.Wshowwindow)
#endif /* USE_5005THREADS */
diff -rdu perl-5.8.1-old/win32/win32sck.c perl-5.8.1/win32/win32sck.c
--- perl-5.8.1-old/win32/win32sck.c 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32sck.c 2004-08-03 19:13:56.000000000 +0300
@@ -16,6 +16,8 @@
#define Win32_Winsock
#endif
#include <windows.h>
+#include <ws2spi.h>
+
#include "EXTERN.h"
#include "perl.h"
@@ -86,11 +88,11 @@
* initalize the winsock interface and insure that it is
* cleaned up at exit.
*/
- version = 0x101;
+ version = 0x2;
if(ret = WSAStartup(version, &retdata))
Perl_croak_nocontext("Unable to locate winsock library!\n");
if(retdata.wVersion != version)
- Perl_croak_nocontext("Could not find version 1.1 of winsock dll\n");
+ Perl_croak_nocontext("Could not find version 2.0 of winsock dll\n");
/* atexit((void (*)(void)) EndSockets); */
wsock_started = 1;
@@ -99,22 +101,6 @@
void
set_socktype(void)
{
-#ifdef USE_SOCKETS_AS_HANDLES
-#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
- dTHX;
- if (!w32_init_socktype) {
-#endif
- int iSockOpt = SO_SYNCHRONOUS_NONALERT;
- /*
- * Enable the use of sockets as filehandles
- */
- setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
- (char *)&iSockOpt, sizeof(iSockOpt));
-#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
- w32_init_socktype = 1;
- }
-#endif
-#endif /* USE_SOCKETS_AS_HANDLES */
}
@@ -399,6 +385,65 @@
return r;
}
+#ifdef USE_SOCKETS_AS_HANDLES
+#define WIN32_OPEN_SOCKET(af, type, protocol) open_ifs_socket(af, type, protocol)
+
+void
+convert_proto_info_w2a(WSAPROTOCOL_INFOW *in, WSAPROTOCOL_INFOA *out)
+{
+ Copy(in, out, 1, WSAPROTOCOL_INFOA);
+ wcstombs(out->szProtocol, in->szProtocol, sizeof(out->szProtocol));
+}
+
+SOCKET
+open_ifs_socket(int af, int type, int protocol)
+{
+ unsigned long proto_buffers_len = 0;
+ int error_code;
+ SOCKET out = INVALID_SOCKET;
+
+ if (WSCEnumProtocols(NULL, NULL, &proto_buffers_len, &error_code) == SOCKET_ERROR
+ && error_code == WSAENOBUFS)
+ {
+ WSAPROTOCOL_INFOW *proto_buffers;
+ int protocols_available = 0;
+
+ New(1, proto_buffers, proto_buffers_len / sizeof(WSAPROTOCOL_INFOW),
+ WSAPROTOCOL_INFOW);
+
+ if ((protocols_available = WSCEnumProtocols(NULL, proto_buffers,
+ &proto_buffers_len, &error_code)) != SOCKET_ERROR)
+ {
+ int i;
+ for (i = 0; i < protocols_available; i++)
+ {
+ WSAPROTOCOL_INFOA proto_info;
+
+ if ((af != AF_UNSPEC && af != proto_buffers[i].iAddressFamily)
+ || (type != proto_buffers[i].iSocketType)
+ || (protocol != 0 && protocol != proto_buffers[i].iProtocol))
+ continue;
+
+ if ((proto_buffers[i].dwServiceFlags1 & XP1_IFS_HANDLES) == 0)
+ continue;
+
+ convert_proto_info_w2a(&(proto_buffers[i]), &proto_info);
+
+ out = WSASocket(af, type, protocol, &proto_info, 0, 0);
+ break;
+ }
+ }
+
+ Safefree(proto_buffers);
+ }
+
+ return out;
+}
+
+#else
+#define WIN32_OPEN_SOCKET(af, type, protocol) socket(af, type, protocol)
+#endif
+
SOCKET
win32_socket(int af, int type, int protocol)
{
@@ -408,7 +453,8 @@
SOCKET_TEST(s = socket(af, type, protocol), INVALID_SOCKET);
#else
StartSockets();
- if((s = socket(af, type, protocol)) == INVALID_SOCKET)
+
+ if((s = WIN32_OPEN_SOCKET(af, type, protocol)) == INVALID_SOCKET)
errno = WSAGetLastError();
else
s = OPEN_SOCKET(s);
|
From artiom@phreaker.netperl-5.8.1-stable.patchdiff -rdu perl-5.8.1-old/README.win32 perl-5.8.1/README.win32
--- perl-5.8.1-old/README.win32 2004-07-28 20:34:42.000000000 +0300
+++ perl-5.8.1/README.win32 2004-07-31 15:27:40.000000000 +0300
@@ -745,6 +745,12 @@
Most C<socket()> related calls are supported, but they may not
behave as on Unix platforms. See L<perlport> for the full list.
+Perl requires Winsock2 to be installed on the system. If you're
+running Win95, you can download Winsock upgrade from here:
+
+http://www.microsoft.com/windows95/downloads/contents/WUAdminTools/S_WUNetworkingTools/W95Sockets2/Default.asp
+
+Later OS versions already include Winsock2 support.
Signal handling may not behave as on Unix platforms (where it
doesn't exactly "behave", either :). For instance, calling C<die()>
diff -rdu perl-5.8.1-old/win32/Makefile perl-5.8.1/win32/Makefile
--- perl-5.8.1-old/win32/Makefile 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/Makefile 2004-07-31 13:36:04.000000000 +0300
@@ -326,7 +326,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD = -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD = -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
!ENDIF
ARCHDIR = ..\lib\$(ARCHNAME)
@@ -408,7 +408,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -rdu perl-5.8.1-old/win32/makefile.mk perl-5.8.1/win32/makefile.mk
--- perl-5.8.1-old/win32/makefile.mk 2004-07-28 20:34:46.000000000 +0300
+++ perl-5.8.1/win32/makefile.mk 2004-07-31 13:42:26.000000000 +0300
@@ -312,7 +312,7 @@
# VC 6.0 can load the socket dll on demand. Makes the test suite
# run in about 10% less time.
-DELAYLOAD *= -DELAYLOAD:wsock32.dll -DELAYLOAD:shell32.dll delayimp.lib
+DELAYLOAD *= -DELAYLOAD:ws2_32.dll -DELAYLOAD:shell32.dll delayimp.lib
.IF "$(CFG)" == "Debug"
.ELSE
@@ -425,7 +425,7 @@
LIBFILES = $(CRYPT_LIB) $(LIBC) \
-lmoldname -lkernel32 -luser32 -lgdi32 \
-lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 \
- -loleaut32 -lnetapi32 -luuid -lwsock32 -lmpr \
+ -loleaut32 -lnetapi32 -luuid -lws2_32 -lmpr \
-lwinmm -lversion -lodbc32
.IF "$(CFG)" == "Debug"
@@ -505,7 +505,7 @@
LIBBASEFILES = $(CRYPT_LIB) \
oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib \
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib \
- netapi32.lib uuid.lib wsock32.lib mpr.lib winmm.lib \
+ netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib \
version.lib
# win64 doesn't have some libs
diff -rdu perl-5.8.1-old/win32/win32sck.c perl-5.8.1/win32/win32sck.c
--- perl-5.8.1-old/win32/win32sck.c 2004-07-28 20:34:48.000000000 +0300
+++ perl-5.8.1/win32/win32sck.c 2004-08-03 19:17:30.000000000 +0300
@@ -16,6 +16,8 @@
#define Win32_Winsock
#endif
#include <windows.h>
+#include <ws2spi.h>
+
#include "EXTERN.h"
#include "perl.h"
@@ -86,11 +88,11 @@
* initalize the winsock interface and insure that it is
* cleaned up at exit.
*/
- version = 0x101;
+ version = 0x2;
if(ret = WSAStartup(version, &retdata))
Perl_croak_nocontext("Unable to locate winsock library!\n");
if(retdata.wVersion != version)
- Perl_croak_nocontext("Could not find version 1.1 of winsock dll\n");
+ Perl_croak_nocontext("Could not find version 2.0 of winsock dll\n");
/* atexit((void (*)(void)) EndSockets); */
wsock_started = 1;
@@ -103,14 +105,6 @@
#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
dTHX;
if (!w32_init_socktype) {
-#endif
- int iSockOpt = SO_SYNCHRONOUS_NONALERT;
- /*
- * Enable the use of sockets as filehandles
- */
- setsockopt(INVALID_SOCKET, SOL_SOCKET, SO_OPENTYPE,
- (char *)&iSockOpt, sizeof(iSockOpt));
-#if defined(USE_5005THREADS) || defined(USE_ITHREADS)
w32_init_socktype = 1;
}
#endif
@@ -399,6 +393,65 @@
return r;
}
+#ifdef USE_SOCKETS_AS_HANDLES
+#define WIN32_OPEN_SOCKET(af, type, protocol) open_ifs_socket(af, type, protocol)
+
+void
+convert_proto_info_w2a(WSAPROTOCOL_INFOW *in, WSAPROTOCOL_INFOA *out)
+{
+ Copy(in, out, 1, WSAPROTOCOL_INFOA);
+ wcstombs(out->szProtocol, in->szProtocol, sizeof(out->szProtocol));
+}
+
+SOCKET
+open_ifs_socket(int af, int type, int protocol)
+{
+ unsigned long proto_buffers_len = 0;
+ int error_code;
+ SOCKET out = INVALID_SOCKET;
+
+ if (WSCEnumProtocols(NULL, NULL, &proto_buffers_len, &error_code) == SOCKET_ERROR
+ && error_code == WSAENOBUFS)
+ {
+ WSAPROTOCOL_INFOW *proto_buffers;
+ int protocols_available = 0;
+
+ New(1, proto_buffers, proto_buffers_len / sizeof(WSAPROTOCOL_INFOW),
+ WSAPROTOCOL_INFOW);
+
+ if ((protocols_available = WSCEnumProtocols(NULL, proto_buffers,
+ &proto_buffers_len, &error_code)) != SOCKET_ERROR)
+ {
+ int i;
+ for (i = 0; i < protocols_available; i++)
+ {
+ WSAPROTOCOL_INFOA proto_info;
+
+ if ((af != AF_UNSPEC && af != proto_buffers[i].iAddressFamily)
+ || (type != proto_buffers[i].iSocketType)
+ || (protocol != 0 && protocol != proto_buffers[i].iProtocol))
+ continue;
+
+ if ((proto_buffers[i].dwServiceFlags1 & XP1_IFS_HANDLES) == 0)
+ continue;
+
+ convert_proto_info_w2a(&(proto_buffers[i]), &proto_info);
+
+ out = WSASocket(af, type, protocol, &proto_info, 0, 0);
+ break;
+ }
+ }
+
+ Safefree(proto_buffers);
+ }
+
+ return out;
+}
+
+#else
+#define WIN32_OPEN_SOCKET(af, type, protocol) socket(af, type, protocol)
+#endif
+
SOCKET
win32_socket(int af, int type, int protocol)
{
@@ -408,7 +461,8 @@
SOCKET_TEST(s = socket(af, type, protocol), INVALID_SOCKET);
#else
StartSockets();
- if((s = socket(af, type, protocol)) == INVALID_SOCKET)
+
+ if((s = WIN32_OPEN_SOCKET(af, type, protocol)) == INVALID_SOCKET)
errno = WSAGetLastError();
else
s = OPEN_SOCKET(s);
|
From @steve-m-hayFixed by change #23200. |
@steve-m-hay - Status changed from 'open' to 'resolved' |
Migrated from rt.perl.org#24269 (status was 'resolved')
Searchable as RT24269$
The text was updated successfully, but these errors were encountered: