diff options
Diffstat (limited to 'src/util/support/cache-addrinfo.h')
| -rw-r--r-- | src/util/support/cache-addrinfo.h | 131 | 
1 files changed, 131 insertions, 0 deletions
| diff --git a/src/util/support/cache-addrinfo.h b/src/util/support/cache-addrinfo.h new file mode 100644 index 000000000000..a1b7fb28becb --- /dev/null +++ b/src/util/support/cache-addrinfo.h @@ -0,0 +1,131 @@ +/* -*- mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + * Copyright (C) 2004 by the Massachusetts Institute of Technology, + * Cambridge, MA, USA.  All Rights Reserved. + * + * This software is being provided to you, the LICENSEE, by the + * Massachusetts Institute of Technology (M.I.T.) under the following + * license.  By obtaining, using and/or copying this software, you agree + * that you have read, understood, and will comply with these terms and + * conditions: + * + * Export of this software from the United States of America may + * require a specific license from the United States Government. + * It is the responsibility of any person or organization contemplating + * export to obtain such a license before exporting. + * + * WITHIN THAT CONSTRAINT, permission to use, copy, modify and distribute + * this software and its documentation for any purpose and without fee or + * royalty is hereby granted, provided that you agree to comply with the + * following copyright notice and statements, including the disclaimer, and + * that the same appear on ALL copies of the software and documentation, + * including modifications that you make for internal use or for + * distribution: + * + * THIS SOFTWARE IS PROVIDED "AS IS", AND M.I.T. MAKES NO REPRESENTATIONS + * OR WARRANTIES, EXPRESS OR IMPLIED.  By way of example, but not + * limitation, M.I.T. MAKES NO REPRESENTATIONS OR WARRANTIES OF + * MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF + * THE LICENSED SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY + * PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. + * + * The name of the Massachusetts Institute of Technology or M.I.T. may NOT + * be used in advertising or publicity pertaining to distribution of the + * software.  Title to copyright in this software and any associated + * documentation shall at all times remain with M.I.T., and USER agrees to + * preserve same. + * + * Furthermore if you modify this software you must label + * your software as modified software and not distribute it in such a + * fashion that it might be confused with the original M.I.T. software. + */ + +/* + * Approach overview: + * + * If a system version is available but buggy, save handles to it, + * redefine the names to refer to static functions defined here, and + * in those functions, call the system versions and fix up the + * returned data.  Use the native data structures and flag values. + * + * If no system version exists, use gethostby* and fake it.  Define + * the data structures and flag values locally. + * + * + * On Mac OS X, getaddrinfo results aren't cached (though + * gethostbyname results are), so we need to build a cache here.  Now + * things are getting really messy.  Because the cache is in use, we + * use getservbyname, and throw away thread safety.  (Not that the + * cache is thread safe, but when we get locking support, that'll be + * dealt with.)  This code needs tearing down and rebuilding, soon. + * + * + * Note that recent Windows developers' code has an interesting hack: + * When you include the right header files, with the right set of + * macros indicating system versions, you'll get an inline function + * that looks for getaddrinfo (or whatever) in the system library, and + * calls it if it's there.  If it's not there, it fakes it with + * gethostby* calls. + * + * We're taking a simpler approach: A system provides these routines or + * it does not. + * + * Someday, we may want to take into account different versions (say, + * different revs of GNU libc) where some are broken in one way, and + * some work or are broken in another way.  Cross that bridge when we + * come to it. + */ + +/* To do, maybe: + * + * + For AIX 4.3.3, using the RFC 2133 definition: Implement + *   AI_NUMERICHOST.  It's not defined in the header file. + * + *   For certain (old?) versions of GNU libc, AI_NUMERICHOST is + *   defined but not implemented. + * + * + Use gethostbyname2, inet_aton and other IPv6 or thread-safe + *   functions if available.  But, see + *   http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=135182 for one + *   gethostbyname2 problem on Linux.  And besides, if a platform is + *   supporting IPv6 at all, they really should be doing getaddrinfo + *   by now. + * + * + inet_ntop, inet_pton + * + * + Conditionally export/import the function definitions, so a + *   library can have a single copy instead of multiple. + * + * + Upgrade host requirements to include working implementations of + *   these functions, and throw all this away.  Pleeease?  :-) + */ + +#include "k5-platform.h" +#include "k5-thread.h" +#include "port-sockets.h" +#include "socket-utils.h" +#include "fake-addrinfo.h" + +#if defined (__APPLE__) && defined (__MACH__) && 0 +#define FAI_CACHE +#endif + +struct face { +    struct in_addr *addrs4; +    struct in6_addr *addrs6; +    unsigned int naddrs4, naddrs6; +    time_t expiration; +    char *canonname, *name; +    struct face *next; +}; + +/* fake addrinfo cache */ +struct fac { +    k5_mutex_t lock; +    struct face *data; +}; + +extern struct fac krb5int_fac; + +extern int krb5int_init_fac (void); +extern void krb5int_fini_fac (void); | 
