4#if defined(__cplusplus)
11RUBY_SYMBOL_EXPORT_BEGIN
27#if defined(__cplusplus) && defined(_MSC_VER)
30#if !defined(_WIN64) && !defined(WIN32)
37#if defined(__cplusplus) && defined(_MSC_VER)
61#ifdef HAVE_SYS_UTIME_H
62# include <sys/utime.h>
76#define rb_w32_iswinnt() TRUE
77#define rb_w32_iswin95() FALSE
81#define O_SHARE_DELETE 0x20000000
90#define clock_gettime rb_w32_clock_gettime
91#define clock_getres rb_w32_clock_getres
94# define CLOCK_REALTIME 0
96#ifndef CLOCK_MONOTONIC
97# define CLOCK_MONOTONIC 1
99#ifndef CLOCK_PROCESS_CPUTIME_ID
100# define CLOCK_PROCESS_CPUTIME_ID 2
102#ifndef CLOCK_THREAD_CPUTIME_ID
103# define CLOCK_THREAD_CPUTIME_ID 3
105#ifndef CLOCK_REALTIME_COARSE
106# define CLOCK_REALTIME_COARSE 4
114#define utime(_p, _t) rb_w32_uutime(_p, _t)
117#define utimes(_p, _t) rb_w32_uutimes(_p, _t)
119#define HAVE_UTIMENSAT 1
121#define utimensat(_d, _p, _t, _f) rb_w32_uutimensat(_d, _p, _t, _f)
122#define lseek(_f, _o, _w) rb_w32_lseek(_f, _o, _w)
124#define pipe(p) rb_w32_pipe(p)
125#define open rb_w32_uopen
126#define close(h) rb_w32_close(h)
127#define fclose(f) rb_w32_fclose(f)
128#define read(f, b, s) rb_w32_read(f, b, s)
129#define write(f, b, s) rb_w32_write(f, b, s)
130#define pread(f, b, s, o) rb_w32_pread(f, b, s, o)
131#define pwrite(f, b, s, o) rb_w32_pwrite(f, b, s, o)
132#define getpid() rb_w32_getpid()
134#define HAVE_GETPPID 1
135#define getppid() rb_w32_getppid()
136#define sleep(x) rb_w32_Sleep((x)*1000)
137#define Sleep(msec) (void)rb_w32_Sleep(msec)
142#define execv(path,argv) rb_w32_uaspawn(P_OVERLAY,path,argv)
144#define isatty(h) rb_w32_isatty(h)
147#define mkdir(p, m) rb_w32_umkdir(p, m)
149#define rmdir(p) rb_w32_urmdir(p)
151#define unlink(p) rb_w32_uunlink(p)
157 unsigned __int64 st_ino;
159 unsigned short st_mode;
174#undef SIZEOF_STRUCT_STAT_ST_INO
175#define SIZEOF_STRUCT_STAT_ST_INO sizeof(unsigned __int64)
176#define HAVE_STRUCT_STAT_ST_INOHIGH
177#define HAVE_STRUCT_STAT_ST_ATIMENSEC
178#define HAVE_STRUCT_STAT_ST_MTIMENSEC
179#define HAVE_STRUCT_STAT_ST_CTIMENSEC
180#define fstat(fd,st) rb_w32_fstati128(fd,st)
181#define stati128(path, st) rb_w32_ustati128(path,st)
182#define lstat(path,st) rb_w32_ulstati128(path,st)
183#define access(path,mode) rb_w32_uaccess(path,mode)
185#define strcasecmp _stricmp
186#define strncasecmp _strnicmp
193#define isascii __isascii
203 struct iovec *msg_iov;
215 struct sockaddr *ifa_addr;
216 struct sockaddr *ifa_netmask;
217 struct sockaddr *ifa_broadaddr;
218 struct sockaddr *ifa_dstaddr;
222#define IFNAMSIZ IF_NAMESIZE
226#ifdef IFF_POINTTOPOINT
227#define IFF_POINTOPOINT IFF_POINTTOPOINT
230extern void rb_w32_sysinit(
int *,
char ***);
231extern int flock(
int fd,
int oper);
232extern int rb_w32_io_cancelable_p(
int);
233extern int rb_w32_is_socket(
int);
234extern int WSAAPI rb_w32_accept(
int,
struct sockaddr *,
int *);
235extern int WSAAPI rb_w32_bind(
int,
const struct sockaddr *,
int);
236extern int WSAAPI rb_w32_connect(
int,
const struct sockaddr *,
int);
237extern void rb_w32_fdset(
int, fd_set*);
238extern void rb_w32_fdclr(
int, fd_set*);
239extern int rb_w32_fdisset(
int, fd_set*);
240extern int WSAAPI rb_w32_select(
int, fd_set *, fd_set *, fd_set *,
struct timeval *);
241extern int WSAAPI rb_w32_getpeername(
int,
struct sockaddr *,
int *);
242extern int WSAAPI rb_w32_getsockname(
int,
struct sockaddr *,
int *);
243extern int WSAAPI rb_w32_getsockopt(
int,
int,
int,
char *,
int *);
244extern int WSAAPI rb_w32_ioctlsocket(
int,
long, u_long *);
245extern int WSAAPI rb_w32_listen(
int,
int);
246extern int WSAAPI rb_w32_recv(
int,
char *,
int,
int);
247extern int WSAAPI rb_w32_recvfrom(
int,
char *,
int,
int,
struct sockaddr *,
int *);
248extern int WSAAPI rb_w32_send(
int,
const char *,
int,
int);
249extern int WSAAPI rb_w32_sendto(
int,
const char *,
int,
int,
const struct sockaddr *,
int);
250extern int recvmsg(
int,
struct msghdr *,
int);
251extern int sendmsg(
int,
const struct msghdr *,
int);
252extern int WSAAPI rb_w32_setsockopt(
int,
int,
int,
const char *,
int);
253extern int WSAAPI rb_w32_shutdown(
int,
int);
254extern int WSAAPI rb_w32_socket(
int,
int,
int);
255extern SOCKET rb_w32_get_osfhandle(
int);
256extern struct hostent *WSAAPI rb_w32_gethostbyaddr(
const char *,
int,
int);
257extern struct hostent *WSAAPI rb_w32_gethostbyname(
const char *);
258extern int WSAAPI rb_w32_gethostname(
char *,
int);
259extern struct protoent *WSAAPI rb_w32_getprotobyname(
const char *);
260extern struct protoent *WSAAPI rb_w32_getprotobynumber(
int);
261extern struct servent *WSAAPI rb_w32_getservbyname(
const char *,
const char *);
262extern struct servent *WSAAPI rb_w32_getservbyport(
int,
const char *);
263extern int socketpair(
int,
int,
int,
int *);
264extern int getifaddrs(
struct ifaddrs **);
265extern void freeifaddrs(
struct ifaddrs *);
266extern char * rb_w32_ugetcwd(
char *,
int);
267extern char * rb_w32_ugetenv(
const char *);
268extern int rb_w32_urename(
const char *,
const char *);
269extern char **rb_w32_get_environ(
void);
270extern void rb_w32_free_environ(
char **);
271extern int rb_w32_map_errno(DWORD);
272extern const char *WSAAPI rb_w32_inet_ntop(
int,
const void *,
char *,
size_t);
273extern int WSAAPI rb_w32_inet_pton(
int,
const char *,
void *);
276static inline DWORD rb_w32_osid(
void) {
return VER_PLATFORM_WIN32_NT;}
278extern DWORD rb_w32_osver(
void);
280extern
int rb_w32_uchown(const
char *,
int,
int);
281extern
int rb_w32_ulink(const
char *, const
char *);
282extern ssize_t rb_w32_ureadlink(const
char *,
char *,
size_t);
283extern
int rb_w32_usymlink(const
char *src, const
char *link);
285extern
int clock_gettime(clockid_t, struct
timespec *);
286extern
int clock_getres(clockid_t, struct
timespec *);
287extern rb_pid_t waitpid(rb_pid_t,
int *,
int);
288extern rb_pid_t wait(
int *);
289extern rb_pid_t rb_w32_uspawn(
int, const
char *, const
char*);
290extern rb_pid_t rb_w32_uaspawn(
int, const
char *,
char *const *);
291extern rb_pid_t rb_w32_uaspawn_flags(
int, const
char *,
char *const *, DWORD);
294extern int kill(rb_pid_t,
int);
295extern int fcntl(
int,
int, ...);
296extern int rb_w32_set_nonblock(
int);
297extern rb_pid_t rb_w32_getpid(
void);
298extern rb_pid_t rb_w32_getppid(
void);
299extern int rb_w32_isatty(
int);
300extern int rb_w32_uchdir(
const char *);
301extern int rb_w32_umkdir(
const char *,
int);
302extern int rb_w32_urmdir(
const char *);
303extern int rb_w32_uunlink(
const char *);
304extern int rb_w32_uchmod(
const char *,
int);
305extern int rb_w32_ustati128(
const char *,
struct stati128 *);
306extern int rb_w32_ulstati128(
const char *,
struct stati128 *);
307extern int rb_w32_uaccess(
const char *,
int);
308extern char rb_w32_fd_is_text(
int);
309extern int rb_w32_fstati128(
int,
struct stati128 *);
310extern int rb_w32_dup2(
int,
int);
314#if defined _MSC_VER && defined INFINITY
316#pragma warning(disable:4756)
318rb_infinity_float(
void)
324#define INFINITY rb_infinity_float()
327#if !defined __MINGW32__ || defined __NO_ISOCEXT
329#define copysign(a, b) _copysign(a, b)
332scalb(
double a,
long b)
338#if !defined S_IFIFO && defined _S_IFIFO
339#define S_IFIFO _S_IFIFO
342#if !defined S_IRUSR && !defined __MINGW32__
352#if !defined S_IWUSR && !defined __MINGW32__
362#if !defined S_IXUSR && !defined __MINGW32__
372#define S_IFLNK 0xa000
373#define S_IFSOCK 0xc000
381extern int rb_w32_ftruncate(
int fd, rb_off_t length);
382extern int rb_w32_truncate(
const char *path, rb_off_t length);
383extern int rb_w32_utruncate(
const char *path, rb_off_t length);
386#define HAVE_FTRUNCATE 1
387#if defined HAVE_FTRUNCATE64
388#define ftruncate ftruncate64
390#define ftruncate rb_w32_ftruncate
394#define HAVE_TRUNCATE 1
395#define truncate rb_w32_utruncate
400extern int ioctl (
int,
int, ...);
401extern rb_uid_t getuid (
void);
402extern rb_uid_t geteuid (
void);
403extern rb_gid_t getgid (
void);
404extern rb_gid_t getegid (
void);
405extern int setuid (rb_uid_t);
406extern int setgid (rb_gid_t);
408extern char *rb_w32_strerror(
int);
411#define strerror(e) rb_w32_strerror(e)
437# define EWOULDBLOCK WSAEWOULDBLOCK
440# define EINPROGRESS WSAEINPROGRESS
443# define EALREADY WSAEALREADY
446# define ENOTSOCK WSAENOTSOCK
449# define EDESTADDRREQ WSAEDESTADDRREQ
452# define EMSGSIZE WSAEMSGSIZE
455# define EPROTOTYPE WSAEPROTOTYPE
458# define ENOPROTOOPT WSAENOPROTOOPT
460#ifndef EPROTONOSUPPORT
461# define EPROTONOSUPPORT WSAEPROTONOSUPPORT
463#ifndef ESOCKTNOSUPPORT
464# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
467# define EOPNOTSUPP WSAEOPNOTSUPP
470# define EPFNOSUPPORT WSAEPFNOSUPPORT
473# define EAFNOSUPPORT WSAEAFNOSUPPORT
476# define EADDRINUSE WSAEADDRINUSE
479# define EADDRNOTAVAIL WSAEADDRNOTAVAIL
482# define ENETDOWN WSAENETDOWN
485# define ENETUNREACH WSAENETUNREACH
488# define ENETRESET WSAENETRESET
491# define ECONNABORTED WSAECONNABORTED
494# define ECONNRESET WSAECONNRESET
497# define ENOBUFS WSAENOBUFS
500# define EISCONN WSAEISCONN
503# define ENOTCONN WSAENOTCONN
506# define ESHUTDOWN WSAESHUTDOWN
509# define ETOOMANYREFS WSAETOOMANYREFS
512# define ETIMEDOUT WSAETIMEDOUT
515# define ECONNREFUSED WSAECONNREFUSED
518# define ELOOP WSAELOOP
522# define EHOSTDOWN WSAEHOSTDOWN
525# define EHOSTUNREACH WSAEHOSTUNREACH
529# define EPROCLIM WSAEPROCLIM
532# define EUSERS WSAEUSERS
535# define EDQUOT WSAEDQUOT
538# define ESTALE WSAESTALE
541# define EREMOTE WSAEREMOTE
551#define F_DUPFD_CLOEXEC 67
556#define FD_SET(fd, set) do {\
558 SOCKET s = _get_osfhandle(fd);\
560 for (i = 0; i < (set)->fd_count; i++) {\
561 if ((set)->fd_array[i] == s) {\
565 if (i == (set)->fd_count) {\
566 if ((set)->fd_count < FD_SETSIZE) {\
567 (set)->fd_array[i] = s;\
574#define FD_CLR(f, s) rb_w32_fdclr(f, s)
577#define FD_ISSET(f, s) rb_w32_fdisset(f, s)
581#define inet_ntop(f,a,n,l) rb_w32_inet_ntop(f,a,n,l)
584#define inet_pton(f,s,d) rb_w32_inet_pton(f,s,d)
587#define accept(s, a, l) rb_w32_accept(s, a, l)
590#define bind(s, a, l) rb_w32_bind(s, a, l)
593#define connect(s, a, l) rb_w32_connect(s, a, l)
596#define select(n, r, w, e, t) rb_w32_select(n, r, w, e, t)
599#define getpeername(s, a, l) rb_w32_getpeername(s, a, l)
602#define getsockname(s, a, l) rb_w32_getsockname(s, a, l)
605#define getsockopt(s, v, n, o, l) rb_w32_getsockopt(s, v, n, o, l)
608#define ioctlsocket(s, c, a) rb_w32_ioctlsocket(s, c, a)
611#define listen(s, b) rb_w32_listen(s, b)
614#define recv(s, b, l, f) rb_w32_recv(s, b, l, f)
617#define recvfrom(s, b, l, f, fr, frl) rb_w32_recvfrom(s, b, l, f, fr, frl)
620#define send(s, b, l, f) rb_w32_send(s, b, l, f)
623#define sendto(s, b, l, f, t, tl) rb_w32_sendto(s, b, l, f, t, tl)
626#define setsockopt(s, v, n, o, l) rb_w32_setsockopt(s, v, n, o, l)
629#define HAVE_SHUTDOWN 1
631#define shutdown(s, h) rb_w32_shutdown(s, h)
634#define socket(s, t, p) rb_w32_socket(s, t, p)
637#define gethostbyaddr(a, l, t) rb_w32_gethostbyaddr(a, l, t)
640#define gethostbyname(n) rb_w32_gethostbyname(n)
643#define gethostname(n, l) rb_w32_gethostname(n, l)
646#define getprotobyname(n) rb_w32_getprotobyname(n)
648#undef getprotobynumber
649#define getprotobynumber(n) rb_w32_getprotobynumber(n)
652#define getservbyname(n, p) rb_w32_getservbyname(n, p)
655#define getservbyport(p, pr) rb_w32_getservbyport(p, pr)
658#define get_osfhandle(h) rb_w32_get_osfhandle(h)
661#define getcwd(b, s) rb_w32_ugetcwd(b, s)
664#define getenv(n) rb_w32_ugetenv(n)
667#define rename(o, n) rb_w32_urename(o, n)
670#define times(t) rb_w32_times(t)
673#define dup2(o, n) rb_w32_dup2(o, n)
683int rb_w32_times(
struct tms *);
685struct tm *gmtime_r(
const time_t *,
struct tm *);
686struct tm *localtime_r(
const time_t *,
struct tm *);
689int rb_w32_sleep(
unsigned long msec);
690int rb_w32_uopen(
const char *,
int, ...);
691int rb_w32_wopen(
const WCHAR *,
int, ...);
692int rb_w32_close(
int);
693int rb_w32_fclose(
FILE*);
694int rb_w32_pipe(
int[2]);
695ssize_t rb_w32_read(
int,
void *,
size_t);
696ssize_t rb_w32_write(
int,
const void *,
size_t);
697ssize_t rb_w32_pread(
int,
void *,
size_t, rb_off_t offset);
698ssize_t rb_w32_pwrite(
int,
const void *,
size_t, rb_off_t offset);
699rb_off_t rb_w32_lseek(
int, rb_off_t,
int);
700int rb_w32_uutime(
const char *,
const struct utimbuf *);
701int rb_w32_uutimes(
const char *,
const struct timeval *);
702int rb_w32_uutimensat(
int ,
const char *,
const struct timespec *,
int );
703long rb_w32_write_console(uintptr_t,
int);
704int WINAPI rb_w32_Sleep(
unsigned long msec);
705int rb_w32_wait_events_blocking(HANDLE *events,
int num, DWORD timeout);
706int rb_w32_time_subtract(
struct timeval *rest,
const struct timeval *wait);
707int rb_w32_wrap_io_handle(HANDLE,
int);
708int rb_w32_unwrap_io_handle(
int);
709WCHAR *rb_w32_mbstr_to_wstr(UINT,
const char *,
int,
long *);
710char *rb_w32_wstr_to_mbstr(UINT,
const WCHAR *,
int,
long *);
712DEPRECATED_BY(rb_w32_ugetcwd,
char *rb_w32_getcwd(
char *,
int));
713DEPRECATED_BY(rb_w32_ugetenv,
char *rb_w32_getenv(
const char *));
714DEPRECATED_BY(rb_w32_urename,
int rb_w32_rename(
const char *,
const char *));
715DEPRECATED_BY(rb_w32_uopen,
int rb_w32_open(
const char *,
int, ...));
716DEPRECATED_BY(rb_w32_uchown,
int chown(
const char *,
int,
int));
717DEPRECATED_BY(rb_w32_ulink,
int link(
const char *,
const char *));
718DEPRECATED_BY(rb_w32_ureadlink, ssize_t readlink(
const char *,
char *,
size_t));
719DEPRECATED_BY(rb_w32_usymlink,
int symlink(
const char *src,
const char *link));
720DEPRECATED_BY(rb_w32_umkdir,
int rb_w32_mkdir(
const char *,
int));
721DEPRECATED_BY(rb_w32_urmdir,
int rb_w32_rmdir(
const char *));
722DEPRECATED_BY(rb_w32_uunlink,
int rb_w32_unlink(
const char *));
723DEPRECATED_BY(rb_w32_uutime,
int rb_w32_utime(
const char *,
const struct utimbuf *));
724DEPRECATED_BY(rb_w32_uutimes,
int rb_w32_utimes(
const char *,
const struct timeval *));
725DEPRECATED_BY(rb_w32_uutimensat,
int rb_w32_utimensat(
int,
const char *,
const struct timespec *,
int));
726DEPRECATED_BY(rb_w32_ustati128,
int rb_w32_stati128(
const char *,
struct stati128 *));
727DEPRECATED_BY(rb_w32_ulstati128,
int rb_w32_lstati128(
const char *,
struct stati128 *));
728DEPRECATED_BY(rb_w32_uaccess,
int rb_w32_access(
const char *,
int));
729DEPRECATED_BY(rb_w32_uspawn, rb_pid_t rb_w32_spawn(
int,
const char *,
const char*));
730DEPRECATED_BY(rb_w32_uaspawn, rb_pid_t rb_w32_aspawn(
int,
const char *,
char *
const *));
731DEPRECATED_BY(rb_w32_uaspawn_flags, rb_pid_t rb_w32_aspawn_flags(
int,
const char *,
char *
const *, DWORD));
740typedef uintptr_t (*asynchronous_func_t)(uintptr_t self,
int argc, uintptr_t* argv);
741uintptr_t rb_w32_asynchronize(asynchronous_func_t func, uintptr_t self,
int argc, uintptr_t* argv, uintptr_t intrval);
743RUBY_SYMBOL_EXPORT_END
745#if (defined(__MINGW64_VERSION_MAJOR) || defined(__MINGW64__)) && !defined(__cplusplus)
746#ifdef RUBY_MINGW64_BROKEN_FREXP_MODF
749#define frexp(_X, _Y) __extension__ ({\
750 int intpart_frexp_bug = intpart_frexp_bug;\
751 double result_frexp_bug = frexp((_X), &intpart_frexp_bug);\
752 *(_Y) = intpart_frexp_bug;\
756#define modf(_X, _Y) __extension__ ({\
757 double intpart_modf_bug = intpart_modf_bug;\
758 double result_modf_bug = modf((_X), &intpart_modf_bug);\
759 *(_Y) = intpart_modf_bug;\
764#if defined(__MINGW64__)
771rb_w32_pow(
double x,
double y)
773 return (
double)powl(x, y);
775#elif defined(__MINGW64_VERSION_MAJOR)
776double rb_w32_pow(
double x,
double y);
778#define pow rb_w32_pow
782#define MAP_FAILED ((void *)-1)
784#define PROT_READ 0x01
785#define PROT_WRITE 0x02
786#define PROT_EXEC 0x04
788#define MAP_PRIVATE 0x0002
789#define MAP_ANON 0x1000
790#define MAP_ANONYMOUS MAP_ANON
792extern void *rb_w32_mmap(
void *,
size_t,
int,
int,
int, rb_off_t);
793extern int rb_w32_munmap(
void *,
size_t);
794extern int rb_w32_mprotect(
void *,
size_t,
int);
796#define mmap(a, l, p, f, d, o) rb_w32_mmap(a, l, p, f, d, o)
797#define munmap(a, l) rb_w32_munmap(a, l)
798#define mprotect(a, l, prot) rb_w32_mprotect(a, l, prot)
800#if defined(__cplusplus)
#define RBIMPL_ATTR_DEPRECATED(msg)
Wraps (or simulates) [[deprecated]]