diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-02-19 04:43:53 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-02-19 04:43:53 +0000 |
commit | 1fb05e3db1891142410bc58c320dfe281749fffe (patch) | |
tree | 46299dbecec282055e3493787910444e77099fe7 /inet/getnameinfo.c | |
parent | c84142e8fe3cbcce43ae35ac957a74ac8216d11d (diff) | |
download | glibc-1fb05e3db1891142410bc58c320dfe281749fffe.tar glibc-1fb05e3db1891142410bc58c320dfe281749fffe.tar.gz glibc-1fb05e3db1891142410bc58c320dfe281749fffe.tar.bz2 glibc-1fb05e3db1891142410bc58c320dfe281749fffe.zip |
update from main archive 970218cvs/libc-970221cvs/libc-970220cvs/libc-970219
1997-02-19 03:28 Miles Bader <miles@gnu.ai.mit.edu>
* argp/argp-help.c: Add support for user provided filter of help
messages.
* argp/argp-parse.c: Likewise.
* argp/argp.h: Likewise.
* argp/argp-namefrob.h: Define __argp_input.
* argp/argp-test.c: Add example for filter.
1997-02-19 02:58 Ulrich Drepper <drepper@cygnus.com>
* argp.h: New file.
* locale/programs/locale.c: Switch to use argp.
* errno.h: Make it possible to get definition of error_t even
after having errno.h already.
* elf/dl-hash.h: New file. ELF hashing function. Extracted
from dl-lookup.c.
* elf/dl-lookup.c (_dl_elf_hash): Remove definition.
* elf/dl-load.c: Rename _dl_does_name_match_p to _dl_name_match_p.
* elf/dl-version.c: Likewise.
* elf/dl-lookup.c: Implement new versioning lookup scheme.
* elf/dl-version.c (_dl_check_map_versions): Initialize new field
in l_versions member.
* elf/dlvsym.c: Correct call of _dl_lookup_versioned_symbol_skip
and _dl_lookup_versioned_symbol.
* elf/link.h: Rename hash_name_pair to struct r_found_version.
* sysdeps/alpha/dl-machine.h: Likewise.
* sysdeps/i386/dl-machine.h: Likewise.
* sysdeps/m68k/dl-machine.h: Likewise.
* sysdeps/mips/dl-machine.h: Likewise.
* intl/l10nflist.c: (_nl_make_l10nflist): Fix bug in computation of
length of abs_filename.
* locale/Makefile (CPPFLAGS): Define LOCALE_ALIAS_PATH.
* locale/programs/ld-monetary.c (monetary_add): Allow value 0
in mon_grouping information. This means no more grouping.
* locale/programs/ld-numeric.c (numeric_add): Write value \377
when seein value 0 in grouping information.
* locale/programs/linereader.c (lr_close): Don't free fname since
it might be used in error messages.
* locale/programs/locale.c: Check whether output of `locale -a'
really is locale directory. Also print locale aliases.
* misc/search.h (__action_fn_t): Parameters VALUE and LEVEL cannot
be const.
1997-02-19 02:16 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/bsd/sun/sunos4/resourcebits.h: Correct #defin to
#define. Reported by Rick Flower <FLOWER@sdvax2.sdd.TRW.COM>.
1997-02-19 01:37 Erik Troan <ewt@redhat.com>
* shadow/sgetspent_r.c: Accept empty third, fourth and fifth fields.
1997-02-19 01:02 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/mman/syscalls.list: msync takes 3 arguments.
Reported by Andreas Jaeger <aj@arthur.pfalz.de>.
* sysdeps/stub/msync.c (msync): Add missing third parameter.
1997-02-19 00:29 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/bsd/sigsuspend.c: Call __sigpause with needed
additional argument.
1997-02-18 22:13 Ulrich Drepper <drepper@cygnus.com>
* inet/net/ethernet.h: New file.
* sysdeps/unix/sysv/linux/netinet/if_ether.c: Add BSD compatibility.
* sysdeps/unix/sysv/linux/net/if_slip.h: New file.
Contributed by a sun <asun@zoology.washington.edu>.
* sysdeps/unix/sysv/linux/net/if_arp.h: Include <sys/socket.h>.
* sunrpc/rpc/rpc_msg.h: Include <rpc/clnt.h>.
Reported by a sun <asun@zoology.washington.edu>.
1997-02-16 14:25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makerules ((common-objpfx)distinfo-$(subdir)): Depend on sysdep
makefiles which may change the distinfo variables.
1997-02-16 14:03 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers)
[$(subdir)=misc]: Add sys/quota.h.
(sysdep_headers) [$(subdir)=inet]: Add netinet/udp.h.
1997-02-17 13:12 aleph1@dfw.net
* sunrpc/clnt_simp.c (callrpc): Prevent buffer overflow by using
strncpy.
1997-02-18 03:28 Ulrich Drepper <drepper@cygnus.com>
* stdio-common/bug10.c (main): Correct parameter.
1997-02-17 02:51 Ulrich Drepper <drepper@cygnus.com>
* malloc/obstack.h: Add `extern "C"' protection.
* posix/regex.h: Likewise.
* io/ftw.h: Likewise.
* misc/libgen.h: Likewise.
* login/utmp.h: Likewise.
* sysdeps/unix/sysv/linux/sys/reboot.h: Likewise.
* sysdeps/unix/sysv/linux/netinet/in.h: Likewise.
* sunrpc/rpc/pmap_rmt.h: Likewise.
* sunrpc/rpc/auth_des.h: Likewise.
* elf/link.h: Likewise.
Reported by HJ Lu.
1997-02-17 01:45 a sun <asun@zoology.washington.edu>
Linux specific network headers.
* sysdeps/unix/sysv/linux/netinet/if_fddi.h: New file.
* sysdeps/unix/sysv/linux/netinet/if_tr.h: New file.
* sysdeps/unix/sysv/linux/netinet/ip_icmp.h: New file.
* sysdeps/unix/sysv/linux/netinet/ip_fw.h: New file.
* sysdeps/unix/sysv/linux/netinet/igmp.h: New file.
* sysdeps/unix/sysv/linux/netinet/icmp.h: New file.
* sysdeps/unix/sysv/linux/netinet/ip.h: New file.
* sysdeps/unix/sysv/linux/netinet/tcp.h: New file.
* sysdeps/unix/sysv/linux/netipx/ipx.h: New file.
* sysdeps/unix/sysv/linux/netatalk/atalk.h: New file.
* sysdeps/unix/sysv/linux/Dist: Add new network headers.
* sysdeps/unix/sysv/linux/Makefile [$(subdir)=misc] (sysdep_headers):
Add sys/quota.h.
[$(subdir)=inet] (sysdep_headers): Add new network header.
* sysdeps/unix/sysv/linux/netinet/udp.h: Add Linux specific changes.
* inet/netinet/ip.h: Move to sysdeps/generic.
* inet/netinet/tcp.h: Likewise.
* sysdeps/generic/netinet/ip.h: Moved to here from inet/netinet.
* sysdeps/generic/netinet/tcp.h: Likewise.
1997-02-17 01:18 Ulrich Drepper <drepper@cygnus.com>
* misc/sys/syslog.h (prioritynames): Correct definition to use
braces where necessary.
(facilitynames): Likewise.
Patch by Ronald F. Guilmette <rfg@monkeys.com>.
Comment and beautify declarations.
1997-02-16 19:54 1997 Philip Blundell <Philip.Blundell@pobox.com>
* inet/Makefile (routines): Add in6_addr, getnameinfo.
* inet/getnameinfo.c: New file. Implementation of getnameinfo()
by Craig Metz.
* inet/in6_addr.c: New file. IPv6 addressing constants.
* posix/Makefile (routines): Add gai_strerror.
* resolv/netdb.h: Add more constants for IPv6 basic API.
* sysdeps/posix/gai_strerror.c: New file.
* sysdeps/stub/gai_strerror.c New file.
* sysdeps/unix/sysv/linux/netinet/in.h: Add definitions for IPv6
basic API.
* sysdeps/posix/getaddrinfo.c: Update from latest version by
Craig Metz and use reentrant getXXbyYY functions.
1997-02-15 14:32 Andreas Jaeger <aj@arthur.pfalz.de>
* argp/argp.h: Declare argp_program_version as const char.
* argp/argp-test.c: Likewise
* stdlib/testrand.c (main): Declare main prototype.
* stdlib/testdiv.c (main): Likewise.
* string/testcopy.c (main): Likewise.
* string/test-ffs.c (main): Likewise.
* time/test_time.c (main): Likewise.
* locale/duplocale.c (__duplocale): Return result.
1997-02-16 03:54 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/unix/sysv/linux/netinet/in.h: Declare bindresvport.
Reported by fabsoft@fabserver1.zarm.uni-bremen.de.
* nss/nss.h: Remove declaration of __nss_shlib_revision.
* nss/nsswitch.c: Don't use NSS_SHLIB_VERSION macro.
1997-02-16 03:48 Thorsten Kukuk <kukuk@weber.uni-paderborn.de>
* nis/nss_nis/nis-ethers.c (_nss_nis_getethernam_r): Rename to
_nss_nis_gethostton_r.
(_nss_nis_getetherbyaddr_r): Rename to _nss_nis_getntohost_r.
1997-02-15 22:37 Andy Berkheimer <andy@tho.org>
* resolv/gethnamaddr.c (gethostbyname2): Test for ':' in name before
trying to resolv name as numeric IPv6 address.
* nss/digits_dots.c: Likewise.
Sat Feb 15 04:51:08 1997 Ulrich Drepper <drepper@cygnus.com>
* locale/setlocale.c (setlocale): Don't try to be clever about
unused locales. When the existence of the locale files isn't
tested the result of setlocale might be different.
1997-02-15 03:34 Ulrich Drepper <drepper@cygnus.com>
* locale/setlocale.c (setlocale): Don't increment usage_count of
new locale if it already has the value MAX_USAGE_COUNT (it might
be the C locale data which is read-only).
Diffstat (limited to 'inet/getnameinfo.c')
-rw-r--r-- | inet/getnameinfo.c | 238 |
1 files changed, 238 insertions, 0 deletions
diff --git a/inet/getnameinfo.c b/inet/getnameinfo.c new file mode 100644 index 0000000000..b9454f6396 --- /dev/null +++ b/inet/getnameinfo.c @@ -0,0 +1,238 @@ +/* The Inner Net License, Version 2.00 + + The author(s) grant permission for redistribution and use in source and +binary forms, with or without modification, of the software and documentation +provided that the following conditions are met: + +0. If you receive a version of the software that is specifically labelled + as not being for redistribution (check the version message and/or README), + you are not permitted to redistribute that version of the software in any + way or form. +1. All terms of the all other applicable copyrights and licenses must be + followed. +2. Redistributions of source code must retain the authors' copyright + notice(s), this list of conditions, and the following disclaimer. +3. Redistributions in binary form must reproduce the authors' copyright + notice(s), this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. +4. All advertising materials mentioning features or use of this software + must display the following acknowledgement with the name(s) of the + authors as specified in the copyright notice(s) substituted where + indicated: + + This product includes software developed by <name(s)>, The Inner + Net, and other contributors. + +5. Neither the name(s) of the author(s) nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + If these license terms cause you a real problem, contact the author. */ + +/* This software is Copyright 1996 by Craig Metz, All Rights Reserved. */ + +#define INET6 1 +#define LOCAL 1 +#define HOSTTABLE 0 + +#include <sys/types.h> +#include <sys/socket.h> + +#include <netinet/in.h> +#if LOCAL +#include <sys/un.h> +#include <sys/utsname.h> +#endif /* LOCAL */ +#include <netdb.h> +#include <errno.h> +#include <string.h> +#include <stdio.h> +#include <unistd.h> + +#ifndef AF_LOCAL +#define AF_LOCAL AF_UNIX +#endif /* AF_LOCAL */ + +#if HOSTTABLE +struct hostent *_addr2hostname_hosts(const char *, int, int); +#endif /* HOSTTABLE */ + +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 128 +#endif + +#ifndef min +#define min(x,y) (((x) > (y)) ? (y) : (x)) +#endif /* min */ + +static char *domain; +static char domainbuffer[MAXHOSTNAMELEN]; + + +static char * +nrl_domainname (void) +{ + static int first = 1; + + if (first) { + char *c; + struct hostent *h; + + first = 0; + + if ((h = gethostbyname("localhost")) && (c = strchr(h->h_name, '.'))) + return strcpy(domain = domainbuffer, ++c); + + if (!gethostname(domainbuffer, sizeof(domainbuffer))) { + if (c = strchr(domainbuffer, '.')) + return (domain = ++c); + + if ((h = gethostbyname(domainbuffer)) && (c = strchr(h->h_name, '.'))) + return strcpy(domain = domainbuffer, ++c); + } + + { + struct in_addr in_addr; + + in_addr.s_addr = htonl(0x7f000001); + + if ((h = gethostbyaddr((const char *)&in_addr, sizeof(struct in_addr), AF_INET)) && (c = strchr(h->h_name, '.'))) + return strcpy(domain = domainbuffer, ++c); + } + + return NULL; + }; + + return domain; +}; + +int getnameinfo(const struct sockaddr *sa, size_t addrlen, char *host, size_t hostlen, char *serv, size_t servlen, int flags) +{ + int serrno = errno; + + if (!sa) + return -1; + + if (host && (hostlen > 0)) + switch(sa->sa_family) { + case AF_INET: +#if INET6 + case AF_INET6: +#endif /* INET6 */ + if (!(flags & NI_NUMERICHOST)) { + struct hostent *h = NULL; +#if HOSTTABLE +#if INET6 + if (sa->sa_family == AF_INET6) + h = _addr2hostname_hosts((void *)&(((struct sockaddr_in6 *)sa)->sin6_addr), sizeof(struct in6_addr), AF_INET6); + else +#endif /* INET6 */ + h = _addr2hostname_hosts((void *)&(((struct sockaddr_in *)sa)->sin_addr), sizeof(struct in_addr), AF_INET); +#endif /* HOSTTABLE */ + +#if RESOLVER + if (!h) { +#if INET6 + if (sa->sa_family == AF_INET6) + h = gethostbyaddr((void *)&(((struct sockaddr_in6 *)sa)->sin6_addr), sizeof(struct in6_addr), AF_INET6); + else +#endif /* INET6 */ + h = gethostbyaddr((void *)&(((struct sockaddr_in *)sa)->sin_addr), sizeof(struct in_addr), AF_INET); + endhostent(); + }; +#endif /* RESOLVER */ + + if (h) { + if (flags & NI_NOFQDN) { + char *c; + if ((c = nrl_domainname()) && (c = strstr(h->h_name, c)) && (c != h->h_name) && (*(--c) == '.')) { + strncpy(host, h->h_name, min(hostlen, (c - h->h_name))); + break; + }; + }; + strncpy(host, h->h_name, hostlen); + break; + }; + }; + + if (flags & NI_NAMEREQD) + goto fail; + + { + const char *c; +#if INET6 + if (sa->sa_family == AF_INET6) + c = inet_ntop(AF_INET6, (void *)&(((struct sockaddr_in6 *)sa)->sin6_addr), host, hostlen); + else +#endif /* INET6 */ + c = inet_ntop(AF_INET, (void *)&(((struct sockaddr_in *)sa)->sin_addr), host, hostlen); + + if (!c) + goto fail; + }; + break; +#if LOCAL + case AF_LOCAL: + if (!(flags & NI_NUMERICHOST)) { + struct utsname utsname; + + if (!uname(&utsname)) { + strncpy(host, utsname.nodename, hostlen); + break; + }; + }; + + if (flags & NI_NAMEREQD) + goto fail; + + strncpy(host, "localhost", hostlen); + break; +#endif /* LOCAL */ + default: + return -1; + }; + + if (serv && (servlen > 0)) + switch(sa->sa_family) { + case AF_INET: +#if INET6 + case AF_INET6: +#endif /* INET6 */ + if (!(flags & NI_NUMERICSERV)) { + struct servent *s; + if (s = getservbyport(((struct sockaddr_in *)sa)->sin_port, (flags & NI_DGRAM) ? "udp" : "tcp")) { + strncpy(serv, s->s_name, servlen); + break; + }; + }; + snprintf(serv, servlen, "%d", ntohs(((struct sockaddr_in *)sa)->sin_port)); + break; +#if LOCAL + case AF_LOCAL: + strncpy(serv, ((struct sockaddr_un *)sa)->sun_path, servlen); + break; +#endif /* LOCAL */ + }; + + if (host && (hostlen > 0)) + host[hostlen-1] = 0; + if (serv && (servlen > 0)) + serv[servlen-1] = 0; + errno = serrno; + return 0; + +fail: + errno = serrno; + return -1; +}; |