diff options
-rw-r--r-- | README.win32 | 7 | ||||
-rw-r--r-- | dosish.h | 1 | ||||
-rw-r--r-- | win32/makedef.pl | 1 | ||||
-rw-r--r-- | win32/win32.c | 9 | ||||
-rw-r--r-- | win32/win32iop.h | 3 | ||||
-rw-r--r-- | win32/win32sck.c | 24 |
6 files changed, 34 insertions, 11 deletions
diff --git a/README.win32 b/README.win32 index 940c498e43..3727b2cf95 100644 --- a/README.win32 +++ b/README.win32 @@ -503,7 +503,7 @@ The following functions are currently unavailable: C<fork()>, C<dump()>, C<chown()>, C<link()>, C<symlink()>, C<chroot()>, C<setpgrp()> and related security functions, C<setpriority()>, C<getpriority()>, C<syscall()>, C<fcntl()>, C<getpw*()>, -C<wait*()>, C<msg*()>, C<shm*()>, C<sem*()>, C<ioctl()>, C<alarm()>, +C<wait*()>, C<msg*()>, C<shm*()>, C<sem*()>, C<alarm()>, C<socketpair()>, C<*netent()>, C<*protoent()>, C<*servent()>, C<*hostent()>, C<getnetby*()>. This list is possibly incomplete. @@ -519,6 +519,11 @@ The four-argument C<select()> call is only supported on sockets. =item * +The C<ioctl()> call is only supported on sockets (where it provides the +functionality of ioctlsocket() in the Winsock API). + +=item * + C<$?> ends up with the exitstatus of the subprocess (this is different from Unix, where the exitstatus is actually given by "$? >> 8"). Failure to spawn() the subprocess is indicated by setting $? to @@ -46,6 +46,7 @@ #define TMPPATH "plXXXXXX" #ifdef WIN32 +#define HAS_IOCTL #define HAS_UTIME #define HAS_KILL #endif diff --git a/win32/makedef.pl b/win32/makedef.pl index 766a4266f4..27bcf95295 100644 --- a/win32/makedef.pl +++ b/win32/makedef.pl @@ -507,6 +507,7 @@ win32_times win32_alarm win32_open_osfhandle win32_get_osfhandle +win32_ioctl Perl_win32_init Perl_init_os_extras Perl_getTHR diff --git a/win32/win32.c b/win32/win32.c index bdfb3e2984..8f96611c5a 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -610,15 +610,6 @@ kill(int pid, int sig) * File system stuff */ -#if 0 -int -ioctl(int i, unsigned int u, char *data) -{ - croak("ioctl not implemented!\n"); - return -1; -} -#endif - DllExport unsigned int win32_sleep(unsigned int t) { diff --git a/win32/win32iop.h b/win32/win32iop.h index d565cb51e0..5e03f952f2 100644 --- a/win32/win32iop.h +++ b/win32/win32iop.h @@ -114,6 +114,7 @@ DllExport int win32_times(struct tms *timebuf); DllExport unsigned win32_alarm(unsigned int sec); DllExport int win32_flock(int fd, int oper); DllExport int win32_stat(const char *path, struct stat *buf); +DllExport int win32_ioctl(int i, unsigned int u, char *data); #ifdef HAVE_DES_FCRYPT DllExport char * win32_crypt(const char *txt, const char *salt); @@ -138,6 +139,7 @@ END_EXTERN_C #undef sleep #undef times #undef alarm +#undef ioctl #ifdef __BORLANDC__ #undef ungetc @@ -236,6 +238,7 @@ END_EXTERN_C #define sleep win32_sleep #define times win32_times #define alarm win32_alarm +#define ioctl win32_ioctl #ifdef HAVE_DES_FCRYPT #undef crypt diff --git a/win32/win32sck.c b/win32/win32sck.c index 64d1a0a65c..a6e7a990b8 100644 --- a/win32/win32sck.c +++ b/win32/win32sck.c @@ -223,7 +223,7 @@ win32_getsockopt(SOCKET s, int level, int optname, char *optval, int *optlen) return r; } -int +DllExport int win32_ioctlsocket(SOCKET s, long cmd, u_long *argp) { int r; @@ -466,6 +466,28 @@ win32_getservbyport(int port, const char *proto) return r; } +int +win32_ioctl(int i, unsigned int u, char *data) +{ + u_long argp = (u_long)data; + int retval; + + if (!wsock_started) { + croak("ioctl implemented only on sockets"); + /* NOTREACHED */ + } + + retval = ioctlsocket(TO_SOCKET(i), (long)u, &argp); + if (retval == SOCKET_ERROR) { + if (WSAGetLastError() == WSAENOTSOCK) { + croak("ioctl implemented only on sockets"); + /* NOTREACHED */ + } + errno = WSAGetLastError(); + } + return retval; +} + char FAR * win32_inet_ntoa(struct in_addr in) { |