diff src/win32/libc_interface.c @ 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
children 10ffafd1c91f
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);
+}