changeset 3712:ac6ca3890c53

[gaim-migrate @ 3845] libc_interface.c introduced committer: Tailor Script <tailor@pidgin.im>
author Herman Bloggs <hermanator12002@yahoo.com>
date Wed, 16 Oct 2002 19:35:44 +0000
parents 48f3c74c13e0
children e3a8baffcc24
files src/win32/libc_interface.c src/win32/win32dep.h
diffstat 2 files changed, 296 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/win32/libc_interface.c	Wed Oct 16 19:35:44 2002 +0000
@@ -0,0 +1,215 @@
+/*
+ *  libc_interface.c
+ *  
+ *  Author: Herman Bloggs <hermanator12002@yahoo.com>
+ *  Date: October 14, 2002
+ *  Description: Commonly used libc routines.
+ */
+#include <winsock.h>
+#include <stdlib.h>
+#include <errno.h>
+
+static char errbuf[1024];
+
+/* helpers */
+static int wgaim_is_socket( int fd ) {
+	int optval;
+	unsigned int optlen = sizeof(int);
+
+	if( (getsockopt(fd, SOL_SOCKET, SO_TYPE, (void*)&optval, &optlen)) == SOCKET_ERROR ) {
+		int error = WSAGetLastError();
+		if( error == WSAENOTSOCK )
+			return FALSE;
+		else {
+			debug_printf("wgaim_read: getsockopt returned error: %d\n", error);
+			return FALSE;
+		}
+	}
+	return TRUE;
+}
+
+/* socket.h */
+int wgaim_socket (int namespace, int style, int protocol) {
+	int ret;
+
+	ret = socket( namespace, style, protocol );
+
+	if( ret == INVALID_SOCKET ) {
+		errno = WSAGetLastError();
+		return -1;
+	}
+	return ret;
+}
+
+int wgaim_connect(int socket, struct sockaddr *addr, u_long length) {
+	int ret;
+
+	ret = connect( socket, addr, length );
+	
+	if( ret == SOCKET_ERROR ) {
+		errno = WSAGetLastError();
+		if( errno == WSAEWOULDBLOCK )
+			errno = WSAEINPROGRESS;
+		return -1;
+	}
+	return 0;
+}
+
+int wgaim_getsockopt(int socket, int level, int optname, void *optval, unsigned int *optlenptr) {
+	int ret;
+
+	ret = getsockopt( socket, level, optname, optval, optlenptr );
+	if( ret == SOCKET_ERROR ) {
+		errno = WSAGetLastError();
+		return -1;
+	}
+
+	return 0;
+}
+
+/* fcntl.h */
+/* This is not a full implementation of fcntl. Update as needed.. */
+#define O_NONBLOCK 1
+#define F_SETFL 1
+int wgaim_fcntl(int socket, int command, int val) {
+	switch( command ) {
+	case F_SETFL:
+	{
+		int ret=0;
+
+		switch( val ) {
+		case O_NONBLOCK:
+		{
+			u_long imode=1;
+			ret = ioctlsocket(socket, FIONBIO, &imode);
+			break;
+		}
+		case 0:
+	        {
+			u_long imode=0;
+			ret = ioctlsocket(socket, FIONBIO, &imode);
+			break;
+		}
+		default:
+			errno = EINVAL;
+			return -1;
+		}/*end switch*/
+		if( ret == SOCKET_ERROR ) {
+			errno = WSAGetLastError();
+			return -1;
+		}
+		return 0;
+	}
+	default:
+		debug_printf("wgaim_fcntl: Unsupported command\n");
+		return -1;
+	}/*end switch*/
+}
+
+/* sys/ioctl.h */
+int wgaim_ioctl(int fd, int command, void* val) {
+	switch( command ) {
+	case FIONBIO:
+	{
+		if (ioctlsocket(fd, FIONBIO, (unsigned long *)val) == SOCKET_ERROR) {
+			errno = WSAGetLastError();
+			return -1;
+		}
+		return 0;
+	}
+	default:
+		errno = EINVAL;
+		return -1;
+	}/*end switch*/
+}
+
+/* arpa/inet.h */
+int wgaim_inet_aton(const char *name, struct in_addr *addr) {
+	if((addr->s_addr = inet_addr(name)) == INADDR_NONE)
+		return 0;
+	else
+		return 1;
+}
+
+/* netdb.h */
+struct hostent* wgaim_gethostbyname(const char *name) {
+	struct hostent *hp;
+
+	if((hp = gethostbyname(name)) == NULL) {
+		errno = WSAGetLastError();
+		return NULL;
+	}
+	return hp;
+}
+
+/* string.h */
+char* wgaim_strerror( int errornum ) {
+	if( errornum > WSABASEERR ) {
+		sprintf( errbuf, "Windows socket error #%d", errornum );
+		return errbuf;
+	}
+	else
+		return strerror( errornum );
+}
+
+/* unistd.h */
+
+/*
+ *  We need to figure out whether fd is a file or socket handle.
+ */
+int wgaim_read(int fd, void *buf, unsigned int size) {
+	int ret;
+
+	if( wgaim_is_socket(fd) ) {
+		if( (ret = recv(fd, buf, size, 0)) == SOCKET_ERROR ) {
+			errno = WSAGetLastError();
+			return -1;
+		}
+		else if( ret == 0 ) {
+			/* connection has been gracefully closed */
+			errno = WSAENOTCONN;
+			return -1;
+		}
+		else {
+			/* success reading socket */
+			return ret;
+		}
+	}
+	else {
+		/* fd is not a socket handle.. pass it off to read */
+		return read(fd, buf, size);
+	}
+}
+
+int wgaim_write(int fd, const void *buf, unsigned int size) {
+	int ret;
+
+	if( wgaim_is_socket(fd) ) {
+		if( (ret = send(fd, buf, size, 0)) == SOCKET_ERROR ) {
+			errno = WSAGetLastError();
+			return -1;
+		}
+		else {
+			/* success */
+			return ret;
+		}
+		    
+	}
+	else
+		return write(fd, buf, size);
+}
+
+int wgaim_close(int fd) {
+	int ret;
+
+	if( wgaim_is_socket(fd) ) {
+		if( (ret = closesocket(fd)) == SOCKET_ERROR ) {
+			errno = WSAGetLastError();
+			return -1;
+		}
+		else
+			return 0;
+	}
+	else
+		return close(fd);
+}
--- a/src/win32/win32dep.h	Wed Oct 16 19:29:51 2002 +0000
+++ b/src/win32/win32dep.h	Wed Oct 16 19:35:44 2002 +0000
@@ -4,8 +4,15 @@
 
 #ifndef _WIN32DEP_H_
 #define _WIN32DEP_H_
+#include <winsock.h>
 #include <gdk/gdkevents.h>
+#include "winerror.h"
 
+/*
+ *  PROTOS
+ */
+
+/* win32dep.c */
 extern char* wgaim_install_dir(void);
 extern char* wgaim_lib_dir(void);
 extern char* wgaim_locale_dir(void);
@@ -14,21 +21,92 @@
 					   gpointer data);
 extern void wgaim_init(void);
 
-#define unlink _unlink
+/* sys/socket.h */
+extern int wgaim_socket(int namespace, int style, int protocol);
+extern int wgaim_connect(int socket, struct sockaddr *addr, u_long length);
+extern int wgaim_getsockopt(int socket, int level, int optname, void *optval, unsigned int *optlenptr);
+/* sys/ioctl.h */
+extern int wgaim_ioctl(int fd, int command, void* opt);
+/* fcntl.h */
+extern int wgaim_fcntl(int socket, int command, int val);
+/* arpa/inet.h */
+extern int wgaim_inet_aton(const char *name, struct in_addr *addr);
+/* netdb.h */
+extern struct hostent* wgaim_gethostbyname(const char *name);
+/* string.h */
+extern char* wgaim_strerror( int errornum );
+/* unistd.h */
+extern int wgaim_read(int fd, void *buf, unsigned int size);
+extern int wgaim_write(int fd, const void *buf, unsigned int size);
+extern int wgaim_close(int fd);
+
+/*
+ *  MACROS
+ */
+
 #define bzero( dest, size ) memset( ## dest ##, 0, ## size ## )
 #define sleep(x) Sleep((x)*1000)
 #define snprintf _snprintf
 #define vsnprintf _vsnprintf
+#define mkdir(a,b) _mkdir((a))
+#define open( args... ) _open( ## args )
+
+/* sockets */
+#define socket( namespace, style, protocol ) \
+wgaim_socket( ## namespace ##, ## style ##, ## protocol ## )
+
+#define connect( socket, addr, length ) \
+wgaim_connect( ## socket ##, ## addr ##, ## length ## )
+
+#define getsockopt( args... ) \
+wgaim_getsockopt( ## args )
+
+#define read( fd, buf, buflen ) \
+wgaim_read( ## fd ##, ## buf ##, ## buflen ## )
+
+#define write( socket, buf, buflen ) \
+wgaim_write( ## socket ##, ## buf ##, ## buflen ## )
+
+#define close( fd ) \
+wgaim_close( ## fd ## )
+
+#define inet_aton( name, addr ) \
+wgaim_inet_aton( ## name ##, ## addr ## )
+
+/* hostent */
+#define gethostbyname( name ) \
+wgaim_gethostbyname( ## name ## )
+
+#define hstrerror( herror ) wgaim_strerror( errno )
+
+/* fcntl commands & options */
+#define F_SETFL 1
+#define O_NONBLOCK 1
+#define fcntl( fd, command, val ) \
+wgaim_fcntl( ## fd ##, ## command ##, ## val ## )
+
+#define ioctl( fd, command, val ) \
+wgaim_ioctl( ## fd ##, ## command ##, ## val ## )
+
+#define strerror( errornum ) \
+wgaim_strerror( ## errornum ## )
+
+/*
+ *  Gaim specific
+ */
 #define DATADIR wgaim_install_dir()
+#define LIBDIR wgaim_lib_dir()
+#define LOCALEDIR wgaim_locale_dir()
 
+/*
+ *  Gtk specific
+ */
 /* Needed for accessing global variables outside the current module */
 #ifdef G_MODULE_IMPORT
 #undef G_MODULE_IMPORT
 #endif
 #define G_MODULE_IMPORT __declspec(dllimport)
 
-#define LIBDIR wgaim_lib_dir()
-#define LOCALEDIR wgaim_locale_dir()
 
 #endif /* _WIN32DEP_H_ */