kdecore Library API Documentation

netsupp.h

00001 /* 00002 * This file is part of the KDE libraries 00003 * Copyright (C) 2000-2003 Thiago Macieira <thiagom@mail.com> 00004 * 00005 * $Id: netsupp.h,v 1.25 2003/11/15 22:07:57 thiago Exp $ 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Library General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Library General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Library General Public License 00018 * along with this library; see the file COPYING.LIB. If not, write to 00019 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00020 * Boston, MA 02111-1307, USA. 00021 **/ 00022 00023 #ifndef _NETSUPP_H_ 00024 #define _NETSUPP_H_ 00025 00026 #ifdef HAVE_CONFIG_H 00027 #include <config.h> 00028 #endif 00029 00030 #include <sys/socket.h> 00031 #include <netdb.h> 00032 #include "ksockaddr.h" 00033 00034 /* 00035 * Seems some systems don't know about AF_LOCAL 00036 */ 00037 #ifndef AF_LOCAL 00038 #define AF_LOCAL AF_UNIX 00039 #define PF_LOCAL PF_UNIX 00040 #endif 00041 00042 #ifdef CLOBBER_IN6 00043 #define kde_in6_addr in6_addr 00044 #define kde_sockaddr_in6 sockaddr_in6 00045 #endif 00046 00047 /*** IPv6 structures that might be missing from some implementations ***/ 00048 00053 struct kde_in6_addr 00054 { 00055 unsigned char __u6_addr[16]; 00056 }; 00057 00062 struct kde_sockaddr_in6 00063 { 00064 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN 00065 Q_UINT8 sin6_len; 00066 Q_UINT8 sin6_family; 00067 #else //HAVE_STRUCT_SOCKADDR_SA_LEN 00068 Q_UINT16 sin6_family; 00069 #endif 00070 unsigned short sin6_port; /* RFC says in_port_t */ 00071 Q_UINT32 sin6_flowinfo; 00072 struct kde_in6_addr sin6_addr; 00073 Q_UINT32 sin6_scope_id; 00074 }; 00075 00076 /* IPv6 test macros that could be missing from some implementations */ 00077 00078 #define KDE_IN6_IS_ADDR_UNSPECIFIED(a) \ 00079 (((Q_UINT32 *) (a))[0] == 0 && ((Q_UINT32 *) (a))[1] == 0 && \ 00080 ((Q_UINT32 *) (a))[2] == 0 && ((Q_UINT32 *) (a))[3] == 0) 00081 00082 #define KDE_IN6_IS_ADDR_LOOPBACK(a) \ 00083 (((Q_UINT32 *) (a))[0] == 0 && ((Q_UINT32 *) (a))[1] == 0 && \ 00084 ((Q_UINT32 *) (a))[2] == 0 && ((Q_UINT32 *) (a))[3] == htonl (1)) 00085 00086 #define KDE_IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff) 00087 00088 #define KDE_IN6_IS_ADDR_LINKLOCAL(a) \ 00089 ((((Q_UINT32 *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) 00090 00091 #define KDE_IN6_IS_ADDR_SITELOCAL(a) \ 00092 ((((Q_UINT32 *) (a))[0] & htonl (0xffc00000)) == htonl (0xfec00000)) 00093 00094 #define KDE_IN6_IS_ADDR_V4MAPPED(a) \ 00095 ((((Q_UINT32 *) (a))[0] == 0) && (((Q_UINT32 *) (a))[1] == 0) && \ 00096 (((Q_UINT32 *) (a))[2] == htonl (0xffff))) 00097 00098 #define KDE_IN6_IS_ADDR_V4COMPAT(a) \ 00099 ((((Q_UINT32 *) (a))[0] == 0) && (((Q_UINT32 *) (a))[1] == 0) && \ 00100 (((Q_UINT32 *) (a))[2] == 0) && (ntohl (((Q_UINT32 *) (a))[3]) > 1)) 00101 00102 #define KDE_IN6_ARE_ADDR_EQUAL(a,b) \ 00103 ((((Q_UINT32 *) (a))[0] == ((Q_UINT32 *) (b))[0]) && \ 00104 (((Q_UINT32 *) (a))[1] == ((Q_UINT32 *) (b))[1]) && \ 00105 (((Q_UINT32 *) (a))[2] == ((Q_UINT32 *) (b))[2]) && \ 00106 (((Q_UINT32 *) (a))[3] == ((Q_UINT32 *) (b))[3])) 00107 00108 #define KDE_IN6_IS_ADDR_MC_NODELOCAL(a) \ 00109 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x1)) 00110 00111 #define KDE_IN6_IS_ADDR_MC_LINKLOCAL(a) \ 00112 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x2)) 00113 00114 #define KDE_IN6_IS_ADDR_MC_SITELOCAL(a) \ 00115 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x5)) 00116 00117 #define KDE_IN6_IS_ADDR_MC_ORGLOCAL(a) \ 00118 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0x8)) 00119 00120 #define KDE_IN6_IS_ADDR_MC_GLOBAL(a) \ 00121 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((Q_UINT8 *) (a))[1] & 0xf) == 0xe)) 00122 00123 #ifdef NEED_IN6_TESTS 00124 # define IN6_IS_ADDR_UNSPECIFIED KDE_IN6_IS_ADDR_UNSPECIFIED 00125 # define IN6_IS_ADDR_LOOPBACK KDE_IN6_IS_ADDR_LOOPBACK 00126 # define IN6_IS_ADDR_MULTICAST KDE_IN6_IS_ADDR_MULTICAST 00127 # define IN6_IS_ADDR_LINKLOCAL KDE_IN6_IS_ADDR_LINKLOCAL 00128 # define IN6_IS_ADDR_SITELOCAL KDE_IN6_IS_ADDR_SITELOCAL 00129 # define IN6_IS_ADDR_V4MAPPED KDE_IN6_IS_ADDR_V4MAPPED 00130 # define IN6_IS_ADDR_V4COMPAT KDE_IN6_IS_ADDR_V4COMPAT 00131 # define IN6_ARE_ADDR_EQUAL KDE_IN6_ARE_ADDR_EQUAL 00132 # define IN6_IS_ADDR_MC_NODELOCAL KDE_IN6_IS_ADDR_MC_NODELOCAL 00133 # define IN6_IS_ADDR_MC_LINKLOCAL KDE_IN6_IS_ADDR_MC_LINKLOCAL 00134 # define IN6_IS_ADDR_MC_SITELOCAL KDE_IN6_IS_ADDR_MC_SITELOCAL 00135 # define IN6_IS_ADDR_MC_ORGLOCAL KDE_IN6_IS_ADDR_MC_ORGLOCAL 00136 # define IN6_IS_ADDR_MC_GLOBAL KDE_IN6_IS_ADDR_MC_GLOBAL 00137 #endif 00138 00139 /* Special internal structure */ 00140 00141 #define KAI_SYSTEM 0 /* data is all-system */ 00142 #define KAI_LOCALUNIX 1 /* data contains a Unix addrinfo allocated by us */ 00143 #define KAI_QDNS 2 /* data contains data derived from QDns */ 00144 00145 struct addrinfo; /* forward declaration; this could be needed */ 00146 00155 struct kde_addrinfo 00156 { 00157 struct addrinfo *data; 00158 int origin; 00159 }; 00160 00161 extern int kde_getaddrinfo(const char *name, const char *service, 00162 const struct addrinfo* hint, 00163 struct kde_addrinfo** result); 00164 extern void kde_freeaddrinfo(struct kde_addrinfo *p); 00165 00166 #if !defined(HAVE_GETADDRINFO) || defined(HAVE_BROKEN_GETADDRINFO) 00167 00168 # ifndef HAVE_STRUCT_ADDRINFO 00169 00172 struct addrinfo 00173 { 00174 int ai_flags; /* Input flags. */ 00175 int ai_family; /* Protocol family for socket. */ 00176 int ai_socktype; /* Socket type. */ 00177 int ai_protocol; /* Protocol for socket. */ 00178 int ai_addrlen; /* Length of socket address. */ 00179 struct sockaddr *ai_addr; /* Socket address for socket. */ 00180 char *ai_canonname; /* Canonical name for service location. */ 00181 struct addrinfo *ai_next; /* Pointer to next in list. */ 00182 }; 00183 # endif 00184 00185 # ifdef AI_PASSIVE 00186 # undef AI_PASSIVE 00187 # undef AI_CANONNAME 00188 # undef AI_NUMERICHOST 00189 # endif 00190 00191 /* Possible values for `ai_flags' field in `addrinfo' structure. */ 00192 # define AI_PASSIVE 1 /* Socket address is intended for `bind'. */ 00193 # define AI_CANONNAME 2 /* Request for canonical name. */ 00194 # define AI_NUMERICHOST 4 /* Don't use name resolution. */ 00195 00196 # ifdef EAI_ADDRFAMILY 00197 # undef EAI_ADDRFAMILY 00198 # undef EAI_AGAIN 00199 # undef EAI_BADFLAGS 00200 # undef EAI_FAIL 00201 # undef EAI_FAMILY 00202 # undef EAI_MEMORY 00203 # undef EAI_NODATA 00204 # undef EAI_NONAME 00205 # undef EAI_SERVICE 00206 # undef EAI_SOCKTYPE 00207 # undef EAI_SYSTEM 00208 # endif 00209 00210 /* Error values for `getaddrinfo' function. */ 00211 # define EAI_ADDRFAMILY 1 /* Address family for NAME not supported. */ 00212 # define EAI_AGAIN 2 /* Temporary failure in name resolution. */ 00213 # define EAI_BADFLAGS 3 /* Invalid value for `ai_flags' field. */ 00214 # define EAI_FAIL 4 /* Non-recoverable failure in name res. */ 00215 # define EAI_FAMILY 5 /* `ai_family' not supported. */ 00216 # define EAI_MEMORY 6 /* Memory allocation failure. */ 00217 # define EAI_NODATA 7 /* No address associated with NAME. */ 00218 # define EAI_NONAME 8 /* NAME or SERVICE is unknown. */ 00219 # define EAI_SERVICE 9 /* SERVICE not supported for `ai_socktype'. */ 00220 # define EAI_SOCKTYPE 10 /* `ai_socktype' not supported. */ 00221 # define EAI_SYSTEM 11 /* System error returned in `errno'. */ 00222 00223 /* 00224 * These are specified in the RFC 00225 * We won't undefine them. If someone defined them to a different value 00226 * the preprocessor will generate an error 00227 */ 00228 # define NI_MAXHOST 1025 00229 # define NI_MAXSERV 32 00230 00231 # ifdef NI_NUMERICHOST 00232 # undef NI_NUMERICHOST 00233 # undef NI_NUMERICSERV 00234 # undef NI_NOFQDN 00235 # undef NI_NAMEREQD 00236 # undef NI_DGRAM 00237 # endif 00238 00239 # define NI_NUMERICHOST 1 /* Don't try to look up hostname. */ 00240 # define NI_NUMERICSERV 2 /* Don't convert port number to name. */ 00241 # define NI_NOFQDN 4 /* Only return nodename portion. */ 00242 # define NI_NAMEREQD 8 /* Don't return numeric addresses. */ 00243 # define NI_DGRAM 16 /* Look up UDP service rather than TCP. */ 00244 00245 # ifdef getaddrinfo 00246 # undef getaddrinfo 00247 # endif 00248 00249 namespace KDE 00250 { 00252 extern int getaddrinfo(const char *name, const char *service, 00253 const struct addrinfo* hint, 00254 struct addrinfo** result); 00256 extern void freeaddrinfo(struct addrinfo* ai); 00258 extern char *gai_strerror(int errorcode); 00260 extern int getnameinfo(const struct sockaddr *sa, 00261 unsigned int salen, 00262 char *host, size_t hostlen, 00263 char *serv, size_t servlen, 00264 int flags); 00265 } 00266 00267 # define getaddrinfo KDE::getaddrinfo 00268 # define freeaddrinfo KDE::freeaddrinfo 00269 # define gai_strerror KDE::gai_strerror 00270 # define getnameinfo KDE::getnameinfo 00271 00272 00273 #endif 00274 00275 #ifndef HAVE_INET_PTON 00276 00277 namespace KDE 00278 { 00280 extern int inet_pton(int af, const char *cp, void* buf); 00281 } 00282 00283 # define inet_pton KDE::inet_pton 00284 #endif 00285 00286 #ifndef HAVE_INET_NTOP 00287 00288 namespace KDE 00289 { 00291 extern const char* inet_ntop(int af, const void *cp, char *buf, size_t len); 00292 } 00293 00294 # define inet_ntop KDE::inet_ntop 00295 #endif 00296 00297 #endif
KDE Logo
This file is part of the documentation for kdecore Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sun Oct 10 18:54:57 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003