diff options
Diffstat (limited to 'kdecore/netsupp.h')
-rw-r--r-- | kdecore/netsupp.h | 301 |
1 files changed, 301 insertions, 0 deletions
diff --git a/kdecore/netsupp.h b/kdecore/netsupp.h new file mode 100644 index 000000000..66435d24b --- /dev/null +++ b/kdecore/netsupp.h @@ -0,0 +1,301 @@ +/* + * This file is part of the KDE libraries + * Copyright (C) 2000-2003 Thiago Macieira <thiago.macieira@kdemail.net>> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + **/ + +#ifndef _NETSUPP_H_ +#define _NETSUPP_H_ + +#include "kdelibs_export.h" + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/socket.h> +#include <netdb.h> +//#include "ksockaddr.h" + +#ifdef __CYGWIN__ +typedef unsigned ksocklen_t; +#endif + +/* + * Seems some systems don't know about AF_LOCAL + */ +#ifndef AF_LOCAL +#define AF_LOCAL AF_UNIX +#define PF_LOCAL PF_UNIX +#endif + +#ifdef CLOBBER_IN6 +#define kde_in6_addr in6_addr +#define kde_sockaddr_in6 sockaddr_in6 +#endif + +/*** IPv6 structures that might be missing from some implementations ***/ + +/** @internal + * An IPv6 address. + * This is taken from RFC 2553 + */ +struct kde_in6_addr +{ + unsigned char __u6_addr[16]; +}; + +/** @internal + * An IPv6 socket address + * This is taken from RFC 2553. + */ +struct kde_sockaddr_in6 +{ +#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN + Q_UINT8 sin6_len; + Q_UINT8 sin6_family; +#else //HAVE_STRUCT_SOCKADDR_SA_LEN + Q_UINT16 sin6_family; +#endif + unsigned short sin6_port; /* RFC says in_port_t */ + Q_UINT32 sin6_flowinfo; + struct kde_in6_addr sin6_addr; + Q_UINT32 sin6_scope_id; +}; + +/* IPv6 test macros that could be missing from some implementations */ + +#define KDE_IN6_IS_ADDR_UNSPECIFIED(a) \ + (((Q_UINT32 *) (a))[0] == 0 && ((Q_UINT32 *) (a))[1] == 0 && \ + ((Q_UINT32 *) (a))[2] == 0 && ((Q_UINT32 *) (a))[3] == 0) + +#define KDE_IN6_IS_ADDR_LOOPBACK(a) \ + (((Q_UINT32 *) (a))[0] == 0 && ((Q_UINT32 *) (a))[1] == 0 && \ + ((Q_UINT32 *) (a))[2] == 0 && ((Q_UINT32 *) (a))[3] == htonl (1)) + +#define KDE_IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff) + +#define KDE_IN6_IS_ADDR_LINKLOCAL(a) \ + ((((Q_UINT32 *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) + +#define KDE_IN6_IS_ADDR_SITELOCAL(a) \ + ((((Q_UINT32 *) (a))[0] & htonl (0xffc00000)) == htonl (0xfec00000)) + +#define KDE_IN6_IS_ADDR_V4MAPPED(a) \ + ((((Q_UINT32 *) (a))[0] == 0) && (((Q_UINT32 *) (a))[1] == 0) && \ + (((Q_UINT32 *) (a))[2] == htonl (0xffff))) + +#define KDE_IN6_IS_ADDR_V4COMPAT(a) \ + ((((Q_UINT32 *) (a))[0] == 0) && (((Q_UINT32 *) (a))[1] == 0) && \ + (((Q_UINT32 *) (a))[2] == 0) && (ntohl (((Q_UINT32 *) (a))[3]) > 1)) + +#define KDE_IN6_ARE_ADDR_EQUAL(a,b) \ + ((((Q_UINT32 *) (a))[0] == ((Q_UINT32 *) (b))[0]) && \ + (((Q_UINT32 *) (a))[1] == ((Q_UINT32 *) (b))[1]) && \ + (((Q_UINT32 *) (a))[2] == ((Q_UINT32 *) (b))[2]) && \ + (((Q_UINT32 *) (a))[3] == ((Q_UINT32 *) (b))[3])) + +#define KDE_IN6_IS_ADDR_MC_NODELOCAL(a) \ + (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x1)) + +#define KDE_IN6_IS_ADDR_MC_LINKLOCAL(a) \ + (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x2)) + +#define KDE_IN6_IS_ADDR_MC_SITELOCAL(a) \ + (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x5)) + +#define KDE_IN6_IS_ADDR_MC_ORGLOCAL(a) \ + (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x8)) + +#define KDE_IN6_IS_ADDR_MC_GLOBAL(a) \ + (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0xe)) + +#ifdef NEED_IN6_TESTS +# define IN6_IS_ADDR_UNSPECIFIED KDE_IN6_IS_ADDR_UNSPECIFIED +# define IN6_IS_ADDR_LOOPBACK KDE_IN6_IS_ADDR_LOOPBACK +# define IN6_IS_ADDR_MULTICAST KDE_IN6_IS_ADDR_MULTICAST +# define IN6_IS_ADDR_LINKLOCAL KDE_IN6_IS_ADDR_LINKLOCAL +# define IN6_IS_ADDR_SITELOCAL KDE_IN6_IS_ADDR_SITELOCAL +# define IN6_IS_ADDR_V4MAPPED KDE_IN6_IS_ADDR_V4MAPPED +# define IN6_IS_ADDR_V4COMPAT KDE_IN6_IS_ADDR_V4COMPAT +# define IN6_ARE_ADDR_EQUAL KDE_IN6_ARE_ADDR_EQUAL +# define IN6_IS_ADDR_MC_NODELOCAL KDE_IN6_IS_ADDR_MC_NODELOCAL +# define IN6_IS_ADDR_MC_LINKLOCAL KDE_IN6_IS_ADDR_MC_LINKLOCAL +# define IN6_IS_ADDR_MC_SITELOCAL KDE_IN6_IS_ADDR_MC_SITELOCAL +# define IN6_IS_ADDR_MC_ORGLOCAL KDE_IN6_IS_ADDR_MC_ORGLOCAL +# define IN6_IS_ADDR_MC_GLOBAL KDE_IN6_IS_ADDR_MC_GLOBAL +#endif + +/* Special internal structure */ + +#define KAI_SYSTEM 0 /* data is all-system */ +#define KAI_LOCALUNIX 1 /* data contains a Unix addrinfo allocated by us */ +#define KAI_QDNS 2 /* data contains data derived from QDns */ + +struct addrinfo; /* forward declaration; this could be needed */ + +/** + * @internal + * Special purpose structure, to return data from kde_getaddrinfo to the + * library functions. This defines an extra field to let us know how to + * process this better. + * + * Currently, we use it to determine how to deallocate this stuff + */ +struct kde_addrinfo +{ + struct addrinfo *data; + int origin; +}; + +extern KDECORE_EXPORT int kde_getaddrinfo(const char *name, const char *service, + const struct addrinfo* hint, + struct kde_addrinfo** result); +extern KDECORE_EXPORT void kde_freeaddrinfo(struct kde_addrinfo *p); + +#if !defined(HAVE_GETADDRINFO) || defined(HAVE_BROKEN_GETADDRINFO) + +# ifndef HAVE_STRUCT_ADDRINFO +/** + * @internal + */ +struct addrinfo +{ + int ai_flags; /**< Input flags. */ + int ai_family; /**< Protocol family for socket. */ + int ai_socktype; /**< Socket type. */ + int ai_protocol; /**< Protocol for socket. */ + int ai_addrlen; /**< Length of socket address. */ + struct sockaddr *ai_addr; /**< Socket address for socket. */ + char *ai_canonname; /**< Canonical name for service location. */ + struct addrinfo *ai_next; /**< Pointer to next in list. */ +}; +# endif + +# ifdef AI_PASSIVE +# undef AI_PASSIVE +# undef AI_CANONNAME +# undef AI_NUMERICHOST +# endif + +/* Possible values for `ai_flags' field in `addrinfo' structure. */ +# define AI_PASSIVE 1 /* Socket address is intended for `bind'. */ +# define AI_CANONNAME 2 /* Request for canonical name. */ +# define AI_NUMERICHOST 4 /* Don't use name resolution. */ + +# ifdef EAI_ADDRFAMILY +# undef EAI_ADDRFAMILY +# undef EAI_AGAIN +# undef EAI_BADFLAGS +# undef EAI_FAIL +# undef EAI_FAMILY +# undef EAI_MEMORY +# undef EAI_NODATA +# undef EAI_NONAME +# undef EAI_SERVICE +# undef EAI_SOCKTYPE +# undef EAI_SYSTEM +# endif + +/* Error values for `getaddrinfo' function. */ +# define EAI_ADDRFAMILY 1 /* Address family for NAME not supported. */ +# define EAI_AGAIN 2 /* Temporary failure in name resolution. */ +# define EAI_BADFLAGS 3 /* Invalid value for `ai_flags' field. */ +# define EAI_FAIL 4 /* Non-recoverable failure in name res. */ +# define EAI_FAMILY 5 /* `ai_family' not supported. */ +# define EAI_MEMORY 6 /* Memory allocation failure. */ +# define EAI_NODATA 7 /* No address associated with NAME. */ +# define EAI_NONAME 8 /* NAME or SERVICE is unknown. */ +# define EAI_SERVICE 9 /* SERVICE not supported for `ai_socktype'. */ +# define EAI_SOCKTYPE 10 /* `ai_socktype' not supported. */ +# define EAI_SYSTEM 11 /* System error returned in `errno'. */ + +/* + * These are specified in the RFC + * We won't undefine them. If someone defined them to a different value + * the preprocessor will generate an error + */ +# define NI_MAXHOST 1025 +# define NI_MAXSERV 32 + +# ifdef NI_NUMERICHOST +# undef NI_NUMERICHOST +# undef NI_NUMERICSERV +# undef NI_NOFQDN +# undef NI_NAMEREQD +# undef NI_DGRAM +# endif + +# define NI_NUMERICHOST 1 /* Don't try to look up hostname. */ +# define NI_NUMERICSERV 2 /* Don't convert port number to name. */ +# define NI_NOFQDN 4 /* Only return nodename portion. */ +# define NI_NAMEREQD 8 /* Don't return numeric addresses. */ +# define NI_DGRAM 16 /* Look up UDP service rather than TCP. */ + +# ifdef getaddrinfo +# undef getaddrinfo +# endif + +namespace KDE +{ + /** \internal */ + extern KDECORE_EXPORT int getaddrinfo(const char *name, const char *service, + const struct addrinfo* hint, + struct addrinfo** result); + /** \internal */ + extern KDECORE_EXPORT void freeaddrinfo(struct addrinfo* ai); + /** \internal */ + extern KDECORE_EXPORT char *gai_strerror(int errorcode); + /** \internal */ + extern KDECORE_EXPORT int getnameinfo(const struct sockaddr *sa, + unsigned int salen, + char *host, size_t hostlen, + char *serv, size_t servlen, + int flags); +} + +# define getaddrinfo KDE::getaddrinfo +# define freeaddrinfo KDE::freeaddrinfo +# define gai_strerror KDE::gai_strerror +# define getnameinfo KDE::getnameinfo + + +#endif + +#ifndef HAVE_INET_PTON + +namespace KDE +{ + /** \internal */ + extern KDECORE_EXPORT int inet_pton(int af, const char *cp, void* buf); +} + +# define inet_pton KDE::inet_pton +#endif + +#ifndef HAVE_INET_NTOP + +namespace KDE +{ + /** \internal */ + extern KDECORE_EXPORT const char* inet_ntop(int af, const void *cp, char *buf, size_t len); +} + +# define inet_ntop KDE::inet_ntop +#endif + +#endif |