src/win32/libc_interface.c

branch
gaim
changeset 20470
77693555855f
parent 13071
b98e72d4089a
parent 20469
b2836a24d81e
child 20471
1966704b3e42
--- a/src/win32/libc_interface.c	Mon Apr 16 00:43:53 2007 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,435 +0,0 @@
-/*
- * gaim
- *
- * File: libc_interface.c
- * Date: October 14, 2002
- * Description: libc interface for Windows api
- * 
- * Copyright (C) 2002-2003, Herman Bloggs <hermanator12002@yahoo.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- */
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <io.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <sys/timeb.h>
-#include <sys/stat.h>
-#include <time.h>
-#include <glib.h>
-#include "debug.h"
-#include "libc_internal.h"
-#if GLIB_CHECK_VERSION(2,6,0)
-# include <glib/gstdio.h>
-#else
-#define g_remove remove
-#define g_rename rename
-#define g_stat stat
-#endif
-/*
- *  PROTOS
- */
-
-/*
- *  LOCALS
- */
-
-static char errbuf[1024];
-
-/*
- *  CODE
- */
-
-/* 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 {
-                        gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "wgaim_is_socket: 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, socklen_t *optlenptr) {
-	if(getsockopt(socket, level, optname, optval, optlenptr) == SOCKET_ERROR ) {
-		errno = WSAGetLastError();
-		return -1;
-	}
-	return 0;
-}
-
-int wgaim_setsockopt(int socket, int level, int optname, const void *optval, socklen_t optlen) {
-	if(setsockopt(socket, level, optname, optval, optlen) == SOCKET_ERROR ) {
-		errno = WSAGetLastError();
-		return -1;
-	}
-	return 0;
-}
-
-int wgaim_getsockname(int socket, struct sockaddr *addr, socklen_t *lenptr) {
-        if(getsockname(socket, addr, lenptr) == SOCKET_ERROR) {
-                errno = WSAGetLastError();
-                return -1;
-        }
-        return 0;
-}
-
-int wgaim_bind(int socket, struct sockaddr *addr, socklen_t length) {
-        if(bind(socket, addr, length) == SOCKET_ERROR) {
-                errno = WSAGetLastError();
-                return -1;
-        }
-        return 0;
-}
-
-int wgaim_listen(int socket, unsigned int n) {
-        if(listen(socket, n) == SOCKET_ERROR) {
-                errno = WSAGetLastError();
-                return -1;
-        }
-        return 0;
-}
-
-int wgaim_sendto(int socket, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) {
-	int ret;
-	if ((ret = sendto(socket, buf, len, flags, to, tolen)
-			) == SOCKET_ERROR) {
-		errno = WSAGetLastError();
-		return -1;
-	}
-	return ret;
-}
-
-/* fcntl.h */
-/* This is not a full implementation of fcntl. Update as needed.. */
-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:
-                gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "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;
-	}
-	case SIOCGIFCONF:
-	{
-		INTERFACE_INFO InterfaceList[20];
-		unsigned long nBytesReturned;
-		if (WSAIoctl(fd, SIO_GET_INTERFACE_LIST,
-				0, 0, &InterfaceList,
-				sizeof(InterfaceList), &nBytesReturned,
-				0, 0) == SOCKET_ERROR) {
-			errno = WSAGetLastError();
-			return -1;
-		} else {
-			int i;
-			struct ifconf *ifc = val;
-			char *tmp = ifc->ifc_buf;
-			int nNumInterfaces =
-				nBytesReturned / sizeof(INTERFACE_INFO);
-			for (i = 0; i < nNumInterfaces; i++) {
-				INTERFACE_INFO ii = InterfaceList[i];
-				struct ifreq *ifr = (struct ifreq *) tmp;
-				struct sockaddr_in *sa = (struct sockaddr_in *) &ifr->ifr_addr;
-
-				sa->sin_family = ii.iiAddress.AddressIn.sin_family;
-				sa->sin_port = ii.iiAddress.AddressIn.sin_port;
-				sa->sin_addr.s_addr = ii.iiAddress.AddressIn.sin_addr.s_addr;
-				tmp += sizeof(struct ifreq);
-
-				/* Make sure that we can fit in the original buffer */
-				if (tmp >= (ifc->ifc_buf + ifc->ifc_len + sizeof(struct ifreq))) {
-					break;
-				}
-			}
-			/* Replace the length with the actually used length */
-			ifc->ifc_len = ifc->ifc_len - (ifc->ifc_buf - tmp);
-			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;
-		}
-#if 0
-		else if( ret == 0 ) {
-			/* connection has been gracefully closed */
-			errno = WSAENOTCONN;
-			return -1;
-		}
-#endif
-		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_recv(int fd, void *buf, size_t len, int flags) {
-	int ret;
-
-	if ((ret = recv(fd, buf, len, flags)) == SOCKET_ERROR) {
-			errno = WSAGetLastError();
-			return -1;
-	} else {
-		return ret;
-	}
-}
-
-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);
-}
-
-int wgaim_gethostname(char *name, size_t size) {
-        if(gethostname(name, size) == SOCKET_ERROR) {
-                errno = WSAGetLastError();
-			return -1;
-        }
-        return 0;
-}
-
-/* sys/time.h */
-
-int wgaim_gettimeofday(struct timeval *p, struct timezone *z) {
-	int res = 0;
-	struct _timeb timebuffer;
-
-	if (z != 0) {
-		_tzset();
-		z->tz_minuteswest = _timezone/60;
-		z->tz_dsttime = _daylight;
-	}
-	
-	if (p != 0) {
-		_ftime(&timebuffer);
-	   	p->tv_sec = timebuffer.time;			/* seconds since 1-1-1970 */
-		p->tv_usec = timebuffer.millitm*1000; 	/* microseconds */
-	}
-
-	return res;
-}
-
-/* stdio.h */
-
-int wgaim_rename (const char *oldname, const char *newname) {
-	struct stat oldstat, newstat;
-
-	if(g_stat(oldname, &oldstat) == 0) {
-		/* newname exists */
-		if(g_stat(newname, &newstat) == 0) {
-			/* oldname is a dir */
-			if(_S_ISDIR(oldstat.st_mode)) {
-				if(!_S_ISDIR(newstat.st_mode)) {
-					return g_rename(oldname, newname);
-				}
-				/* newname is a dir */
-				else {
-					/* This is not quite right.. If newname is empty and
-					   is not a sub dir of oldname, newname should be
-					   deleted and oldname should be renamed.
-					*/
-					gaim_debug(GAIM_DEBUG_WARNING, "wgaim", "wgaim_rename does not behave here as it should\n");
-					return g_rename(oldname, newname);
-				}
-			}
-			/* oldname is not a dir */
-			else {
-				/* newname is a dir */
-				if(_S_ISDIR(newstat.st_mode)) {
-					errno = EISDIR;
-					return -1;
-				}
-				/* newname is not a dir */
-				else {
-					g_remove(newname);
-					return g_rename(oldname, newname);
-				}
-			}
-		}
-		/* newname doesn't exist */
-		else
-			return g_rename(oldname, newname);
-	}
-	else {
-		/* oldname doesn't exist */
-		errno = ENOENT;
-		return -1;
-	}
-
-}
-
-/* time.h */
-
-struct tm * wgaim_localtime_r (const time_t *time, struct tm *resultp) {
-	struct tm* tmptm;
-
-	if(!time)
-		return NULL;
-	tmptm = localtime(time);
-	if(resultp && tmptm)
-		return memcpy(resultp, tmptm, sizeof(struct tm));
-	else
-		return NULL;
-}

mercurial