#ifndef _CDEV_PLATFORMS_H_ #define _CDEV_PLATFORMS_H_ #include #include #include #include #include #include #ifdef _WIN32 #include #ifndef CDEV_REACTOR_API // ********************************************************************* // * _CDEV_REACTOR_EXPORTS : // * This definition allows cdevReactor DLL components to be imported // * and exported by other applications and libraries. // ********************************************************************* #ifdef _CDEV_REACTOR_EXPORTS_ #define CDEV_REACTOR_API __declspec(dllexport) #else #define CDEV_REACTOR_API __declspec(dllimport) #endif #endif #ifndef GENERIC_SERVER_API // ********************************************************************* // * _GENERIC_SERVER_EXPORTS : // * This definition allows Generic Server DLL components to be imported // * and exported by other applications and libraries. // ********************************************************************* #ifdef _GENERIC_SERVER_EXPORTS_ #define GENERIC_SERVER_API __declspec(dllexport) #else #define GENERIC_SERVER_API __declspec(dllimport) #endif #endif #include #include #include #include #include #include #include #include typedef signed long ssize_t; #define MAXHOSTNAMELEN 128 #define EWOULDBLOCK WSAEWOULDBLOCK #define EINPROGRESS WSAEINPROGRESS #define EISCONN WSAEISCONN #define SELECT_PARM fd_set * #ifndef O_NONBLOCK #define O_NONBLOCK 1 #endif // ********************************************************************* // * SOCKOPT_SIZE_PARM : // * This is the datatype of the parameter that is sent to getsockopt, // * setsockopt, and getsockname. // ********************************************************************* typedef int SOCKOPT_SIZE_PARM; inline int GetSocketErrno ( void ) { return WSAGetLastError(); } inline int GetSelectErrno ( void ) { return WSAGetLastError(); } inline int InitializeNetwork ( void ) { WORD version_requested = MAKEWORD (2, 0); WSADATA wsa_data; return WSAStartup(version_requested, &wsa_data); } inline int TerminateNetwork ( void ) { return WSACleanup(); } inline char * ultoa ( unsigned long val ) { static char buf[64]; return _ultoa(val, buf, 10); } inline char * ltoa ( long val ) { static char buf[64]; return _ltoa(val, buf, 10); } inline int usleep ( unsigned int useconds ) { int retval = 0; if(useconds<100000) Sleep(useconds/1000); else retval = -1; return retval; } inline unsigned int sleep ( unsigned int seconds ) { Sleep(seconds*1000); return seconds; } // ********************************************************************* // * This version of pipe is provided because the file descriptors // * generated by the Windows NT version of pipe cannot be used with the // * select system call. // ********************************************************************* inline int pipe ( int fd[2] ) { int retval = 0; sockaddr_in addr[2]; hostent * hostptr; char hostname[MAXHOSTNAMELEN]; unsigned long ipAddr; unsigned long blockFlag = 1; gethostname(hostname, MAXHOSTNAMELEN); hostptr = ::gethostbyname(hostname); ipAddr = *(unsigned long *)hostptr->h_addr; for(int i=0; i<2; i++) { addr[i].sin_family = AF_INET; addr[i].sin_port = htons(0); *(unsigned long *)&addr[i].sin_addr = ipAddr; if((fd[i] = socket(PF_INET, SOCK_DGRAM,0))>0 && bind(fd[i], (sockaddr *)&addr[i], sizeof(addr[i]))==0) { int addrLen = sizeof(addr[i]); getsockname(fd[i], (sockaddr *)&addr[i], &addrLen); ioctlsocket(fd[i], FIONBIO, &blockFlag); } else fd[i] = -1; } if(fd[0]>0 && fd[1]>0) { ::connect(fd[0], (sockaddr *)&addr[1], sizeof(addr[1])); ::connect(fd[1], (sockaddr *)&addr[0], sizeof(addr[0])); } else { if(fd[0]>0) close(fd[0]); if(fd[1]>0) close(fd[1]); fd[0] = (fd[1] = (retval = -1)); } return retval; } inline int FileTimeToTimeVal ( FILETIME * tfile, struct timeval * tv ) { if(tfile && tv) { ULARGE_INTEGER _100ns = {tfile->dwLowDateTime, tfile->dwHighDateTime}; _100ns.QuadPart -= 0x19db1ded53e8000i64; tv->tv_sec = long (_100ns.QuadPart / (10000 * 1000)); tv->tv_usec = long ((_100ns.QuadPart % (10000 * 1000)) / 10); return 0; } return -1; } inline int gettimeofday (struct timeval *tv) { FILETIME tfile; GetSystemTimeAsFileTime(&tfile); return FileTimeToTimeVal(&tfile, tv); } inline int cdevSelect ( int size, fd_set * read_set, fd_set * write_set, fd_set * except_set, struct timeval * timeout ) { int result = select(size, read_set, write_set, except_set, timeout); if(result<0 && GetSelectErrno()==WSAEINVAL) { if(timeout) { unsigned long millisec = timeout->tv_sec*1000+timeout->tv_usec/1000; Sleep(millisec); } result = 0; } else if (result<0 && GetSelectErrno()==WSAEINPROGRESS) { result = 0; } return result; } #else #include #define CDEV_REACTOR_API #define GENERIC_SERVER_API #ifdef __VMS #ifdef _TGV_MULTINET // ***************************************************** // * Under TGV multinet and VMS, if you want sys/types.h // * you need to have types.h already pulled in because // * sys/types.h makes it look like types.h is loaded. // * Then when types.h does get loaded, it is ignored // * because it looks like it is already loaded -- // * Mr. Danial Van Olst // ***************************************************** #include // ***************************************************** // * Under TGV Multinet and VMS, the file sys/param.h // * does not define NOFILE (max number of open files // * per process). FD_SETSIZE seems to be the correct // * value for NOFILE. // * See Multinet's sys/types.h file for more info on // * FD_SETSIZE. - Daniel Van Olst // ***************************************************** #ifndef NOFILE #define NOFILE FD_SETSIZE #endif #endif #endif #ifdef SYSV #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined (__hpux) #include #endif #if defined (AIX) #include #endif #if defined(solaris) || defined(SunOS) #include extern "C" { int gethostname(char *name, int namelen); } #endif #ifdef _SELECT_USES_INT_ #define SELECT_PARM int * #else #define SELECT_PARM fd_set * #endif #ifndef min #define min(a,b) ((ab)?a:b) #endif // ********************************************************************* // * SOCKOPT_SIZE_PARM : // * This is the datatype of the parameter that is sent to getsockopt, // * setsockopt, and getsockname. // ********************************************************************* #if defined(AIX) || defined(__linux) typedef unsigned int SOCKOPT_SIZE_PARM; #else typedef int SOCKOPT_SIZE_PARM; #endif inline int GetSocketErrno ( void ) { return errno; } inline int GetSelectErrno ( void ) { return errno; } inline int InitializeNetwork ( void ) { return 0; } inline int TerminateNetwork ( void ) { return 0; } inline int gettimeofday (struct timeval * tv) { struct timezone tz; return ::gettimeofday(tv, &tz); } inline int cdevSelect (int nfds, fd_set *r, fd_set *w, fd_set *e, struct timeval *t) { return ::select(nfds, (SELECT_PARM)r, (SELECT_PARM)w, (SELECT_PARM)e, t); } #endif #endif /* _CDEV_PLATFORMS_H_ */