4#if defined(__cplusplus)
11RUBY_SYMBOL_EXPORT_BEGIN
27#if defined(__cplusplus) && defined(_MSC_VER)
30#if !defined(_WIN64) && !defined(WIN32)
33#if defined(_MSC_VER) && _MSC_VER <= 1200
39#if !defined(_MSC_VER) || _MSC_VER >= 1400
42#if defined(__cplusplus) && defined(_MSC_VER)
62#if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER == 1200
66#if defined(__cplusplus) && defined(_MSC_VER) && _MSC_VER == 1200
72#ifdef HAVE_SYS_UTIME_H
73# include <sys/utime.h>
79#if defined __MINGW32__
82# if !defined(_INTPTR_T_DEFINED)
84typedef __int64 intptr_t;
88# define _INTPTR_T_DEFINED
90# if !defined(INTPTR_MAX)
92# define INTPTR_MAX 9223372036854775807I64
94# define INTPTR_MAX 2147483647
96# define INTPTR_MIN (-INTPTR_MAX-1)
98# if !defined(_UINTPTR_T_DEFINED)
100typedef unsigned __int64 uintptr_t;
102typedef unsigned int uintptr_t;
104# define _UINTPTR_T_DEFINED
106# if !defined(UINTPTR_MAX)
108# define UINTPTR_MAX 18446744073709551615UI64
110# define UINTPTR_MAX 4294967295U
121#define rb_w32_iswinnt() TRUE
122#define rb_w32_iswin95() FALSE
126#define O_SHARE_DELETE 0x20000000
128typedef int clockid_t;
129#if defined(__MINGW32__)
131#undef CLOCK_PROCESS_CPUTIME_ID
132#undef CLOCK_THREAD_CPUTIME_ID
133#undef CLOCK_REALTIME_COARSE
137#if !defined(__MINGW32__) || !defined(HAVE_CLOCK_GETTIME)
138# define HAVE_CLOCK_GETTIME 1
139# define NEED_CLOCK_GETTIME 1
141#if !defined(__MINGW32__) || !defined(HAVE_CLOCK_GETRES)
142# define HAVE_CLOCK_GETRES 1
143# define NEED_CLOCK_GETRES 1
145#ifndef CLOCK_REALTIME
146# define CLOCK_REALTIME 0
148#ifndef CLOCK_MONOTONIC
149# define CLOCK_MONOTONIC 1
157#define utime(_p, _t) rb_w32_uutime(_p, _t)
160#define utimes(_p, _t) rb_w32_uutimes(_p, _t)
162#define HAVE_UTIMENSAT 1
164#define utimensat(_d, _p, _t, _f) rb_w32_uutimensat(_d, _p, _t, _f)
165#define lseek(_f, _o, _w) rb_w32_lseek(_f, _o, _w)
167#define pipe(p) rb_w32_pipe(p)
168#define open rb_w32_uopen
169#define close(h) rb_w32_close(h)
170#define fclose(f) rb_w32_fclose(f)
171#define read(f, b, s) rb_w32_read(f, b, s)
172#define write(f, b, s) rb_w32_write(f, b, s)
173#define pread(f, b, s, o) rb_w32_pread(f, b, s, o)
174#define pwrite(f, b, s, o) rb_w32_pwrite(f, b, s, o)
175#define getpid() rb_w32_getpid()
177#define HAVE_GETPPID 1
178#define getppid() rb_w32_getppid()
179#define sleep(x) rb_w32_Sleep((x)*1000)
180#define Sleep(msec) (void)rb_w32_Sleep(msec)
185#define execv(path,argv) rb_w32_uaspawn(P_OVERLAY,path,argv)
187#define isatty(h) rb_w32_isatty(h)
190#define mkdir(p, m) rb_w32_umkdir(p, m)
192#define rmdir(p) rb_w32_urmdir(p)
194#define unlink(p) rb_w32_uunlink(p)
200 unsigned __int64 st_ino;
202 unsigned short st_mode;
217#undef SIZEOF_STRUCT_STAT_ST_INO
218#define SIZEOF_STRUCT_STAT_ST_INO sizeof(unsigned __int64)
219#define HAVE_STRUCT_STAT_ST_INOHIGH
220#define HAVE_STRUCT_STAT_ST_ATIMENSEC
221#define HAVE_STRUCT_STAT_ST_MTIMENSEC
222#define HAVE_STRUCT_STAT_ST_CTIMENSEC
223#define fstat(fd,st) rb_w32_fstati128(fd,st)
224#define stati128(path, st) rb_w32_ustati128(path,st)
225#define lstat(path,st) rb_w32_ulstati128(path,st)
226#define access(path,mode) rb_w32_uaccess(path,mode)
228#define strcasecmp _stricmp
229#define strncasecmp _strnicmp
236#define isascii __isascii
246 struct iovec *msg_iov;
258 struct sockaddr *ifa_addr;
259 struct sockaddr *ifa_netmask;
260 struct sockaddr *ifa_broadaddr;
261 struct sockaddr *ifa_dstaddr;
265#define IFNAMSIZ IF_NAMESIZE
269#ifdef IFF_POINTTOPOINT
270#define IFF_POINTOPOINT IFF_POINTTOPOINT
273extern void rb_w32_sysinit(
int *,
char ***);
274extern DWORD rb_w32_osid(
void);
275extern int flock(
int fd,
int oper);
276extern int rb_w32_io_cancelable_p(
int);
277extern int rb_w32_is_socket(
int);
278extern int WSAAPI rb_w32_accept(
int,
struct sockaddr *,
int *);
279extern int WSAAPI rb_w32_bind(
int,
const struct sockaddr *,
int);
280extern int WSAAPI rb_w32_connect(
int,
const struct sockaddr *,
int);
281extern void rb_w32_fdset(
int, fd_set*);
282extern void rb_w32_fdclr(
int, fd_set*);
283extern int rb_w32_fdisset(
int, fd_set*);
284extern int WSAAPI rb_w32_select(
int, fd_set *, fd_set *, fd_set *,
struct timeval *);
285extern int WSAAPI rb_w32_getpeername(
int,
struct sockaddr *,
int *);
286extern int WSAAPI rb_w32_getsockname(
int,
struct sockaddr *,
int *);
287extern int WSAAPI rb_w32_getsockopt(
int,
int,
int,
char *,
int *);
288extern int WSAAPI rb_w32_ioctlsocket(
int,
long, u_long *);
289extern int WSAAPI rb_w32_listen(
int,
int);
290extern int WSAAPI rb_w32_recv(
int,
char *,
int,
int);
291extern int WSAAPI rb_w32_recvfrom(
int,
char *,
int,
int,
struct sockaddr *,
int *);
292extern int WSAAPI rb_w32_send(
int,
const char *,
int,
int);
293extern int WSAAPI rb_w32_sendto(
int,
const char *,
int,
int,
const struct sockaddr *,
int);
294extern int recvmsg(
int,
struct msghdr *,
int);
295extern int sendmsg(
int,
const struct msghdr *,
int);
296extern int WSAAPI rb_w32_setsockopt(
int,
int,
int,
const char *,
int);
297extern int WSAAPI rb_w32_shutdown(
int,
int);
298extern int WSAAPI rb_w32_socket(
int,
int,
int);
299extern SOCKET rb_w32_get_osfhandle(
int);
300extern struct hostent *WSAAPI rb_w32_gethostbyaddr(
const char *,
int,
int);
301extern struct hostent *WSAAPI rb_w32_gethostbyname(
const char *);
302extern int WSAAPI rb_w32_gethostname(
char *,
int);
303extern struct protoent *WSAAPI rb_w32_getprotobyname(
const char *);
304extern struct protoent *WSAAPI rb_w32_getprotobynumber(
int);
305extern struct servent *WSAAPI rb_w32_getservbyname(
const char *,
const char *);
306extern struct servent *WSAAPI rb_w32_getservbyport(
int,
const char *);
307extern int socketpair(
int,
int,
int,
int *);
308extern int getifaddrs(
struct ifaddrs **);
309extern void freeifaddrs(
struct ifaddrs *);
310extern char * rb_w32_ugetcwd(
char *,
int);
311extern char * rb_w32_ugetenv(
const char *);
312extern int rb_w32_urename(
const char *,
const char *);
313extern char **rb_w32_get_environ(
void);
314extern void rb_w32_free_environ(
char **);
315extern int rb_w32_map_errno(DWORD);
316extern const char *WSAAPI rb_w32_inet_ntop(
int,
const void *,
char *,
size_t);
317extern int WSAAPI rb_w32_inet_pton(
int,
const char *,
void *);
318extern DWORD rb_w32_osver(
void);
320extern int rb_w32_uchown(
const char *,
int,
int);
321extern int rb_w32_ulink(
const char *,
const char *);
322extern ssize_t rb_w32_ureadlink(
const char *,
char *,
size_t);
323extern int rb_w32_usymlink(
const char *src,
const char *link);
325extern int clock_gettime(clockid_t,
struct timespec *);
326extern int clock_getres(clockid_t,
struct timespec *);
327extern rb_pid_t waitpid(rb_pid_t,
int *,
int);
328extern rb_pid_t wait(
int *);
329extern rb_pid_t rb_w32_uspawn(
int,
const char *,
const char*);
330extern rb_pid_t rb_w32_uaspawn(
int,
const char *,
char *
const *);
331extern rb_pid_t rb_w32_uaspawn_flags(
int,
const char *,
char *
const *, DWORD);
334extern int kill(rb_pid_t,
int);
335extern int fcntl(
int,
int, ...);
336extern int rb_w32_set_nonblock(
int);
337extern rb_pid_t rb_w32_getpid(
void);
338extern rb_pid_t rb_w32_getppid(
void);
339extern int rb_w32_isatty(
int);
340extern int rb_w32_uchdir(
const char *);
341extern int rb_w32_umkdir(
const char *,
int);
342extern int rb_w32_urmdir(
const char *);
343extern int rb_w32_uunlink(
const char *);
344extern int rb_w32_uchmod(
const char *,
int);
345extern int rb_w32_ustati128(
const char *,
struct stati128 *);
346extern int rb_w32_ulstati128(
const char *,
struct stati128 *);
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);
354#if defined _MSC_VER && _MSC_VER >= 1800 && defined INFINITY
356#pragma warning(disable:4756)
358rb_infinity_float(
void)
364#define INFINITY rb_infinity_float()
367#if !defined __MINGW32__ || defined __NO_ISOCEXT
369#define copysign(a, b) _copysign(a, b)
372scalb(
double a,
long b)
378#if !defined S_IFIFO && defined _S_IFIFO
379#define S_IFIFO _S_IFIFO
382#if !defined S_IRUSR && !defined __MINGW32__
392#if !defined S_IWUSR && !defined __MINGW32__
402#if !defined S_IXUSR && !defined __MINGW32__
412#define S_IFLNK 0xa000
413#define S_IFSOCK 0xc000
421extern int rb_w32_ftruncate(
int fd, rb_off_t length);
422extern int rb_w32_truncate(
const char *path, rb_off_t length);
423extern int rb_w32_utruncate(
const char *path, rb_off_t length);
426#define HAVE_FTRUNCATE 1
427#if defined HAVE_FTRUNCATE64
428#define ftruncate ftruncate64
430#define ftruncate rb_w32_ftruncate
434#define HAVE_TRUNCATE 1
435#define truncate rb_w32_utruncate
437#if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1800
438#define strtoll _strtoi64
439#define strtoull _strtoui64
445extern int ioctl (
int,
int, ...);
446extern rb_uid_t getuid (
void);
447extern rb_uid_t geteuid (
void);
448extern rb_gid_t getgid (
void);
449extern rb_gid_t getegid (
void);
450extern int setuid (rb_uid_t);
451extern int setgid (rb_gid_t);
453extern char *rb_w32_strerror(
int);
456#define strerror(e) rb_w32_strerror(e)
482# define EWOULDBLOCK WSAEWOULDBLOCK
485# define EINPROGRESS WSAEINPROGRESS
488# define EALREADY WSAEALREADY
491# define ENOTSOCK WSAENOTSOCK
494# define EDESTADDRREQ WSAEDESTADDRREQ
497# define EMSGSIZE WSAEMSGSIZE
500# define EPROTOTYPE WSAEPROTOTYPE
503# define ENOPROTOOPT WSAENOPROTOOPT
505#ifndef EPROTONOSUPPORT
506# define EPROTONOSUPPORT WSAEPROTONOSUPPORT
508#ifndef ESOCKTNOSUPPORT
509# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
512# define EOPNOTSUPP WSAEOPNOTSUPP
515# define EPFNOSUPPORT WSAEPFNOSUPPORT
518# define EAFNOSUPPORT WSAEAFNOSUPPORT
521# define EADDRINUSE WSAEADDRINUSE
524# define EADDRNOTAVAIL WSAEADDRNOTAVAIL
527# define ENETDOWN WSAENETDOWN
530# define ENETUNREACH WSAENETUNREACH
533# define ENETRESET WSAENETRESET
536# define ECONNABORTED WSAECONNABORTED
539# define ECONNRESET WSAECONNRESET
542# define ENOBUFS WSAENOBUFS
545# define EISCONN WSAEISCONN
548# define ENOTCONN WSAENOTCONN
551# define ESHUTDOWN WSAESHUTDOWN
554# define ETOOMANYREFS WSAETOOMANYREFS
557# define ETIMEDOUT WSAETIMEDOUT
560# define ECONNREFUSED WSAECONNREFUSED
563# define ELOOP WSAELOOP
567# define EHOSTDOWN WSAEHOSTDOWN
570# define EHOSTUNREACH WSAEHOSTUNREACH
574# define EPROCLIM WSAEPROCLIM
577# define EUSERS WSAEUSERS
580# define EDQUOT WSAEDQUOT
583# define ESTALE WSAESTALE
586# define EREMOTE WSAEREMOTE
596#define F_DUPFD_CLOEXEC 67
601#define FD_SET(fd, set) do {\
603 SOCKET s = _get_osfhandle(fd);\
605 for (i = 0; i < (set)->fd_count; i++) {\
606 if ((set)->fd_array[i] == s) {\
610 if (i == (set)->fd_count) {\
611 if ((set)->fd_count < FD_SETSIZE) {\
612 (set)->fd_array[i] = s;\
619#define FD_CLR(f, s) rb_w32_fdclr(f, s)
622#define FD_ISSET(f, s) rb_w32_fdisset(f, s)
626#define inet_ntop(f,a,n,l) rb_w32_inet_ntop(f,a,n,l)
629#define inet_pton(f,s,d) rb_w32_inet_pton(f,s,d)
632#define accept(s, a, l) rb_w32_accept(s, a, l)
635#define bind(s, a, l) rb_w32_bind(s, a, l)
638#define connect(s, a, l) rb_w32_connect(s, a, l)
641#define select(n, r, w, e, t) rb_w32_select(n, r, w, e, t)
644#define getpeername(s, a, l) rb_w32_getpeername(s, a, l)
647#define getsockname(s, a, l) rb_w32_getsockname(s, a, l)
650#define getsockopt(s, v, n, o, l) rb_w32_getsockopt(s, v, n, o, l)
653#define ioctlsocket(s, c, a) rb_w32_ioctlsocket(s, c, a)
656#define listen(s, b) rb_w32_listen(s, b)
659#define recv(s, b, l, f) rb_w32_recv(s, b, l, f)
662#define recvfrom(s, b, l, f, fr, frl) rb_w32_recvfrom(s, b, l, f, fr, frl)
665#define send(s, b, l, f) rb_w32_send(s, b, l, f)
668#define sendto(s, b, l, f, t, tl) rb_w32_sendto(s, b, l, f, t, tl)
671#define setsockopt(s, v, n, o, l) rb_w32_setsockopt(s, v, n, o, l)
674#define HAVE_SHUTDOWN 1
676#define shutdown(s, h) rb_w32_shutdown(s, h)
679#define socket(s, t, p) rb_w32_socket(s, t, p)
682#define gethostbyaddr(a, l, t) rb_w32_gethostbyaddr(a, l, t)
685#define gethostbyname(n) rb_w32_gethostbyname(n)
688#define gethostname(n, l) rb_w32_gethostname(n, l)
691#define getprotobyname(n) rb_w32_getprotobyname(n)
693#undef getprotobynumber
694#define getprotobynumber(n) rb_w32_getprotobynumber(n)
697#define getservbyname(n, p) rb_w32_getservbyname(n, p)
700#define getservbyport(p, pr) rb_w32_getservbyport(p, pr)
703#define get_osfhandle(h) rb_w32_get_osfhandle(h)
706#define getcwd(b, s) rb_w32_ugetcwd(b, s)
709#define getenv(n) rb_w32_ugetenv(n)
712#define rename(o, n) rb_w32_urename(o, n)
715#define times(t) rb_w32_times(t)
718#define dup2(o, n) rb_w32_dup2(o, n)
728int rb_w32_times(
struct tms *);
730struct tm *gmtime_r(
const time_t *,
struct tm *);
731struct tm *localtime_r(
const time_t *,
struct tm *);
734int rb_w32_sleep(
unsigned long msec);
735int rb_w32_uopen(
const char *,
int, ...);
736int rb_w32_wopen(
const WCHAR *,
int, ...);
737int rb_w32_close(
int);
738int rb_w32_fclose(
FILE*);
739int rb_w32_pipe(
int[2]);
740ssize_t rb_w32_read(
int,
void *,
size_t);
741ssize_t rb_w32_write(
int,
const void *,
size_t);
742ssize_t rb_w32_pread(
int,
void *,
size_t, rb_off_t offset);
743ssize_t rb_w32_pwrite(
int,
const void *,
size_t, rb_off_t offset);
744rb_off_t rb_w32_lseek(
int, rb_off_t,
int);
745int rb_w32_uutime(
const char *,
const struct utimbuf *);
746int rb_w32_uutimes(
const char *,
const struct timeval *);
747int rb_w32_uutimensat(
int ,
const char *,
const struct timespec *,
int );
748long rb_w32_write_console(uintptr_t,
int);
749int WINAPI rb_w32_Sleep(
unsigned long msec);
750int rb_w32_wait_events_blocking(HANDLE *events,
int num, DWORD timeout);
751int rb_w32_time_subtract(
struct timeval *rest,
const struct timeval *wait);
752int rb_w32_wrap_io_handle(HANDLE,
int);
753int rb_w32_unwrap_io_handle(
int);
754WCHAR *rb_w32_mbstr_to_wstr(UINT,
const char *,
int,
long *);
755char *rb_w32_wstr_to_mbstr(UINT,
const WCHAR *,
int,
long *);
757DEPRECATED_BY(rb_w32_ugetcwd,
char *rb_w32_getcwd(
char *,
int));
758DEPRECATED_BY(rb_w32_ugetenv,
char *rb_w32_getenv(
const char *));
759DEPRECATED_BY(rb_w32_urename,
int rb_w32_rename(
const char *,
const char *));
760DEPRECATED_BY(rb_w32_uopen,
int rb_w32_open(
const char *,
int, ...));
761DEPRECATED_BY(rb_w32_uchown,
int chown(
const char *,
int,
int));
762DEPRECATED_BY(rb_w32_ulink,
int link(
const char *,
const char *));
763DEPRECATED_BY(rb_w32_ureadlink, ssize_t readlink(
const char *,
char *,
size_t));
764DEPRECATED_BY(rb_w32_usymlink,
int symlink(
const char *src,
const char *link));
765DEPRECATED_BY(rb_w32_umkdir,
int rb_w32_mkdir(
const char *,
int));
766DEPRECATED_BY(rb_w32_urmdir,
int rb_w32_rmdir(
const char *));
767DEPRECATED_BY(rb_w32_uunlink,
int rb_w32_unlink(
const char *));
768DEPRECATED_BY(rb_w32_uutime,
int rb_w32_utime(
const char *,
const struct utimbuf *));
769DEPRECATED_BY(rb_w32_uutimes,
int rb_w32_utimes(
const char *,
const struct timeval *));
770DEPRECATED_BY(rb_w32_uutimensat,
int rb_w32_utimensat(
int,
const char *,
const struct timespec *,
int));
771DEPRECATED_BY(rb_w32_ustati128,
int rb_w32_stati128(
const char *,
struct stati128 *));
772DEPRECATED_BY(rb_w32_ulstati128,
int rb_w32_lstati128(
const char *,
struct stati128 *));
773DEPRECATED_BY(rb_w32_uaccess,
int rb_w32_access(
const char *,
int));
774DEPRECATED_BY(rb_w32_uspawn, rb_pid_t rb_w32_spawn(
int,
const char *,
const char*));
775DEPRECATED_BY(rb_w32_uaspawn, rb_pid_t rb_w32_aspawn(
int,
const char *,
char *
const *));
776DEPRECATED_BY(rb_w32_uaspawn_flags, rb_pid_t rb_w32_aspawn_flags(
int,
const char *,
char *
const *, DWORD));
785typedef uintptr_t (*asynchronous_func_t)(uintptr_t self,
int argc, uintptr_t* argv);
786uintptr_t rb_w32_asynchronize(asynchronous_func_t func, uintptr_t self,
int argc, uintptr_t* argv, uintptr_t intrval);
788RUBY_SYMBOL_EXPORT_END
790#if (defined(__MINGW64_VERSION_MAJOR) || defined(__MINGW64__)) && !defined(__cplusplus)
791#ifdef RUBY_MINGW64_BROKEN_FREXP_MODF
794#define frexp(_X, _Y) __extension__ ({\
795 int intpart_frexp_bug = intpart_frexp_bug;\
796 double result_frexp_bug = frexp((_X), &intpart_frexp_bug);\
797 *(_Y) = intpart_frexp_bug;\
801#define modf(_X, _Y) __extension__ ({\
802 double intpart_modf_bug = intpart_modf_bug;\
803 double result_modf_bug = modf((_X), &intpart_modf_bug);\
804 *(_Y) = intpart_modf_bug;\
809#if defined(__MINGW64__)
816rb_w32_pow(
double x,
double y)
818 return (
double)powl(x, y);
820#elif defined(__MINGW64_VERSION_MAJOR)
821double rb_w32_pow(
double x,
double y);
823#define pow rb_w32_pow
827#define MAP_FAILED ((void *)-1)
829#define PROT_READ 0x01
830#define PROT_WRITE 0x02
831#define PROT_EXEC 0x04
833#define MAP_PRIVATE 0x0002
834#define MAP_ANON 0x1000
835#define MAP_ANONYMOUS MAP_ANON
837extern void *rb_w32_mmap(
void *,
size_t,
int,
int,
int, rb_off_t);
838extern int rb_w32_munmap(
void *,
size_t);
839extern int rb_w32_mprotect(
void *,
size_t,
int);
841#define mmap(a, l, p, f, d, o) rb_w32_mmap(a, l, p, f, d, o)
842#define munmap(a, l) rb_w32_munmap(a, l)
843#define mprotect(a, l, prot) rb_w32_mprotect(a, l, prot)
845#if defined(__cplusplus)