Ruby 2.7.6p219 (2022-04-12 revision c9c2245c0a25176072e02db9254f0e0c84c805cd)
win32.h
Go to the documentation of this file.
1#ifndef RUBY_WIN32_H
2#define RUBY_WIN32_H 1
3
4#if defined(__cplusplus)
5extern "C" {
6#if 0
7} /* satisfy cc-mode */
8#endif
9#endif
10
12
13/*
14 * Copyright (c) 1993, Intergraph Corporation
15 *
16 * You may distribute under the terms of either the GNU General Public
17 * License or the Artistic License, as specified in the perl README file.
18 *
19 */
20
21/*
22 * Definitions for NT port of Perl
23 */
24
25
26/*
27 * Ok now we can include the normal include files.
28 */
29
30/* #include <stdarg.h> conflict with varargs.h? */
31#if !defined(WSAAPI)
32#if defined(__cplusplus) && defined(_MSC_VER)
33extern "C++" { /* template without extern "C++" */
34#endif
35#if !defined(_WIN64) && !defined(WIN32)
36#define WIN32
37#endif
38#if defined(_MSC_VER) && _MSC_VER <= 1200
39#include <windows.h>
40#endif
41#include <winsock2.h>
42#include <ws2tcpip.h>
43#if !defined(_MSC_VER) || _MSC_VER >= 1400
44#include <iphlpapi.h>
45#endif
46#if defined(__cplusplus) && defined(_MSC_VER)
47}
48#endif
49#endif
50
51/*
52 * We're not using Microsoft's "extensions" to C for
53 * Structured Exception Handling (SEH) so we can nuke these
54 */
55#undef try
56#undef except
57#undef finally
58#undef leave
59
60#include <stdio.h>
61#include <stdlib.h>
62#include <string.h>
63#include <direct.h>
64#include <process.h>
65#include <time.h>
66#if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER == 1200
67extern "C++" { /* template without extern "C++" */
68#endif
69#include <math.h>
70#if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER == 1200
71}
72#endif
73#include <signal.h>
74#include <sys/stat.h>
75#include <sys/types.h>
76#ifdef HAVE_SYS_UTIME_H
77# include <sys/utime.h>
78#else
79# include <utime.h>
80#endif
81#include <io.h>
82#include <malloc.h>
83#if defined __MINGW32__
84# include <stdint.h>
85#else
86# if !defined(_INTPTR_T_DEFINED)
87# ifdef _WIN64
88typedef __int64 intptr_t;
89# else
90typedef int intptr_t;
91# endif
92# define _INTPTR_T_DEFINED
93# endif
94# if !defined(INTPTR_MAX)
95# ifdef _WIN64
96# define INTPTR_MAX 9223372036854775807I64
97# else
98# define INTPTR_MAX 2147483647
99# endif
100# define INTPTR_MIN (-INTPTR_MAX-1)
101# endif
102# if !defined(_UINTPTR_T_DEFINED)
103# ifdef _WIN64
104typedef unsigned __int64 uintptr_t;
105# else
106typedef unsigned int uintptr_t;
107# endif
108# define _UINTPTR_T_DEFINED
109# endif
110# if !defined(UINTPTR_MAX)
111# ifdef _WIN64
112# define UINTPTR_MAX 18446744073709551615UI64
113# else
114# define UINTPTR_MAX 4294967295U
115# endif
116# endif
117#endif
118#ifndef __MINGW32__
119# define mode_t int
120#endif
121#ifdef HAVE_UNISTD_H
122# include <unistd.h>
123#endif
124
125#define rb_w32_iswinnt() TRUE
126#define rb_w32_iswin95() FALSE
127
128#define WNOHANG -1
129
130#define O_SHARE_DELETE 0x20000000 /* for rb_w32_open(), rb_w32_wopen() */
131
132typedef int clockid_t;
133#define CLOCK_REALTIME 0
134#define CLOCK_MONOTONIC 1
135
136#undef utime
137#undef lseek
138#undef stat
139#undef fstat
140#ifdef RUBY_EXPORT
141#define utime(_p, _t) rb_w32_utime(_p, _t)
142#undef HAVE_UTIMES
143#define HAVE_UTIMES 1
144#define utimes(_p, _t) rb_w32_utimes(_p, _t)
145#undef HAVE_UTIMENSAT
146#define HAVE_UTIMENSAT 1
147#define AT_FDCWD -100
148#define utimensat(_d, _p, _t, _f) rb_w32_utimensat(_d, _p, _t, _f)
149#define lseek(_f, _o, _w) rb_w32_lseek(_f, _o, _w)
150
151#define pipe(p) rb_w32_pipe(p)
152#define open rb_w32_open
153#define close(h) rb_w32_close(h)
154#define fclose(f) rb_w32_fclose(f)
155#define read(f, b, s) rb_w32_read(f, b, s)
156#define write(f, b, s) rb_w32_write(f, b, s)
157#define getpid() rb_w32_getpid()
158#define getppid() rb_w32_getppid()
159#define sleep(x) rb_w32_Sleep((x)*1000)
160#define Sleep(msec) (void)rb_w32_Sleep(msec)
161
162#undef execv
163#define execv(path,argv) rb_w32_aspawn(P_OVERLAY,path,argv)
164#undef isatty
165#define isatty(h) rb_w32_isatty(h)
166
167#undef mkdir
168#define mkdir(p, m) rb_w32_mkdir(p, m)
169#undef rmdir
170#define rmdir(p) rb_w32_rmdir(p)
171#undef unlink
172#define unlink(p) rb_w32_unlink(p)
173#endif /* RUBY_EXPORT */
174
175/* same with stati64 except the size of st_ino and nanosecond timestamps */
176struct stati128 {
177 _dev_t st_dev;
178 unsigned __int64 st_ino;
179 __int64 st_inohigh;
180 unsigned short st_mode;
181 short st_nlink;
182 short st_uid;
183 short st_gid;
184 _dev_t st_rdev;
185 __int64 st_size;
186 __time64_t st_atime;
188 __time64_t st_mtime;
190 __time64_t st_ctime;
192};
193
194#if SIZEOF_OFF_T == 8
195#define off_t __int64
196#define stat stati128
197#undef SIZEOF_STRUCT_STAT_ST_INO
198#define SIZEOF_STRUCT_STAT_ST_INO sizeof(unsigned __int64)
199#define HAVE_STRUCT_STAT_ST_INOHIGH
200#define HAVE_STRUCT_STAT_ST_ATIMENSEC
201#define HAVE_STRUCT_STAT_ST_MTIMENSEC
202#define HAVE_STRUCT_STAT_ST_CTIMENSEC
203#define fstat(fd,st) rb_w32_fstati128(fd,st)
204#define stati128(path, st) rb_w32_stati128(path,st)
205#else
206#define stat(path,st) rb_w32_stat(path,st)
207#define fstat(fd,st) rb_w32_fstat(fd,st)
208extern int rb_w32_stat(const char *, struct stat *);
209extern int rb_w32_fstat(int, struct stat *);
210#endif
211#define lstat(path,st) rb_w32_lstati128(path,st)
212#define access(path,mode) rb_w32_access(path,mode)
213
214#define strcasecmp _stricmp
215#define strncasecmp _strnicmp
216#define fsync _commit
217
218struct timezone;
219
220#ifdef __MINGW32__
221#undef isascii
222#define isascii __isascii
223#endif
224
225struct iovec {
226 void *iov_base;
227 size_t iov_len;
228};
229struct msghdr {
230 void *msg_name;
232 struct iovec *msg_iov;
237};
238
239/* for getifaddrs() and others */
240struct ifaddrs {
242 char *ifa_name;
244 struct sockaddr *ifa_addr;
245 struct sockaddr *ifa_netmask;
246 struct sockaddr *ifa_broadaddr;
247 struct sockaddr *ifa_dstaddr;
248 void *ifa_data;
249};
250#ifdef IF_NAMESIZE
251#define IFNAMSIZ IF_NAMESIZE
252#else
253#define IFNAMSIZ 256
254#endif
255#ifdef IFF_POINTTOPOINT
256#define IFF_POINTOPOINT IFF_POINTTOPOINT
257#endif
258
259extern void rb_w32_sysinit(int *, char ***);
260extern DWORD rb_w32_osid(void);
261extern rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *, int *);
262extern int flock(int fd, int oper);
263extern int rb_w32_io_cancelable_p(int);
264extern int rb_w32_is_socket(int);
265extern int WSAAPI rb_w32_accept(int, struct sockaddr *, int *);
266extern int WSAAPI rb_w32_bind(int, const struct sockaddr *, int);
267extern int WSAAPI rb_w32_connect(int, const struct sockaddr *, int);
268extern void rb_w32_fdset(int, fd_set*);
269extern void rb_w32_fdclr(int, fd_set*);
270extern int rb_w32_fdisset(int, fd_set*);
271extern int WSAAPI rb_w32_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
272extern int WSAAPI rb_w32_getpeername(int, struct sockaddr *, int *);
273extern int WSAAPI rb_w32_getsockname(int, struct sockaddr *, int *);
274extern int WSAAPI rb_w32_getsockopt(int, int, int, char *, int *);
275extern int WSAAPI rb_w32_ioctlsocket(int, long, u_long *);
276extern int WSAAPI rb_w32_listen(int, int);
277extern int WSAAPI rb_w32_recv(int, char *, int, int);
278extern int WSAAPI rb_w32_recvfrom(int, char *, int, int, struct sockaddr *, int *);
279extern int WSAAPI rb_w32_send(int, const char *, int, int);
280extern int WSAAPI rb_w32_sendto(int, const char *, int, int, const struct sockaddr *, int);
281extern int recvmsg(int, struct msghdr *, int);
282extern int sendmsg(int, const struct msghdr *, int);
283extern int WSAAPI rb_w32_setsockopt(int, int, int, const char *, int);
284extern int WSAAPI rb_w32_shutdown(int, int);
285extern int WSAAPI rb_w32_socket(int, int, int);
286extern SOCKET rb_w32_get_osfhandle(int);
287extern struct hostent *WSAAPI rb_w32_gethostbyaddr(const char *, int, int);
288extern struct hostent *WSAAPI rb_w32_gethostbyname(const char *);
289extern int WSAAPI rb_w32_gethostname(char *, int);
290extern struct protoent *WSAAPI rb_w32_getprotobyname(const char *);
291extern struct protoent *WSAAPI rb_w32_getprotobynumber(int);
292extern struct servent *WSAAPI rb_w32_getservbyname(const char *, const char *);
293extern struct servent *WSAAPI rb_w32_getservbyport(int, const char *);
294extern int socketpair(int, int, int, int *);
295extern int getifaddrs(struct ifaddrs **);
296extern void freeifaddrs(struct ifaddrs *);
297extern char * rb_w32_getcwd(char *, int);
298extern char * rb_w32_ugetenv(const char *);
299extern char * rb_w32_getenv(const char *);
300extern int rb_w32_rename(const char *, const char *);
301extern int rb_w32_urename(const char *, const char *);
302extern char **rb_w32_get_environ(void);
303extern void rb_w32_free_environ(char **);
304extern int rb_w32_map_errno(DWORD);
305extern const char *WSAAPI rb_w32_inet_ntop(int,const void *,char *,size_t);
306extern int WSAAPI rb_w32_inet_pton(int,const char *,void *);
307extern DWORD rb_w32_osver(void);
308
309extern int chown(const char *, int, int);
310extern int rb_w32_uchown(const char *, int, int);
311extern int link(const char *, const char *);
312extern int rb_w32_ulink(const char *, const char *);
313extern ssize_t readlink(const char *, char *, size_t);
314extern ssize_t rb_w32_ureadlink(const char *, char *, size_t);
315extern ssize_t rb_w32_wreadlink(const WCHAR *, WCHAR *, size_t);
316extern int symlink(const char *src, const char *link);
317extern int rb_w32_usymlink(const char *src, const char *link);
318extern int gettimeofday(struct timeval *, struct timezone *);
319extern int clock_gettime(clockid_t, struct timespec *);
320extern int clock_getres(clockid_t, struct timespec *);
321extern rb_pid_t waitpid (rb_pid_t, int *, int);
322extern rb_pid_t rb_w32_spawn(int, const char *, const char*);
323extern rb_pid_t rb_w32_aspawn(int, const char *, char *const *);
324extern rb_pid_t rb_w32_aspawn_flags(int, const char *, char *const *, DWORD);
325extern rb_pid_t rb_w32_uspawn(int, const char *, const char*);
326extern rb_pid_t rb_w32_uaspawn(int, const char *, char *const *);
327extern rb_pid_t rb_w32_uaspawn_flags(int, const char *, char *const *, DWORD);
328extern int kill(int, int);
329extern int fcntl(int, int, ...);
330extern int rb_w32_set_nonblock(int);
331extern rb_pid_t rb_w32_getpid(void);
332extern rb_pid_t rb_w32_getppid(void);
333extern int rb_w32_isatty(int);
334extern int rb_w32_uchdir(const char *);
335extern int rb_w32_mkdir(const char *, int);
336extern int rb_w32_umkdir(const char *, int);
337extern int rb_w32_rmdir(const char *);
338extern int rb_w32_urmdir(const char *);
339extern int rb_w32_unlink(const char *);
340extern int rb_w32_uunlink(const char *);
341extern int rb_w32_uchmod(const char *, int);
342extern int rb_w32_stati128(const char *, struct stati128 *);
343extern int rb_w32_ustati128(const char *, struct stati128 *);
344extern int rb_w32_lstati128(const char *, struct stati128 *);
345extern int rb_w32_ulstati128(const char *, struct stati128 *);
346extern int rb_w32_access(const char *, int);
347extern int rb_w32_uaccess(const char *, int);
348extern char rb_w32_fd_is_text(int);
349extern int rb_w32_fstati128(int, struct stati128 *);
350extern int rb_w32_dup2(int, int);
351
352#include <float.h>
353
354#if defined _MSC_VER && _MSC_VER >= 1800 && defined INFINITY
355#pragma warning(push)
356#pragma warning(disable:4756)
357static inline float
358rb_infinity_float(void)
359{
360 return INFINITY;
361}
362#pragma warning(pop)
363#undef INFINITY
364#define INFINITY rb_infinity_float()
365#endif
366
367#if !defined __MINGW32__ || defined __NO_ISOCEXT
368#ifndef isnan
369#define isnan(x) _isnan(x)
370#endif
371static inline int
372finite(double x)
373{
374 return _finite(x);
375}
376#ifndef copysign
377#define copysign(a, b) _copysign(a, b)
378#endif
379static inline double
380scalb(double a, long b)
381{
382 return _scalb(a, b);
383}
384#else
385__declspec(dllimport) extern int finite(double);
386#endif
387
388#if !defined S_IFIFO && defined _S_IFIFO
389#define S_IFIFO _S_IFIFO
390#endif
391
392#if !defined S_IRUSR && !defined __MINGW32__
393#define S_IRUSR 0400
394#endif
395#ifndef S_IRGRP
396#define S_IRGRP 0040
397#endif
398#ifndef S_IROTH
399#define S_IROTH 0004
400#endif
401
402#if !defined S_IWUSR && !defined __MINGW32__
403#define S_IWUSR 0200
404#endif
405#ifndef S_IWGRP
406#define S_IWGRP 0020
407#endif
408#ifndef S_IWOTH
409#define S_IWOTH 0002
410#endif
411
412#if !defined S_IXUSR && !defined __MINGW32__
413#define S_IXUSR 0100
414#endif
415#ifndef S_IXGRP
416#define S_IXGRP 0010
417#endif
418#ifndef S_IXOTH
419#define S_IXOTH 0001
420#endif
421
422#define S_IFLNK 0xa000
423
424/*
425 * define this so we can do inplace editing
426 */
427
428#define SUFFIX
429
430extern int rb_w32_ftruncate(int fd, off_t length);
431extern int rb_w32_truncate(const char *path, off_t length);
432extern int rb_w32_utruncate(const char *path, off_t length);
433
434#undef HAVE_FTRUNCATE
435#define HAVE_FTRUNCATE 1
436#if defined HAVE_FTRUNCATE64
437#define ftruncate ftruncate64
438#else
439#define ftruncate rb_w32_ftruncate
440#endif
441
442#undef HAVE_TRUNCATE
443#define HAVE_TRUNCATE 1
444#if defined HAVE_TRUNCATE64
445#define truncate truncate64
446#else
447#define truncate rb_w32_truncate
448#endif
449
450#if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1800
451#define strtoll _strtoi64
452#define strtoull _strtoui64
453#endif
454
455/*
456 * stubs
457 */
458extern int ioctl (int, int, ...);
459extern rb_uid_t getuid (void);
460extern rb_uid_t geteuid (void);
461extern rb_gid_t getgid (void);
462extern rb_gid_t getegid (void);
463extern int setuid (rb_uid_t);
464extern int setgid (rb_gid_t);
465
466extern char *rb_w32_strerror(int);
467
468#ifdef RUBY_EXPORT
469#define strerror(e) rb_w32_strerror(e)
470#endif
471
472#define PIPE_BUF 1024
473
474#define LOCK_SH 1
475#define LOCK_EX 2
476#define LOCK_NB 4
477#define LOCK_UN 8
478
479
480#ifndef SIGINT
481#define SIGINT 2
482#endif
483#ifndef SIGKILL
484#define SIGKILL 9
485#endif
486
487
488/* #undef va_start */
489/* #undef va_end */
490
491/* winsock error map */
492#include <errno.h>
493
494#ifndef EWOULDBLOCK
495# define EWOULDBLOCK WSAEWOULDBLOCK
496#endif
497#ifndef EINPROGRESS
498# define EINPROGRESS WSAEINPROGRESS
499#endif
500#ifndef EALREADY
501# define EALREADY WSAEALREADY
502#endif
503#ifndef ENOTSOCK
504# define ENOTSOCK WSAENOTSOCK
505#endif
506#ifndef EDESTADDRREQ
507# define EDESTADDRREQ WSAEDESTADDRREQ
508#endif
509#ifndef EMSGSIZE
510# define EMSGSIZE WSAEMSGSIZE
511#endif
512#ifndef EPROTOTYPE
513# define EPROTOTYPE WSAEPROTOTYPE
514#endif
515#ifndef ENOPROTOOPT
516# define ENOPROTOOPT WSAENOPROTOOPT
517#endif
518#ifndef EPROTONOSUPPORT
519# define EPROTONOSUPPORT WSAEPROTONOSUPPORT
520#endif
521#ifndef ESOCKTNOSUPPORT
522# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
523#endif
524#ifndef EOPNOTSUPP
525# define EOPNOTSUPP WSAEOPNOTSUPP
526#endif
527#ifndef EPFNOSUPPORT
528# define EPFNOSUPPORT WSAEPFNOSUPPORT
529#endif
530#ifndef EAFNOSUPPORT
531# define EAFNOSUPPORT WSAEAFNOSUPPORT
532#endif
533#ifndef EADDRINUSE
534# define EADDRINUSE WSAEADDRINUSE
535#endif
536#ifndef EADDRNOTAVAIL
537# define EADDRNOTAVAIL WSAEADDRNOTAVAIL
538#endif
539#ifndef ENETDOWN
540# define ENETDOWN WSAENETDOWN
541#endif
542#ifndef ENETUNREACH
543# define ENETUNREACH WSAENETUNREACH
544#endif
545#ifndef ENETRESET
546# define ENETRESET WSAENETRESET
547#endif
548#ifndef ECONNABORTED
549# define ECONNABORTED WSAECONNABORTED
550#endif
551#ifndef ECONNRESET
552# define ECONNRESET WSAECONNRESET
553#endif
554#ifndef ENOBUFS
555# define ENOBUFS WSAENOBUFS
556#endif
557#ifndef EISCONN
558# define EISCONN WSAEISCONN
559#endif
560#ifndef ENOTCONN
561# define ENOTCONN WSAENOTCONN
562#endif
563#ifndef ESHUTDOWN
564# define ESHUTDOWN WSAESHUTDOWN
565#endif
566#ifndef ETOOMANYREFS
567# define ETOOMANYREFS WSAETOOMANYREFS
568#endif
569#ifndef ETIMEDOUT
570# define ETIMEDOUT WSAETIMEDOUT
571#endif
572#ifndef ECONNREFUSED
573# define ECONNREFUSED WSAECONNREFUSED
574#endif
575#ifndef ELOOP
576# define ELOOP WSAELOOP
577#endif
578/*#define ENAMETOOLONG WSAENAMETOOLONG*/
579#ifndef EHOSTDOWN
580# define EHOSTDOWN WSAEHOSTDOWN
581#endif
582#ifndef EHOSTUNREACH
583# define EHOSTUNREACH WSAEHOSTUNREACH
584#endif
585/*#define ENOTEMPTY WSAENOTEMPTY*/
586#ifndef EPROCLIM
587# define EPROCLIM WSAEPROCLIM
588#endif
589#ifndef EUSERS
590# define EUSERS WSAEUSERS
591#endif
592#ifndef EDQUOT
593# define EDQUOT WSAEDQUOT
594#endif
595#ifndef ESTALE
596# define ESTALE WSAESTALE
597#endif
598#ifndef EREMOTE
599# define EREMOTE WSAEREMOTE
600#endif
601
602#define F_DUPFD 0
603#define F_GETFD 1
604#define F_SETFD 2
605#if 0
606#define F_GETFL 3
607#endif
608#define F_SETFL 4
609#define F_DUPFD_CLOEXEC 67
610#define FD_CLOEXEC 1 /* F_GETFD, F_SETFD */
611#define O_NONBLOCK 1
612
613#undef FD_SET
614#define FD_SET(fd, set) do {\
615 unsigned int i;\
616 SOCKET s = _get_osfhandle(fd);\
617\
618 for (i = 0; i < (set)->fd_count; i++) {\
619 if ((set)->fd_array[i] == s) {\
620 break;\
621 }\
622 }\
623 if (i == (set)->fd_count) {\
624 if ((set)->fd_count < FD_SETSIZE) {\
625 (set)->fd_array[i] = s;\
626 (set)->fd_count++;\
627 }\
628 }\
629} while(0)
630
631#undef FD_CLR
632#define FD_CLR(f, s) rb_w32_fdclr(f, s)
633
634#undef FD_ISSET
635#define FD_ISSET(f, s) rb_w32_fdisset(f, s)
636
637#ifdef RUBY_EXPORT
638#undef inet_ntop
639#define inet_ntop(f,a,n,l) rb_w32_inet_ntop(f,a,n,l)
640
641#undef inet_pton
642#define inet_pton(f,s,d) rb_w32_inet_pton(f,s,d)
643
644#undef accept
645#define accept(s, a, l) rb_w32_accept(s, a, l)
646
647#undef bind
648#define bind(s, a, l) rb_w32_bind(s, a, l)
649
650#undef connect
651#define connect(s, a, l) rb_w32_connect(s, a, l)
652
653#undef select
654#define select(n, r, w, e, t) rb_w32_select(n, r, w, e, t)
655
656#undef getpeername
657#define getpeername(s, a, l) rb_w32_getpeername(s, a, l)
658
659#undef getsockname
660#define getsockname(s, a, l) rb_w32_getsockname(s, a, l)
661
662#undef getsockopt
663#define getsockopt(s, v, n, o, l) rb_w32_getsockopt(s, v, n, o, l)
664
665#undef ioctlsocket
666#define ioctlsocket(s, c, a) rb_w32_ioctlsocket(s, c, a)
667
668#undef listen
669#define listen(s, b) rb_w32_listen(s, b)
670
671#undef recv
672#define recv(s, b, l, f) rb_w32_recv(s, b, l, f)
673
674#undef recvfrom
675#define recvfrom(s, b, l, f, fr, frl) rb_w32_recvfrom(s, b, l, f, fr, frl)
676
677#undef send
678#define send(s, b, l, f) rb_w32_send(s, b, l, f)
679
680#undef sendto
681#define sendto(s, b, l, f, t, tl) rb_w32_sendto(s, b, l, f, t, tl)
682
683#undef setsockopt
684#define setsockopt(s, v, n, o, l) rb_w32_setsockopt(s, v, n, o, l)
685
686#undef shutdown
687#define shutdown(s, h) rb_w32_shutdown(s, h)
688
689#undef socket
690#define socket(s, t, p) rb_w32_socket(s, t, p)
691
692#undef gethostbyaddr
693#define gethostbyaddr(a, l, t) rb_w32_gethostbyaddr(a, l, t)
694
695#undef gethostbyname
696#define gethostbyname(n) rb_w32_gethostbyname(n)
697
698#undef gethostname
699#define gethostname(n, l) rb_w32_gethostname(n, l)
700
701#undef getprotobyname
702#define getprotobyname(n) rb_w32_getprotobyname(n)
703
704#undef getprotobynumber
705#define getprotobynumber(n) rb_w32_getprotobynumber(n)
706
707#undef getservbyname
708#define getservbyname(n, p) rb_w32_getservbyname(n, p)
709
710#undef getservbyport
711#define getservbyport(p, pr) rb_w32_getservbyport(p, pr)
712
713#undef get_osfhandle
714#define get_osfhandle(h) rb_w32_get_osfhandle(h)
715
716#undef getcwd
717#define getcwd(b, s) rb_w32_getcwd(b, s)
718
719#undef getenv
720#define getenv(n) rb_w32_getenv(n)
721
722#undef rename
723#define rename(o, n) rb_w32_rename(o, n)
724
725#undef times
726#define times(t) rb_w32_times(t)
727
728#undef dup2
729#define dup2(o, n) rb_w32_dup2(o, n)
730#endif
731
732struct tms {
737};
738
739int rb_w32_times(struct tms *);
740
741struct tm *gmtime_r(const time_t *, struct tm *);
742struct tm *localtime_r(const time_t *, struct tm *);
743
744/* thread stuff */
745int rb_w32_sleep(unsigned long msec);
746int rb_w32_open(const char *, int, ...);
747int rb_w32_uopen(const char *, int, ...);
748int rb_w32_wopen(const WCHAR *, int, ...);
749int rb_w32_close(int);
750int rb_w32_fclose(FILE*);
751int rb_w32_pipe(int[2]);
752ssize_t rb_w32_read(int, void *, size_t);
753ssize_t rb_w32_write(int, const void *, size_t);
754off_t rb_w32_lseek(int, off_t, int);
755int rb_w32_utime(const char *, const struct utimbuf *);
756int rb_w32_uutime(const char *, const struct utimbuf *);
757int rb_w32_utimes(const char *, const struct timeval *);
758int rb_w32_uutimes(const char *, const struct timeval *);
759int rb_w32_utimensat(int /* must be AT_FDCWD */, const char *, const struct timespec *, int /* must be 0 */);
760int rb_w32_uutimensat(int /* must be AT_FDCWD */, const char *, const struct timespec *, int /* must be 0 */);
761long rb_w32_write_console(uintptr_t, int); /* use uintptr_t instead of VALUE because it's not defined yet here */
762int WINAPI rb_w32_Sleep(unsigned long msec);
763int rb_w32_wait_events_blocking(HANDLE *events, int num, DWORD timeout);
764int rb_w32_time_subtract(struct timeval *rest, const struct timeval *wait);
765int rb_w32_wrap_io_handle(HANDLE, int);
767WCHAR *rb_w32_mbstr_to_wstr(UINT, const char *, int, long *);
768char *rb_w32_wstr_to_mbstr(UINT, const WCHAR *, int, long *);
769
770/*
771== ***CAUTION***
772Since this function is very dangerous, ((*NEVER*))
773* lock any HANDLEs(i.e. Mutex, Semaphore, CriticalSection and so on) or,
774* use anything like rb_thread_call_without_gvl,
775in asynchronous_func_t.
776*/
779
781
782#if (defined(__MINGW64_VERSION_MAJOR) || defined(__MINGW64__)) && !defined(__cplusplus)
783#ifdef RUBY_MINGW64_BROKEN_FREXP_MODF
784/* License: Ruby's */
785/* get rid of bugs in math.h of mingw */
786#define frexp(_X, _Y) __extension__ ({\
787 int intpart_frexp_bug = intpart_frexp_bug;\
788 double result_frexp_bug = frexp((_X), &intpart_frexp_bug);\
789 *(_Y) = intpart_frexp_bug;\
790 result_frexp_bug;\
791})
792/* License: Ruby's */
793#define modf(_X, _Y) __extension__ ({\
794 double intpart_modf_bug = intpart_modf_bug;\
795 double result_modf_bug = modf((_X), &intpart_modf_bug);\
796 *(_Y) = intpart_modf_bug;\
797 result_modf_bug;\
798})
799#endif
800
801#if defined(__MINGW64__)
802/*
803 * Use powl() instead of broken pow() of x86_64-w64-mingw32.
804 * This workaround will fix test failures in test_bignum.rb,
805 * test_fixnum.rb and test_float.rb etc.
806 */
807static inline double
808rb_w32_pow(double x, double y)
809{
810 return (double)powl(x, y);
811}
812#elif defined(__MINGW64_VERSION_MAJOR)
813double rb_w32_pow(double x, double y);
814#endif
815#define pow rb_w32_pow
816#endif
817
818#if defined(__cplusplus)
819#if 0
820{ /* satisfy cc-mode */
821#endif
822} /* extern "C" { */
823#endif
824
825#endif /* RUBY_WIN32_H */
__off_t off_t
long double powl(long double, long double)
__clockid_t clockid_t
#define rb_uid_t
#define rb_gid_t
#define RUBY_SYMBOL_EXPORT_BEGIN
__inline__ const void *__restrict__ src
#define RUBY_SYMBOL_EXPORT_END
unsigned long u_long
#define INFINITY
#define rb_pid_t
int finite(double)
Definition: finite.c:6
__uintptr_t uintptr_t
unsigned int u_int
const VALUE * argv
_ssize_t ssize_t
Definition: win32.h:240
u_int ifa_flags
Definition: win32.h:243
struct sockaddr * ifa_addr
Definition: win32.h:244
char * ifa_name
Definition: win32.h:242
struct ifaddrs * ifa_next
Definition: win32.h:241
void * ifa_data
Definition: win32.h:248
struct sockaddr * ifa_dstaddr
Definition: win32.h:247
struct sockaddr * ifa_broadaddr
Definition: win32.h:246
struct sockaddr * ifa_netmask
Definition: win32.h:245
Definition: win32.h:225
void * iov_base
Definition: win32.h:226
size_t iov_len
Definition: win32.h:227
Definition: win32.h:229
struct iovec * msg_iov
Definition: win32.h:232
void * msg_name
Definition: win32.h:230
int msg_iovlen
Definition: win32.h:233
int msg_namelen
Definition: win32.h:231
int msg_flags
Definition: win32.h:236
int msg_controllen
Definition: win32.h:235
void * msg_control
Definition: win32.h:234
unsigned short st_mode
Definition: win32.h:180
__time64_t st_ctime
Definition: win32.h:190
__int64 st_inohigh
Definition: win32.h:179
__time64_t st_atime
Definition: win32.h:186
short st_nlink
Definition: win32.h:181
long st_mtimensec
Definition: win32.h:189
long st_ctimensec
Definition: win32.h:191
long st_atimensec
Definition: win32.h:187
short st_uid
Definition: win32.h:182
unsigned __int64 st_ino
Definition: win32.h:178
short st_gid
Definition: win32.h:183
__time64_t st_mtime
Definition: win32.h:188
_dev_t st_dev
Definition: win32.h:177
__int64 st_size
Definition: win32.h:185
_dev_t st_rdev
Definition: win32.h:184
Definition: win32.h:732
long tms_stime
Definition: win32.h:734
long tms_cutime
Definition: win32.h:735
long tms_utime
Definition: win32.h:733
long tms_cstime
Definition: win32.h:736
Definition: file.c:2864
int wait(int *status)
Definition: win32.c:5219
int rb_w32_close(int)
Definition: win32.c:6950
long rb_w32_write_console(uintptr_t, int)
Definition: win32.c:7265
int WSAAPI rb_w32_sendto(int, const char *, int, int, const struct sockaddr *, int)
Definition: win32.c:3607
int rb_w32_access(const char *, int)
Definition: win32.c:5839
int gettimeofday(struct timeval *, struct timezone *)
Definition: win32.c:4628
int rb_w32_fclose(FILE *)
Definition: win32.c:6419
struct protoent *WSAAPI rb_w32_getprotobynumber(int)
Definition: win32.c:3921
int WSAAPI rb_w32_accept(int, struct sockaddr *, int *)
Definition: win32.c:3304
int intptr_t
Definition: win32.h:90
int rb_w32_ftruncate(int fd, off_t length)
Definition: win32.c:5934
int rb_w32_map_errno(DWORD)
Definition: win32.c:273
int rb_w32_ulstati128(const char *, struct stati128 *)
Definition: win32.c:5813
int rb_w32_is_socket(int)
Definition: win32.c:2721
SOCKET rb_w32_get_osfhandle(int)
Definition: win32.c:1108
void rb_w32_free_environ(char **)
Definition: win32.c:6107
char rb_w32_fd_is_text(int)
Definition: win32.c:7796
int rb_w32_rename(const char *, const char *)
Definition: win32.c:5363
int rb_w32_utimensat(int, const char *, const struct timespec *, int)
Definition: win32.c:7481
ssize_t readlink(const char *, char *, size_t)
Definition: win32.c:5129
int rb_w32_uchdir(const char *)
Definition: win32.c:7495
int rb_w32_ustati128(const char *, struct stati128 *)
Definition: win32.c:5785
ssize_t rb_w32_ureadlink(const char *, char *, size_t)
Definition: win32.c:5122
int recvmsg(int, struct msghdr *, int)
Definition: win32.c:3651
int rb_w32_uutimes(const char *, const struct timeval *)
Definition: win32.c:7441
rb_uid_t getuid(void)
Definition: win32.c:2795
WCHAR * rb_w32_mbstr_to_wstr(UINT, const char *, int, long *)
Definition: win32.c:2179
rb_pid_t waitpid(rb_pid_t, int *, int)
Definition: win32.c:4506
int setgid(rb_gid_t)
Definition: win32.c:2830
int rb_w32_uchmod(const char *, int)
Definition: win32.c:7664
int rb_w32_wait_events_blocking(HANDLE *events, int num, DWORD timeout)
int rb_w32_sleep(unsigned long msec)
int rb_w32_unwrap_io_handle(int)
Definition: win32.c:7948
int WSAAPI rb_w32_gethostname(char *, int)
Definition: win32.c:3891
int symlink(const char *src, const char *link)
Definition: win32.c:5212
DWORD rb_w32_osid(void)
char * rb_w32_wstr_to_mbstr(UINT, const WCHAR *, int, long *)
Definition: win32.c:2163
int rb_w32_truncate(const char *path, off_t length)
Definition: win32.c:5927
void rb_w32_fdclr(int, fd_set *)
Definition: win32.c:2857
int setuid(rb_uid_t)
Definition: win32.c:2823
int rb_w32_unlink(const char *)
Definition: win32.c:7650
struct tm * localtime_r(const time_t *, struct tm *)
Definition: win32.c:7902
int rb_w32_uchown(const char *, int, int)
Definition: win32.c:4800
struct servent *WSAAPI rb_w32_getservbyname(const char *, const char *)
Definition: win32.c:3936
int rb_w32_ulink(const char *, const char *)
Definition: win32.c:4941
rb_pid_t rb_w32_aspawn(int, const char *, char *const *)
Definition: win32.c:1593
int rb_w32_uutime(const char *, const struct utimbuf *)
Definition: win32.c:7415
int WSAAPI rb_w32_recv(int, char *, int, int)
Definition: win32.c:3585
int WSAAPI rb_w32_send(int, const char *, int, int)
Definition: win32.c:3600
struct hostent *WSAAPI rb_w32_gethostbyname(const char *)
Definition: win32.c:3876
rb_pid_t rb_w32_aspawn_flags(int, const char *, char *const *, DWORD)
Definition: win32.c:1578
int WSAAPI rb_w32_bind(int, const struct sockaddr *, int)
Definition: win32.c:3331
rb_uid_t geteuid(void)
Definition: win32.c:2802
int WSAAPI rb_w32_select(int, fd_set *, fd_set *, fd_set *, struct timeval *)
Definition: win32.c:3280
int sendmsg(int, const struct msghdr *, int)
Definition: win32.c:3706
int rb_w32_uaccess(const char *, int)
Definition: win32.c:5854
int WSAAPI rb_w32_ioctlsocket(int, long, u_long *)
Definition: win32.c:3428
const char *WSAAPI rb_w32_inet_ntop(int, const void *, char *, size_t)
Definition: win32.c:7763
rb_pid_t rb_w32_uaspawn_flags(int, const char *, char *const *, DWORD)
Definition: win32.c:1586
ssize_t rb_w32_read(int, void *, size_t)
Definition: win32.c:7021
int WSAAPI rb_w32_listen(int, int)
Definition: win32.c:3443
int rb_w32_fdisset(int, fd_set *)
Definition: win32.c:2875
int rb_w32_wrap_io_handle(HANDLE, int)
Definition: win32.c:7926
int WSAAPI rb_w32_shutdown(int, int)
Definition: win32.c:3770
void rb_w32_fdset(int, fd_set *)
Definition: win32.c:2848
int WSAAPI rb_w32_socket(int, int, int)
Definition: win32.c:3835
int rb_w32_dup2(int, int)
Definition: win32.c:6164
int clockid_t
Definition: win32.h:132
int kill(int, int)
Definition: win32.c:4819
int WSAAPI rb_w32_connect(int, const struct sockaddr *, int)
Definition: win32.c:3347
int rb_w32_mkdir(const char *, int)
Definition: win32.c:7543
char ** rb_w32_get_environ(void)
Definition: win32.c:6070
unsigned int uintptr_t
Definition: win32.h:106
int rb_w32_stati128(const char *, struct stati128 *)
Definition: win32.c:5792
int rb_w32_uutimensat(int, const char *, const struct timespec *, int)
Definition: win32.c:7467
int rb_w32_open(const char *, int,...)
Definition: win32.c:6211
char * rb_w32_getcwd(char *, int)
Definition: win32.c:4761
char * rb_w32_strerror(int)
Definition: win32.c:2736
int rb_w32_urmdir(const char *)
Definition: win32.c:7592
void rb_w32_sysinit(int *, char ***)
Definition: win32.c:877
int rb_w32_fstat(int, struct stat *)
Definition: win32.c:5428
ssize_t rb_w32_wreadlink(const WCHAR *, WCHAR *, size_t)
rb_pid_t rb_w32_getppid(void)
Definition: win32.c:6125
int rb_w32_usymlink(const char *src, const char *link)
Definition: win32.c:5205
int rb_w32_stat(const char *, struct stat *)
Definition: win32.c:5717
int flock(int fd, int oper)
Definition: flock.c:125
int rb_w32_io_cancelable_p(int)
Definition: win32.c:2632
int rb_w32_uunlink(const char *)
Definition: win32.c:7636
rb_pid_t rb_w32_getpid(void)
Definition: win32.c:6117
int rb_w32_fstati128(int, struct stati128 *)
Definition: win32.c:5445
int link(const char *, const char *)
Definition: win32.c:4961
int clock_gettime(clockid_t, struct timespec *)
Definition: win32.c:4642
int WSAAPI rb_w32_getsockopt(int, int, int, char *, int *)
Definition: win32.c:3413
int fcntl(int, int,...)
Definition: win32.c:4312
int WSAAPI rb_w32_setsockopt(int, int, int, const char *, int)
Definition: win32.c:3755
ssize_t rb_w32_write(int, const void *, size_t)
Definition: win32.c:7160
rb_gid_t getegid(void)
Definition: win32.c:2816
void freeifaddrs(struct ifaddrs *)
Definition: win32.c:4206
int rb_w32_lstati128(const char *, struct stati128 *)
Definition: win32.c:5820
int WSAAPI rb_w32_inet_pton(int, const char *, void *)
Definition: win32.c:7782
int rb_w32_utruncate(const char *path, off_t length)
Definition: win32.c:5920
uintptr_t(* asynchronous_func_t)(uintptr_t self, int argc, uintptr_t *argv)
Definition: win32.h:777
int socketpair(int, int, int, int *)
Definition: win32.c:4052
char * rb_w32_getenv(const char *)
Definition: win32.c:5267
char * rb_w32_ugetenv(const char *)
Definition: win32.c:5260
int rb_w32_set_nonblock(int)
Definition: win32.c:4420
int WSAAPI rb_w32_getpeername(int, struct sockaddr *, int *)
Definition: win32.c:3368
int getifaddrs(struct ifaddrs **)
Definition: win32.c:4119
int clock_getres(clockid_t, struct timespec *)
Definition: win32.c:4682
int chown(const char *, int, int)
Definition: win32.c:4793
int rb_w32_time_subtract(struct timeval *rest, const struct timeval *wait)
Definition: win32.c:3104
struct tm * gmtime_r(const time_t *, struct tm *)
Definition: win32.c:7878
int WINAPI rb_w32_Sleep(unsigned long msec)
struct servent *WSAAPI rb_w32_getservbyport(int, const char *)
Definition: win32.c:3951
int rb_w32_umkdir(const char *, int)
Definition: win32.c:7529
int rb_w32_times(struct tms *)
Definition: win32.c:5956
rb_pid_t rb_w32_uspawn(int, const char *, const char *)
Definition: win32.c:1498
struct protoent *WSAAPI rb_w32_getprotobyname(const char *)
Definition: win32.c:3906
int rb_w32_urename(const char *, const char *)
Definition: win32.c:5344
int rb_w32_utimes(const char *, const struct timeval *)
Definition: win32.c:7454
int rb_w32_uopen(const char *, int,...)
Definition: win32.c:6177
int ioctl(int, int,...)
Definition: win32.c:2841
off_t rb_w32_lseek(int, off_t, int)
Definition: win32.c:5827
int rb_w32_utime(const char *, const struct utimbuf *)
Definition: win32.c:7428
int WSAAPI rb_w32_recvfrom(int, char *, int, int, struct sockaddr *, int *)
Definition: win32.c:3592
rb_pid_t rb_w32_spawn(int, const char *, const char *)
Definition: win32.c:1490
int rb_w32_isatty(int)
Definition: win32.c:7719
int WSAAPI rb_w32_getsockname(int, struct sockaddr *, int *)
Definition: win32.c:3383
uintptr_t rb_w32_asynchronize(asynchronous_func_t func, uintptr_t self, int argc, uintptr_t *argv, uintptr_t intrval)
Definition: win32.c:6007
rb_pid_t rb_w32_uaspawn(int, const char *, char *const *)
Definition: win32.c:1600
int rb_w32_wopen(const WCHAR *, int,...)
Definition: win32.c:6231
rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *, int *)
int rb_w32_pipe(int[2])
Definition: win32.c:6442
int rb_w32_rmdir(const char *)
Definition: win32.c:7578
rb_gid_t getgid(void)
Definition: win32.c:2809
struct hostent *WSAAPI rb_w32_gethostbyaddr(const char *, int, int)
Definition: win32.c:3861
DWORD rb_w32_osver(void)
Definition: win32.c:319
IUnknown DWORD
Definition: win32ole.c:33