/*
 * winstub.h - MS-Windows compatiblity hacks
 * $Id: winstub.h,v 1.4 2005/06/16 20:08:53 rdenisc Exp $
 */

/***********************************************************************
 *  Copyright (C) 2002-2004 Remi Denis-Courmont.                       *
 *  This program is free software; you can redistribute and/or modify  *
 *  it under the terms of the GNU General Public License as published  *
 *  by the Free Software Foundation; version 2 of the license.         *
 *                                                                     *
 *  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, you can get it from:              *
 *  http://www.gnu.org/copyleft/gpl.html                               *
 ***********************************************************************/

#ifndef __RDC_WINSTUB_H
# define __RDC_WINSTUB_H

/* gai functions do not link properly with my version of Mingw */

# include <winsock2.h> /* struct sockaddr & all the predefined constants */
# include <ws2tcpip.h> /* struct sockaddr_in and the like */
# include <io.h> /* prevents close() name mangling */
# include <stdint.h>

#ifndef HAVE_GAI_STRERROR
# undef gai_strerror // broken on my Mingw32
#endif

/* <ws2tcpip.h> breaks RFC2553 by not defining EAI_SYSTEM.
 * Give it a bogus value that should never happen in getaddrinfo(). */
# ifndef EAI_SYSTEM
#  define EAI_SYSTEM WSAEINPROGRESS
# endif

/* Winsock does not define these constants */
# ifndef SHUT_RD
#  define SHUT_RD	SD_RECEIVE
#  define SHUT_WR	SD_SEND
#  define SHUT_RDWR	SD_BOTH
# endif

# ifndef EINPROGRESS
#  define EINPROGRESS	WSAEINPROGRESS
#endif

# define main winstub_main

# ifdef __cplusplus
extern "C"
{
# endif
	void winsock_perror (const char *str);
# define perror winsock_perror

	const char *winsock_strerror (int errnum);
# define strerror winsock_strerror

	int winsock_close (int fd);
# define close winsock_close

	size_t winsock_recvfrom (int fd, void *buf, size_t len, int flags,
				 struct sockaddr *addr, socklen_t *alen);
# define recvfrom winsock_recvfrom

	size_t winsock_sendto (int fd, const void *buf, size_t len, int flags,
				const struct sockaddr *addr, socklen_t alen);
# define sendto winsock_sendto
	
	size_t winsock_read (int fd, void *buf, size_t len);
# define read winsock_read

	size_t winsock_write (int fd, const void *buf, size_t len);
# define write winsock_write

	size_t winsock_recv (int fd, void *buf, size_t len, int flags);
# define recv winsock_recv

	size_t winsock_send (int fd, const void *buf, size_t len, int flags);
# define send winsock_send

	int winsock_socket (int pf, int type, int proto);
# define socket winsock_socket

	int winsock_bind (int fd, struct sockaddr *addr, socklen_t addrlen);
# define bind winsock_bind

	int winsock_listen (int fd, int max);
# define listen winsock_listen

	int winsock_accept (int fd, struct sockaddr *addr, socklen_t *len);
# define accept winsock_accept

	int winsock_connect (int fd, struct sockaddr *addr, socklen_t len);
# define connect winsock_connect

	int winsock_shutdown (int fd, int how);
# define shutdown winsock_shutdown

	int winsock_setsockopt (int fd, int lvl, int opt, const void *data,
				socklen_t len);
# define setsockopt winsock_setsockopt

	int winsock_getsockopt (int fd, int lvl, int opt, void *data,
				socklen_t *len);
# define getsockopt winsock_getsockopt

	struct hostent *winsock_gethostbyaddr (const char *addr, int len,
						int type);
# define gethostbyaddr winsock_gethostbyaddr

	struct hostent *winsock_gethostbyname (const char *name);
# define gethostbyname winsock_gethostbyname

	int winsock_getpeername (int fd, struct sockaddr *addr,
					socklen_t *len);
# define getpeername winsock_getpeername

	int winsock_getsockname (int fd, struct sockaddr *addr,
					socklen_t *len);
# define getsockname winsock_getsockname

	char *winsock_inet_ntoa (struct in_addr in);
# define inet_ntoa winsock_inet_ntoa

	unsigned long winsock_inet_addr (const char *dotip);
# define inet_addr winsock_inet_addr

	struct servent *winsock_getservbyport (int port, const char *proto);
# define getservbyport winsock_getservbyport

	struct servent *winsock_getservbyname (const char *name,
						const char *proto);
# define getservbyname winsock_getservbyname

	uint16_t winsock_ntohs (uint16_t s);
# define ntohs winsock_ntohs

	uint16_t winsock_htons (uint16_t s);
# define htons winsock_htons

	uint32_t winsock_ntohl (uint32_t l);
# define ntohl winsock_ntohl

	uint32_t winsock_htonl (uint32_t l);
# define htonl winsock_htonl

	int winsock_getaddrinfo (const char *node, const char *service,
	                         const struct addrinfo *hints,
	                         struct addrinfo **res);
# define getaddrinfo winsock_getaddrinfo

	void winsock_freeaddrinfo (struct addrinfo *infos);
# define freeaddrinfo winsock_freeaddrinfo

	int winsock_getnameinfo (const struct sockaddr *sa, int salen, char *host,
	                         int hostlen, char *serv, int servlen, int flags);
# define getnameinfo winsock_getnameinfo

/*
 * POSIX functions which do not exists on Windows
 */
	unsigned int sleep (unsigned int s);
	int setuid (uid_t uid);
	int seteuid (uid_t uid);
	uid_t getuid (void);
	uid_t geteuid (void);

	struct passwd
	{
		uid_t pw_uid;
	};
	struct passwd *getpwnam (const char *username);
	struct passwd *getpwuid (uid_t uid);

	void openlog (const char *ident, int option, int facility);
	void syslog (int priority, const char *fmt, ...);
	void closelog (void);

# define LOG_CONS	0x02
# define LOG_NDELAY	0x08
# define LOG_NOWAIT	0x10
# define LOG_ODELAY	0x04
# define LOG_PERROR	0x20
# define LOG_PID	0x01

# define LOG_AUTH	0040
# define LOG_AUTHPRIV	0120
# define LOG_CRON	0110
# define LOG_DAEMON	0030
# define LOG_FTP	0130
# define LOG_LOCAL0	0200
# define LOG_LOCAL1	0210
# define LOG_LOCAL2	0220
# define LOG_LOCAL3	0230
# define LOG_LOCAL4	0240
# define LOG_LOCAL5	0250
# define LOG_LOCAL6	0260
# define LOG_LOCAL7	0270
# define LOG_LPR	0060
# define LOG_MAIL	0020
# define LOG_NEWS	0070
# define LOG_SYSLOG	0050
# define LOG_USER	0010
# define LOG_UUCP	0100

# define LOG_EMERG	0
# define LOG_ALERT	1
# define LOG_CRIT	2
# define LOG_ERR	3
# define LOG_WARNING	4
# define LOG_NOTICE	5
# define LOG_INFO	6
# define LOG_DEBUG	7

# ifdef __cplusplus
}
# endif
#endif /* not __RDC_WINSTUB_H */


syntax highlighted by Code2HTML, v. 0.9.1