#ifndef RUBY_WIN32_H #define RUBY_WIN32_H /* * Copyright (c) 1993, Intergraph Corporation * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the perl README file. * */ // // Definitions for NT port of Perl // // // Ok now we can include the normal include files. // // #include conflict with varargs.h? // There is function-name conflitct, so we rename it #if !defined(IN) && !defined(FLOAT) #define OpenFile WINAPI_OpenFile #ifdef __BORLANDC__ #define USE_WINSOCK2 #endif #ifdef USE_WINSOCK2 #include #include #else #include #include #endif #undef OpenFile #endif #define NT 1 /* deprecated */ #ifdef _WIN32_WCE #undef CharNext #define CharNext CharNextA #endif // // We're not using Microsoft's "extensions" to C for // Structured Exception Handling (SEH) so we can nuke these // #undef try #undef except #undef finally #undef leave #if defined(__cplusplus) extern "C++" { #endif #include #include #include #include #include #include #include #include #include #include #if !defined(__BORLANDC__) # include #else # include #endif #include #include #if defined(__cplusplus) } #endif #ifdef _M_IX86 # define WIN95 1 #else # undef WIN95 #endif #ifdef WIN95 extern DWORD rb_w32_osid(void); #define rb_w32_iswinnt() (rb_w32_osid() == VER_PLATFORM_WIN32_NT) #define rb_w32_iswin95() (rb_w32_osid() == VER_PLATFORM_WIN32_WINDOWS) #else #define rb_w32_iswinnt() TRUE #define rb_w32_iswin95() FALSE #endif #define WNOHANG -1 #undef getc #undef putc #undef fgetc #undef fputc #undef getchar #undef putchar #undef fgetchar #undef fputchar #undef utime #define getc(_stream) rb_w32_getc(_stream) #define putc(_c, _stream) rb_w32_putc(_c, _stream) #define fgetc(_stream) getc(_stream) #define fputc(_c, _stream) putc(_c, _stream) #define getchar() rb_w32_getc(stdin) #define putchar(_c) rb_w32_putc(_c, stdout) #define fgetchar() getchar() #define fputchar(_c) putchar(_c) #define utime(_p, _t) rb_w32_utime(_p, _t) #define strcasecmp(s1, s2) stricmp(s1, s2) #define strncasecmp(s1, s2, n) strnicmp(s1, s2, n) #define close(h) rb_w32_close(h) #define fclose(f) rb_w32_fclose(f) #define read(f, b, s) rb_w32_read(f, b, s) #define write(f, b, s) rb_w32_write(f, b, s) #define getpid() rb_w32_getpid() #define sleep(x) rb_w32_sleep((x)*1000) #ifdef __BORLANDC__ #define creat(p, m) _creat(p, m) #define eof() _eof() #define filelength(h) _filelength(h) #define mktemp(t) _mktemp(t) #define tell(h) _tell(h) #define unlink(p) _unlink(p) #define _open _sopen #define sopen _sopen #undef fopen #define fopen(p, m) rb_w32_fopen(p, m) #undef fdopen #define fdopen(h, m) rb_w32_fdopen(h, m) #undef fsopen #define fsopen(p, m, sh) rb_w32_fsopen(p, m, sh) #endif #define fsync(h) _commit(h) #undef stat #define stat(path,st) rb_w32_stat(path,st) #undef execv #define execv(path,argv) do_aspawn(P_OVERLAY,path,argv) #if !defined(__BORLANDC__) && !defined(_WIN32_WCE) #undef isatty #define isatty(h) rb_w32_isatty(h) #endif #undef mkdir #define mkdir(p, m) rb_w32_mkdir(p, m) #undef rmdir #define rmdir(p) rb_w32_rmdir(p) #undef unlink #define unlink(p) rb_w32_unlink(p) #ifdef __MINGW32__ struct timezone { int tz_minuteswest; int tz_dsttime; }; #undef isascii #define isascii __isascii #endif extern void NtInitialize(int *, char ***); extern int rb_w32_cmdvector(const char *, char ***); extern rb_pid_t pipe_exec(char *, int, FILE **, FILE **); extern int flock(int fd, int oper); extern int rb_w32_accept(int, struct sockaddr *, int *); extern int rb_w32_bind(int, struct sockaddr *, int); extern int rb_w32_connect(int, struct sockaddr *, int); extern void rb_w32_fdset(int, fd_set*); extern void rb_w32_fdclr(int, fd_set*); extern int rb_w32_fdisset(int, fd_set*); extern long rb_w32_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); extern int rb_w32_getpeername(int, struct sockaddr *, int *); extern int rb_w32_getsockname(int, struct sockaddr *, int *); extern int rb_w32_getsockopt(int, int, int, char *, int *); extern int rb_w32_ioctlsocket(int, long, u_long *); extern int rb_w32_listen(int, int); extern int rb_w32_recv(int, char *, int, int); extern int rb_w32_recvfrom(int, char *, int, int, struct sockaddr *, int *); extern int rb_w32_send(int, const char *, int, int); extern int rb_w32_sendto(int, const char *, int, int, struct sockaddr *, int); extern int rb_w32_setsockopt(int, int, int, char *, int); extern int rb_w32_shutdown(int, int); extern int rb_w32_socket(int, int, int); extern SOCKET rb_w32_get_osfhandle(int); extern struct hostent * rb_w32_gethostbyaddr(char *, int, int); extern struct hostent * rb_w32_gethostbyname(char *); extern int rb_w32_gethostname(char *, int); extern struct protoent * rb_w32_getprotobyname(char *); extern struct protoent * rb_w32_getprotobynumber(int); extern struct servent * rb_w32_getservbyname(char *, char *); extern struct servent * rb_w32_getservbyport(int, char *); extern char * rb_w32_getenv(const char *); extern int rb_w32_rename(const char *, const char *); extern int rb_w32_stat(const char *, struct stat *); extern char **rb_w32_get_environ(void); extern void rb_w32_free_environ(char **); #define vsnprintf(s,n,f,l) rb_w32_vsnprintf(s,n,f,l) #define snprintf rb_w32_snprintf extern int rb_w32_vsnprintf(char *, size_t, const char *, va_list); extern int rb_w32_snprintf(char *, size_t, const char *, ...); extern int chown(const char *, int, int); extern int link(char *, char *); extern int gettimeofday(struct timeval *, struct timezone *); extern rb_pid_t waitpid (rb_pid_t, int *, int); extern int do_spawn(int, char *); extern int do_aspawn(int, char *, char **); extern int kill(int, int); extern int fcntl(int, int, ...); extern rb_pid_t rb_w32_getpid(void); #if !defined(__BORLANDC__) && !defined(_WIN32_WCE) extern int rb_w32_isatty(int); #endif extern int rb_w32_mkdir(const char *, int); extern int rb_w32_rmdir(const char *); extern int rb_w32_unlink(const char*); #ifdef __BORLANDC__ extern FILE *rb_w32_fopen(const char *, const char *); extern FILE *rb_w32_fdopen(int, const char *); extern FILE *rb_w32_fsopen(const char *, const char *, int); #endif #include #if !defined __MINGW32__ || defined __NO_ISOCEXT #ifndef isnan #define isnan(x) _isnan(x) #endif #ifndef finite #define finite(x) _finite(x) #endif #ifndef copysign #define copysign(a, b) _copysign(a, b) #endif #ifndef scalb #define scalb(a, b) _scalb(a, b) #endif #endif #if !defined S_IFIFO && defined _S_IFIFO #define S_IFIFO _S_IFIFO #endif #ifdef __BORLANDC__ #undef S_ISDIR #undef S_ISFIFO #undef S_ISBLK #undef S_ISCHR #undef S_ISREG #define S_ISDIR(m) (((unsigned short)(m) & S_IFMT) == S_IFDIR) #define S_ISFIFO(m) (((unsigned short)(m) & S_IFMT) == S_IFIFO) #define S_ISBLK(m) (((unsigned short)(m) & S_IFMT) == S_IFBLK) #define S_ISCHR(m) (((unsigned short)(m) & S_IFMT) == S_IFCHR) #define S_ISREG(m) (((unsigned short)(m) & S_IFMT) == S_IFREG) #endif #if !defined S_IRUSR && !defined __MINGW32__ #define S_IRUSR 0400 #endif #ifndef S_IRGRP #define S_IRGRP 0040 #endif #ifndef S_IROTH #define S_IROTH 0004 #endif #if !defined S_IWUSR && !defined __MINGW32__ #define S_IWUSR 0200 #endif #ifndef S_IWGRP #define S_IWGRP 0020 #endif #ifndef S_IWOTH #define S_IWOTH 0002 #endif #if !defined S_IXUSR && !defined __MINGW32__ #define S_IXUSR 0100 #endif #ifndef S_IXGRP #define S_IXGRP 0010 #endif #ifndef S_IXOTH #define S_IXOTH 0001 #endif // // define this so we can do inplace editing // #define SUFFIX // // stubs // #if !defined(__BORLANDC__) extern int ioctl (int, unsigned int, long); #endif extern rb_uid_t getuid (void); extern rb_uid_t geteuid (void); extern rb_gid_t getgid (void); extern rb_gid_t getegid (void); extern int setuid (rb_uid_t); extern int setgid (rb_gid_t); extern char *rb_w32_strerror(int); #define strerror(e) rb_w32_strerror(e) #define PIPE_BUF 1024 #define LOCK_SH 1 #define LOCK_EX 2 #define LOCK_NB 4 #define LOCK_UN 8 #ifndef SIGINT #define SIGINT 2 #endif #ifndef SIGKILL #define SIGKILL 9 #endif /* #undef va_start */ /* #undef va_end */ /* winsock error map */ #define EWOULDBLOCK WSAEWOULDBLOCK #define EINPROGRESS WSAEINPROGRESS #define EALREADY WSAEALREADY #define ENOTSOCK WSAENOTSOCK #define EDESTADDRREQ WSAEDESTADDRREQ #define EMSGSIZE WSAEMSGSIZE #define EPROTOTYPE WSAEPROTOTYPE #define ENOPROTOOPT WSAENOPROTOOPT #define EPROTONOSUPPORT WSAEPROTONOSUPPORT #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT #define EOPNOTSUPP WSAEOPNOTSUPP #define EPFNOSUPPORT WSAEPFNOSUPPORT #define EAFNOSUPPORT WSAEAFNOSUPPORT #define EADDRINUSE WSAEADDRINUSE #define EADDRNOTAVAIL WSAEADDRNOTAVAIL #define ENETDOWN WSAENETDOWN #define ENETUNREACH WSAENETUNREACH #define ENETRESET WSAENETRESET #define ECONNABORTED WSAECONNABORTED #define ECONNRESET WSAECONNRESET #define ENOBUFS WSAENOBUFS #define EISCONN WSAEISCONN #define ENOTCONN WSAENOTCONN #define ESHUTDOWN WSAESHUTDOWN #define ETOOMANYREFS WSAETOOMANYREFS #define ETIMEDOUT WSAETIMEDOUT #define ECONNREFUSED WSAECONNREFUSED #define ELOOP WSAELOOP /*#define ENAMETOOLONG WSAENAMETOOLONG*/ #define EHOSTDOWN WSAEHOSTDOWN #define EHOSTUNREACH WSAEHOSTUNREACH /*#define ENOTEMPTY WSAENOTEMPTY*/ #define EPROCLIM WSAEPROCLIM #define EUSERS WSAEUSERS #define EDQUOT WSAEDQUOT #define ESTALE WSAESTALE #define EREMOTE WSAEREMOTE #define F_SETFL 1 #define O_NONBLOCK 1 #ifdef accept #undef accept #endif #define accept(s, a, l) rb_w32_accept(s, a, l) #ifdef bind #undef bind #endif #define bind(s, a, l) rb_w32_bind(s, a, l) #ifdef connect #undef connect #endif #define connect(s, a, l) rb_w32_connect(s, a, l) #undef FD_SET #define FD_SET(f, s) rb_w32_fdset(f, s) #undef FD_CLR #define FD_CLR(f, s) rb_w32_fdclr(f, s) #undef FD_ISSET #define FD_ISSET(f, s) rb_w32_fdisset(f, s) #undef select #define select(n, r, w, e, t) rb_w32_select(n, r, w, e, t) #ifdef getpeername #undef getpeername #endif #define getpeername(s, a, l) rb_w32_getpeername(s, a, l) #ifdef getsockname #undef getsockname #endif #define getsockname(s, a, l) rb_w32_getsockname(s, a, l) #ifdef getsockopt #undef getsockopt #endif #define getsockopt(s, v, n, o, l) rb_w32_getsockopt(s, v, n, o, l) #ifdef ioctlsocket #undef ioctlsocket #endif #define ioctlsocket(s, c, a) rb_w32_ioctlsocket(s, c, a) #ifdef listen #undef listen #endif #define listen(s, b) rb_w32_listen(s, b) #ifdef recv #undef recv #endif #define recv(s, b, l, f) rb_w32_recv(s, b, l, f) #ifdef recvfrom #undef recvfrom #endif #define recvfrom(s, b, l, f, fr, frl) rb_w32_recvfrom(s, b, l, f, fr, frl) #ifdef send #undef send #endif #define send(s, b, l, f) rb_w32_send(s, b, l, f) #ifdef sendto #undef sendto #endif #define sendto(s, b, l, f, t, tl) rb_w32_sendto(s, b, l, f, t, tl) #ifdef setsockopt #undef setsockopt #endif #define setsockopt(s, v, n, o, l) rb_w32_setsockopt(s, v, n, o, l) #ifdef shutdown #undef shutdown #endif #define shutdown(s, h) rb_w32_shutdown(s, h) #ifdef socket #undef socket #endif #define socket(s, t, p) rb_w32_socket(s, t, p) #ifdef gethostbyaddr #undef gethostbyaddr #endif #define gethostbyaddr(a, l, t) rb_w32_gethostbyaddr(a, l, t) #ifdef gethostbyname #undef gethostbyname #endif #define gethostbyname(n) rb_w32_gethostbyname(n) #ifdef gethostname #undef gethostname #endif #define gethostname(n, l) rb_w32_gethostname(n, l) #ifdef getprotobyname #undef getprotobyname #endif #define getprotobyname(n) rb_w32_getprotobyname(n) #ifdef getprotobynumber #undef getprotobynumber #endif #define getprotobynumber(n) rb_w32_getprotobynumber(n) #ifdef getservbyname #undef getservbyname #endif #define getservbyname(n, p) rb_w32_getservbyname(n, p) #ifdef getservbyport #undef getservbyport #endif #define getservbyport(p, pr) rb_w32_getservbyport(p, pr) #ifdef get_osfhandle #undef get_osfhandle #endif #define get_osfhandle(h) rb_w32_get_osfhandle(h) #ifdef getcwd #undef getcwd #endif #define getcwd(b, s) rb_w32_getcwd(b, s) #ifdef getenv #undef getenv #endif #define getenv(n) rb_w32_getenv(n) #ifdef rename #undef rename #endif #define rename(o, n) rb_w32_rename(o, n) struct tms { long tms_utime; long tms_stime; long tms_cutime; long tms_cstime; }; #ifdef times #undef times #endif #define times(t) rb_w32_times(t) int rb_w32_times(struct tms *); /* thread stuff */ HANDLE GetCurrentThreadHandle(void); void rb_w32_interrupted(void); int rb_w32_main_context(int arg, void (*handler)(int)); int rb_w32_sleep(unsigned long msec); void rb_w32_enter_critical(void); void rb_w32_leave_critical(void); int rb_w32_putc(int, FILE*); int rb_w32_getc(FILE*); int rb_w32_close(int); int rb_w32_fclose(FILE*); size_t rb_w32_read(int, void *, size_t); size_t rb_w32_write(int, const void *, size_t); int rb_w32_utime(const char *, struct utimbuf *); #define Sleep(msec) (void)rb_w32_sleep(msec) /* == ***CAUTION*** Since this function is very dangerous, ((*NEVER*)) * lock any HANDLEs(i.e. Mutex, Semaphore, CriticalSection and so on) or, * use anything like TRAP_BEG...TRAP_END block structure, in asynchronous_func_t. */ typedef DWORD (*asynchronous_func_t)(DWORD self, int argc, DWORD* argv); DWORD rb_w32_asynchronize(asynchronous_func_t func, DWORD self, int argc, DWORD* argv, DWORD intrval); #endif