diff options
Diffstat (limited to 'xrdp/os_calls.c')
-rw-r--r-- | xrdp/os_calls.c | 126 |
1 files changed, 111 insertions, 15 deletions
diff --git a/xrdp/os_calls.c b/xrdp/os_calls.c index 0bb78e38..a9663a00 100644 --- a/xrdp/os_calls.c +++ b/xrdp/os_calls.c @@ -20,40 +20,53 @@ */ -#include <stdlib.h> -#include <string.h> +#ifdef _WIN32 +#include <windows.h> +#include <winsock.h> +#else #include <unistd.h> -#include <errno.h> #include <pthread.h> -#include <stdarg.h> -#include <stdio.h> -#include <fcntl.h> +#include <errno.h> #include <netinet/in.h> #include <netinet/tcp.h> -#include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> +#include <sys/types.h> +#endif +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> +#include <stdio.h> +#include <fcntl.h> #include <openssl/rc4.h> #include <openssl/md5.h> #include <openssl/sha.h> #include <openssl/bn.h> -#include "xrdp.h" - //#define MEMLEAK +#ifdef _WIN32 +static CRITICAL_SECTION g_term_mutex; +#else static pthread_mutex_t g_term_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif static int g_term = 0; #ifdef MEMLEAK -int g_memsize = 0; -int g_memid = 0; +static int g_memsize = 0; +static int g_memid = 0; struct xrdp_list* g_memlist = 0; #endif /*****************************************************************************/ int g_init_system(void) { +#ifdef _WIN32 + WSADATA w; + + WSAStartup(2, &w); + InitializeCriticalSection(&g_term_mutex); +#endif #ifdef MEMLEAK g_memlist = xrdp_list_create(); #endif @@ -63,6 +76,10 @@ int g_init_system(void) /*****************************************************************************/ int g_exit_system(void) { +#ifdef _WIN32 + WSACleanup(); + DeleteCriticalSection(&g_term_mutex); +#endif #ifdef MEMLEAK int i; struct xrdp_mem* p; @@ -223,17 +240,26 @@ int g_tcp_socket(void) /*****************************************************************************/ void g_tcp_close(int sck) { +#ifdef _WIN32 + closesocket(sck); +#else close(sck); +#endif } /*****************************************************************************/ int g_tcp_set_non_blocking(int sck) { - int i; + unsigned long i; - i = fcntl(sck, F_GETFL); +#ifdef _WIN32 + i = 1; + ioctlsocket(sck, FIONBIO, &i);
+#else
+ i = fcntl(sck, F_GETFL);
i = i | O_NONBLOCK; fcntl(sck, F_SETFL, i); +#endif return 0; } @@ -259,7 +285,11 @@ int g_tcp_listen(int sck) int g_tcp_accept(int sck) { struct sockaddr_in s; +#ifdef _WIN32 + signed int i; +#else unsigned int i; +#endif i = sizeof(struct sockaddr_in); memset(&s, 0, i); @@ -281,7 +311,11 @@ int g_tcp_send(int sck, void* ptr, int len, int flags) /*****************************************************************************/ int g_tcp_last_error_would_block(int sck) { +#ifdef _WIN32 + return WSAGetLastError() == WSAEWOULDBLOCK; +#else return errno == EWOULDBLOCK; +#endif } /*****************************************************************************/ @@ -293,7 +327,7 @@ int g_tcp_select(int sck) time.tv_sec = 0; time.tv_usec = 0; FD_ZERO(&rfds); - FD_SET(sck, &rfds); + FD_SET(((unsigned int)sck), &rfds); return select(sck + 1, &rfds, 0, 0, &time); } @@ -302,33 +336,58 @@ int g_is_term(void) { int rv; +#ifdef _WIN32 + EnterCriticalSection(&g_term_mutex); + rv = g_term; + LeaveCriticalSection(&g_term_mutex); +#else pthread_mutex_lock(&g_term_mutex); rv = g_term; pthread_mutex_unlock(&g_term_mutex); +#endif return rv; } /*****************************************************************************/ void g_set_term(int in_val) { +#ifdef _WIN32 + EnterCriticalSection(&g_term_mutex); + g_term = in_val; + LeaveCriticalSection(&g_term_mutex); +#else pthread_mutex_lock(&g_term_mutex); g_term = in_val; pthread_mutex_unlock(&g_term_mutex); +#endif } /*****************************************************************************/ void g_sleep(int msecs) { +#ifdef _WIN32 + Sleep(msecs); +#else usleep(msecs * 1000); +#endif } /*****************************************************************************/ -int g_thread_create(void* (*start_routine)(void*), void* arg) +#ifdef _WIN32 +int g_thread_create(unsigned long (__stdcall * start_routine)(void*), void* arg) +{ + DWORD thread; + + return !CreateThread(0, 0, start_routine, arg, 0, &thread); +} +#else +int g_thread_create(void* (* start_routine)(void*), void* arg) { pthread_t thread; return pthread_create(&thread, 0, start_routine, arg); } +#endif /* rc4 stuff */ @@ -451,6 +510,9 @@ int g_mod_exp(char* out, char* in, char* mod, char* exp) /*****************************************************************************/ void g_random(char* data, int len) { +#ifdef _WIN32 + memset(data, 0x44, len); +#else int fd; memset(data, 0x44, len); @@ -462,6 +524,7 @@ void g_random(char* data, int len) read(fd, data, len); close(fd); } +#endif } /*****************************************************************************/ @@ -479,13 +542,23 @@ int g_memcmp(void* s1, void* s2, int len) /*****************************************************************************/ int g_file_open(char* file_name) { +#ifdef _WIN32 + return (int)CreateFile(file_name, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); +#else return open(file_name, O_RDWR | O_CREAT); +#endif } /*****************************************************************************/ int g_file_close(int fd) { +#ifdef _WIN32 + CloseHandle((HANDLE)fd); +#else close(fd); +#endif return 0; } @@ -493,27 +566,49 @@ int g_file_close(int fd) /* read from file*/ int g_file_read(int fd, char* ptr, int len) { +#ifdef _WIN32 + if (ReadFile((HANDLE)fd, (LPVOID)ptr, (DWORD)len, (LPDWORD)&len, 0)) + return len; + else + return -1; +#else return read(fd, ptr, len); +#endif } /*****************************************************************************/ /* write to file */ int g_file_write(int fd, char* ptr, int len) { +#ifdef _WIN32 + if (WriteFile((HANDLE)fd, (LPVOID)ptr, (DWORD)len, (LPDWORD)&len, 0)) + return len; + else + return -1; +#else return write(fd, ptr, len); +#endif } /*****************************************************************************/ /* move file pointer */ int g_file_seek(int fd, int offset) { +#ifdef _WIN32 + return SetFilePointer((HANDLE)fd, offset, 0, FILE_BEGIN); +#else return lseek(fd, offset, SEEK_SET); +#endif } /*****************************************************************************/ /* do a write lock on a file */ +/* return boolean */ int g_file_lock(int fd, int start, int len) { +#ifdef _WIN32 + return LockFile((HANDLE)fd, start, 0, len, 0); +#else struct flock lock; lock.l_type = F_WRLCK; @@ -523,6 +618,7 @@ int g_file_lock(int fd, int start, int len) if (fcntl(fd, F_SETLK, &lock) == -1) return 0; return 1; +#endif } /*****************************************************************************/ |