KDECore
netsupp.h
Go to the documentation of this file.
00001 /* 00002 * This file is part of the KDE libraries 00003 * Copyright (C) 2000-2003 Thiago Macieira <thiago.macieira@kdemail.net>> 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public License 00016 * along with this library; see the file COPYING.LIB. If not, write to 00017 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 00018 * Boston, MA 02110-1301, USA. 00019 **/ 00020 00021 #ifndef _NETSUPP_H_ 00022 #define _NETSUPP_H_ 00023 00024 #include <kdecore_export.h> 00025 00026 #include <config.h> 00027 #include <config-network.h> 00028 00029 #include <sys/socket.h> 00030 #include <netdb.h> 00031 //#include "ksockaddr.h" 00032 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 quint8 sin6_len; 00066 quint8 sin6_family; 00067 #else //HAVE_STRUCT_SOCKADDR_SA_LEN 00068 quint16 sin6_family; 00069 #endif 00070 unsigned short sin6_port; /* RFC says in_port_t */ 00071 quint32 sin6_flowinfo; 00072 struct kde_in6_addr sin6_addr; 00073 quint32 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 (((quint32 *) (a))[0] == 0 && ((quint32 *) (a))[1] == 0 && \ 00080 ((quint32 *) (a))[2] == 0 && ((quint32 *) (a))[3] == 0) 00081 00082 #define KDE_IN6_IS_ADDR_LOOPBACK(a) \ 00083 (((quint32 *) (a))[0] == 0 && ((quint32 *) (a))[1] == 0 && \ 00084 ((quint32 *) (a))[2] == 0 && ((quint32 *) (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 ((((quint32 *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) 00090 00091 #define KDE_IN6_IS_ADDR_SITELOCAL(a) \ 00092 ((((quint32 *) (a))[0] & htonl (0xffc00000)) == htonl (0xfec00000)) 00093 00094 #define KDE_IN6_IS_ADDR_V4MAPPED(a) \ 00095 ((((quint32 *) (a))[0] == 0) && (((quint32 *) (a))[1] == 0) && \ 00096 (((quint32 *) (a))[2] == htonl (0xffff))) 00097 00098 #define KDE_IN6_IS_ADDR_V4COMPAT(a) \ 00099 ((((quint32 *) (a))[0] == 0) && (((quint32 *) (a))[1] == 0) && \ 00100 (((quint32 *) (a))[2] == 0) && (ntohl (((quint32 *) (a))[3]) > 1)) 00101 00102 #define KDE_IN6_ARE_ADDR_EQUAL(a,b) \ 00103 ((((quint32 *) (a))[0] == ((quint32 *) (b))[0]) && \ 00104 (((quint32 *) (a))[1] == ((quint32 *) (b))[1]) && \ 00105 (((quint32 *) (a))[2] == ((quint32 *) (b))[2]) && \ 00106 (((quint32 *) (a))[3] == ((quint32 *) (b))[3])) 00107 00108 #define KDE_IN6_IS_ADDR_MC_NODELOCAL(a) \ 00109 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((quint8 *) (a))[1] & 0xf) == 0x1)) 00110 00111 #define KDE_IN6_IS_ADDR_MC_LINKLOCAL(a) \ 00112 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((quint8 *) (a))[1] & 0xf) == 0x2)) 00113 00114 #define KDE_IN6_IS_ADDR_MC_SITELOCAL(a) \ 00115 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((quint8 *) (a))[1] & 0xf) == 0x5)) 00116 00117 #define KDE_IN6_IS_ADDR_MC_ORGLOCAL(a) \ 00118 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((quint8 *) (a))[1] & 0xf) == 0x8)) 00119 00120 #define KDE_IN6_IS_ADDR_MC_GLOBAL(a) \ 00121 (KDE_IN6_IS_ADDR_MULTICAST(a) && ((((quint8 *) (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 KDECORE_EXPORT int kde_getaddrinfo(const char *name, const char *service, 00162 const struct addrinfo* hint, 00163 struct kde_addrinfo** result); 00164 extern KDECORE_EXPORT 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 # ifndef EAI_ADDRFAMILY 00212 # define EAI_ADDRFAMILY 1 /* Address family for NAME not supported. */ 00213 # endif 00214 # ifndef EAI_AGAIN 00215 # define EAI_AGAIN 2 /* Temporary failure in name resolution. */ 00216 # endif 00217 # ifndef EAI_BADFLAGS 00218 # define EAI_BADFLAGS 3 /* Invalid value for `ai_flags' field. */ 00219 # endif 00220 # ifndef EAI_FAIL 00221 # define EAI_FAIL 4 /* Non-recoverable failure in name res. */ 00222 # endif 00223 # ifndef EAI_FAMILY 00224 # define EAI_FAMILY 5 /* `ai_family' not supported. */ 00225 # endif 00226 # ifndef EAI_MEMORY 00227 # define EAI_MEMORY 6 /* Memory allocation failure. */ 00228 # endif 00229 # ifndef EAI_NODATA 00230 # define EAI_NODATA 7 /* No address associated with NAME. */ 00231 # endif 00232 # ifndef EAI_NONAME 00233 # define EAI_NONAME 8 /* NAME or SERVICE is unknown. */ 00234 # endif 00235 # ifndef EAI_SERVICE 00236 # define EAI_SERVICE 9 /* SERVICE not supported for `ai_socktype'. */ 00237 # endif 00238 # ifndef EAI_SOCKTYPE 00239 # define EAI_SOCKTYPE 10 /* `ai_socktype' not supported. */ 00240 # endif 00241 # ifndef EAI_SYSTEM 00242 # define EAI_SYSTEM 11 /* System error returned in `errno'. */ 00243 # endif 00244 00245 /* 00246 * These are specified in the RFC 00247 * We won't undefine them. If someone defined them to a different value 00248 * the preprocessor will generate an error 00249 */ 00250 # define NI_MAXHOST 1025 00251 # define NI_MAXSERV 32 00252 00253 # ifdef NI_NUMERICHOST 00254 # undef NI_NUMERICHOST 00255 # undef NI_NUMERICSERV 00256 # undef NI_NOFQDN 00257 # undef NI_NAMEREQD 00258 # undef NI_DGRAM 00259 # endif 00260 00261 # define NI_NUMERICHOST 1 /* Don't try to look up hostname. */ 00262 # define NI_NUMERICSERV 2 /* Don't convert port number to name. */ 00263 # define NI_NOFQDN 4 /* Only return nodename portion. */ 00264 # define NI_NAMEREQD 8 /* Don't return numeric addresses. */ 00265 # define NI_DGRAM 16 /* Look up UDP service rather than TCP. */ 00266 00267 # ifdef gai_strerror 00268 # undef gai_strerror 00269 # endif 00270 00271 # ifdef getaddrinfo 00272 # undef getaddrinfo 00273 # endif 00274 00275 # ifdef freeaddrinfo 00276 # undef freeaddrinfo 00277 # endif 00278 00279 # ifdef getnameinfo 00280 # undef getnameinfo 00281 # endif 00282 00283 namespace KDE 00284 { 00286 extern KDECORE_EXPORT int getaddrinfo(const char *name, const char *service, 00287 const struct addrinfo* hint, 00288 struct addrinfo** result); 00290 extern KDECORE_EXPORT void freeaddrinfo(struct addrinfo* ai); 00292 extern KDECORE_EXPORT int getnameinfo(const struct sockaddr *sa, 00293 kde_socklen_t salen, 00294 char *host, size_t hostlen, 00295 char *serv, size_t servlen, 00296 int flags); 00297 } 00298 00299 # ifndef HAVE_GAI_STRERROR_PROTO 00300 00301 extern KDECORE_EXPORT char *gai_strerror(int errorcode); 00302 # endif 00303 00304 # define getaddrinfo KDE::getaddrinfo 00305 # define freeaddrinfo KDE::freeaddrinfo 00306 # define getnameinfo KDE::getnameinfo 00307 00308 00309 #endif 00310 00311 #ifndef HAVE_INET_PTON 00312 00313 namespace KDE 00314 { 00316 extern KDECORE_EXPORT int inet_pton(int af, const char *cp, void* buf); 00317 } 00318 00319 # define inet_pton KDE::inet_pton 00320 #endif 00321 00322 #ifndef HAVE_INET_NTOP 00323 00324 namespace KDE 00325 { 00327 extern KDECORE_EXPORT const char* inet_ntop(int af, const void *cp, char *buf, size_t len); 00328 } 00329 00330 # define inet_ntop KDE::inet_ntop 00331 #endif 00332 00333 #endif
KDE 4.6 API Reference