#ifdef HAVE_CONFIG_H # include "config.h" #endif /* HAVE_CONFIG_H */ #include #include # include #ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN #endif #include #undef WIN32_LEAN_AND_MEAN #include "evil_private.h" LONGLONG _evil_time_freq; LONGLONG _evil_time_count; long _evil_time_second; long _evil_systemtime_to_time(SYSTEMTIME st); long _evil_systemtime_to_time(SYSTEMTIME st) { int days[] = { -1, 30, 58, 89, 119, 150, 180, 211, 242, 272, 303, 333, 364 }; int day; time_t t; st.wYear -= 1900; if ((st.wYear < 70) || (st.wYear > 138)) return -1; day = st.wDay + days[st.wMonth - 1]; if (!(st.wYear & 3) && (st.wMonth > 2) ) day++; t = ((st.wYear - 70) * 365 + ((st.wYear - 1) >> 2) - 17 + day) * 24 + st.wHour; t = (t * 60 + st.wMinute) * 60 + st.wSecond; return (long)t; } /* * Time related functions * */ double evil_time_get(void) { LARGE_INTEGER count; QueryPerformanceCounter(&count); return (double)_evil_time_second + (double)(count.QuadPart - _evil_time_count)/ (double)_evil_time_freq; } /* * Sockets and pipe related functions * */ int evil_sockets_init(void) { WSADATA wsa_data; WORD version; version = MAKEWORD(2, 2); if (WSAStartup(version, &wsa_data) == 0) { if ((LOBYTE(wsa_data.wVersion) == 2) && (HIBYTE(wsa_data.wVersion) == 2)) return 1; else { WSACleanup(); return 0; } } return 0; } void evil_sockets_shutdown(void) { WSACleanup(); } /* * The code of the following functions has been kindly offered * by Tor Lillqvist. */ int evil_pipe(int *fds) { struct sockaddr_in saddr; SOCKET temp; SOCKET socket1 = INVALID_SOCKET; SOCKET socket2 = INVALID_SOCKET; u_long arg; fd_set read_set; fd_set write_set; int len; temp = socket (AF_INET, SOCK_STREAM, 0); if (temp == INVALID_SOCKET) goto out0; arg = 1; if (ioctlsocket (temp, FIONBIO, &arg) == SOCKET_ERROR) goto out0; memset (&saddr, 0, sizeof (saddr)); saddr.sin_family = AF_INET; saddr.sin_port = 0; saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); if (bind (temp, (struct sockaddr *)&saddr, sizeof (saddr))) goto out0; if (listen (temp, 1) == SOCKET_ERROR) goto out0; len = sizeof (saddr); if (getsockname (temp, (struct sockaddr *)&saddr, &len)) goto out0; socket1 = socket (AF_INET, SOCK_STREAM, 0); if (socket1 == INVALID_SOCKET) goto out0; arg = 1; if (ioctlsocket (socket1, FIONBIO, &arg) == SOCKET_ERROR) goto out1; if ((connect (socket1, (struct sockaddr *)&saddr, len) == SOCKET_ERROR) && (WSAGetLastError () != WSAEWOULDBLOCK)) goto out1; FD_ZERO (&read_set); FD_SET (temp, &read_set); if (select (0, &read_set, NULL, NULL, NULL) == SOCKET_ERROR) goto out1; if (!FD_ISSET (temp, &read_set)) goto out1; socket2 = accept (temp, (struct sockaddr *) &saddr, &len); if (socket2 == INVALID_SOCKET) goto out1; FD_ZERO (&write_set); FD_SET (socket1, &write_set); if (select (0, NULL, &write_set, NULL, NULL) == SOCKET_ERROR) goto out2; if (!FD_ISSET (socket1, &write_set)) goto out2; arg = 0; if (ioctlsocket (socket1, FIONBIO, &arg) == SOCKET_ERROR) goto out2; arg = 0; if (ioctlsocket (socket2, FIONBIO, &arg) == SOCKET_ERROR) goto out2; fds[0] = socket1; fds[1] = socket2; closesocket (temp); return 0; out2: closesocket (socket2); out1: closesocket (socket1); out0: closesocket (temp); fds[0] = -1; fds[1] = -1; return -1; }