1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-08 17:42:12 +03:00

update from main archive 961214

Sun Dec 15 01:53:20 1996  Ulrich Drepper  <drepper@cygnus.com>

	* Makefile (subdirs): Change crypt to md5-crypt.
	* crypt/Makefile, crypt/md5-crypt.c, crypt/md5.c, crypt/md5.h,
	crypt/md5c-test.c, crypt/md5test.c: Move to new directory
	md5-crypt.
	* sysdeps/unix/sysv/linux/configure.in: Refer to linuxthreads and
	crypt instead of LinuxThreads and des-crypt.

	* Makefile (subdirs): Add nss back.
	* sysdeps/unix/inet/Subdirs: Move nis to end of file to fulfill
	dependencies.

	* libio/iofclose.c: Implement fclose(NULL) as closing all streams.
	* stdio-common/Makefile (routines): Add fcloseall.
	* stdio-common/fcloseall.c: New file.
	* sysdeps/generic/abort.c: Make implementation POSIX.1 compatible.

	* sysdeps/mach/libc-lock.h: Add definition of __libc_lock_trylock.
	* sysdeps/stub/libc-lock.h: Define __libc_lock_trylock to always
	return 0.

	* stdio-common/printf.h: Define MIN and MAX only if not already
	defined.

	* stdio-common/vfprintf.c: Set errno to EBADF if stream does not
	allow writing.  Required by POSIX.1.

	* libio/libioP.h (CHECK_FILE): Use MAYBE_SET_EINVAL instead of
	assignment.

	* interp.c: Update copyright.
	* libio/clearerr.c: Likewise.
	* libio/ioseekoff.c: Likewise.
	* libio/ioseekpos.c: Likewise.
	* stdio/fclose.c: Likewise.
	* stdio/fflus.c: Likewise.

	* libio/libio.h [!_IO_MTSAFE_IO]: Define _IO_cleanup_region_start
	and _IO_cleanup_region_end as empty.
	* libio/fgetc.c: Use _IO_cleanup_region_start and
	_IO_cleanup_region_end instead of __libc_cleanup_region_start and
	__libc_cleanup_region_end.
	* libio/fputc.c: Likewise.
	* libio/freopen.c: Likewise.
	* libio/fseek.c: Likewise.
	* libio/getc.c: Likewise.
	* libio/getchar.c: Likewise.
	* libio/iofclose.c: Likewise.
	* libio/iofflush.c: Likewise.
	* libio/iofgetpos.c: Likewise.
	* libio/iofgets.c: Likewise.
	* libio/iofputs.c: Likewise.
	* libio/iofread.c: Likewise.
	* libio/iofsetpos.c: Likewise.
	* libio/ioftell.c: Likewise.
	* libio/iofwrite.c: Likewise.
	* libio/iogetdelim.c: Likewise.
	* libio/iogets.c: Likewise.
	* libio/ioputs.c: Likewise.
	* libio/iosetbuffer.c: Likewise.
	* libio/iosetvbuf.c: Likewise.
	* libio/ioungetc.c: Likewise.

	* libio/iovspintf.c: Use cleanup handler to make sure no dangling
	locks can stay over.
	* libio/iovsscanf.c: Likewise.

	* libio/genops.c: Use _IO_lock_init_recursive and _IO_lock_fini
	instead of __libc_lock_init_recursive and __libc_lock_fini.

	* libio/filedoalloc.c: Only use __isatty when compiling GNU libc.
	Otherwise use isatty.
	* libio/fileops.c: Likewise for __open and open.

	* login/utmp_file.c (getutent_r_file): Use fcntl instead of
	flock.

	* nis/ypclnt.h: Add more casts to prevent warnings.

	* nss/Makefile (services): Remove dns.
	(libnss_dns, libnss_dns-inhibit-o): Remove definition.
	($(objpfx)libnss_dns.so): Removed.
	* nss/nss_dns/dns-host.c, nss/nss_dns/dns-network.c: Moved to...
	* resolv/nss_dns: ...here.
	* resolv/Makefile (extra-libs): Add libnss_dns.
	(libnss_dns-routines, libnss_dns-inhibit-o): Define as in
	nss/Makefile.

	* nss/XXX-lookup.c: Call __nss_database_lookup with new argument
	specifying alternate name for entry in /etc/nsswitch.conf
	* nss/nsswitch.c: If no entry with primary name is found in
	/etc/nsswitch.conf try alternate name if given.
	* nss/nsswitch.h: Add new parameter in prototype for
	__nss_database_lookup.
	* nss/spwd-lookup.c: Provide alternative entry name to look for.
	This makes our NSS compatible with Solaris' nsswitch.conf files.

	* string/tst-strlen.c: Change all counting variables to type size_t
	to prevent warnings.

	* sysdeps/posix/fpathconf.c: Update copyright.
	* sysdeps/posix/pathconf.c: Don't call fpathconf to do the work.
	Opening the file at this path may fail if it is a FIFO or pipe.

	These changes make the time implementation POSIX.1 compliant.
	* time/localtime.c (__localtime_r): Always call __tzset not only
	if __tzset_run is zero.
	* time/strftime.c: Add definition of memset_space to help to
	reduce for systems which have memset.
	(strftime): Don't use tm_zone member of argument for zone name.
	Instead always use tzname[].
	Call tzset() as required by POSIX.1 before any action.
	* time/tzset.c (tzset): Set tzname[] as required by POSIX.1.
	Remove global variable __tzset_run.  __tzset is now called always
	when a dependent function is used.
	(__tzset): Caching happens based on the contents of the
	environment variable TZ.

Fri Dec 13 01:06:52 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/unix/sysv/linux/paths.h: Add _PATH_KLOG.

Thu Dec 12 09:16:35 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* rellns-sh: Correctly handle a relative source file name.

Wed Dec 11 19:18:40 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* login/utmp_file.c (setutent_file): Seek back to beginning of the
	file if resetting.

Thu Dec 12 16:39:12 1996  Thomas Bushnell, n/BSG  <thomas@gnu.ai.mit.edu>

	* hurd/hurdinit.c (map0): Delete function.  Don't do this on
	_hurd_preinit_hook.
	* hurd/hurdstartup.c (_hurd_startup): Map page zero redzone here.
This commit is contained in:
Ulrich Drepper
1996-12-15 02:15:29 +00:00
parent f8b87ef0d4
commit 68dbb3a69e
74 changed files with 1723 additions and 348 deletions

View File

@@ -0,0 +1,343 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996.
The GNU C 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.
The GNU C 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 the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Parts of this file are plain copies of the file `getnetnamadr.c' from
the bind package and it has the following copyright. */
/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro
* Dep. Matematica Universidade de Coimbra, Portugal, Europe
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*/
/*
* Copyright (c) 1983, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University 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 THE REGENTS 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 REGENTS 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.
*/
#include <ctype.h>
#include <errno.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "nsswitch.h"
#include <arpa/inet.h>
/* Maximum number of aliases we allow. */
#define MAX_NR_ALIASES 48
#if PACKETSZ > 1024
#define MAXPACKET PACKETSZ
#else
#define MAXPACKET 1024
#endif
typedef enum
{
BYADDR,
BYNAME
} lookup_method;
/* We need this time later. */
typedef union querybuf
{
HEADER hdr;
u_char buf[MAXPACKET];
} querybuf;
/* Protortypes for local functions. */
static enum nss_status getanswer_r (const querybuf *answer, int anslen,
struct netent *result, char *buffer,
int buflen, lookup_method net_i);
enum nss_status
_nss_dns_getnetbyname_r (const char *name, struct netent *result,
char *buffer, int buflen)
{
/* Return entry for network with NAME. */
querybuf net_buffer;
int anslen;
char *qbuf;
qbuf = strdupa (name);
anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
sizeof (querybuf));
if (anslen < 0)
/* Nothing found. */
return (errno == ECONNREFUSED
|| errno == EPFNOSUPPORT
|| errno == EAFNOSUPPORT)
? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
}
enum nss_status
_nss_dns_getnetbyaddr_r (long net, int type, struct netent *result,
char *buffer, int buflen)
{
/* Return entry for network with NAME. */
enum nss_status status;
querybuf net_buffer;
unsigned int net_bytes[4];
char qbuf[MAXDNAME];
int cnt, anslen;
u_int32_t net2;
/* No net address lookup for IPv6 yet. */
if (type != AF_INET)
return NSS_STATUS_UNAVAIL;
net2 = (u_int32_t) net;
for (cnt = 4; net2 != 0; net2 >>= 8)
net_bytes[--cnt] = net2 & 0xff;
switch (cnt)
{
case 3:
/* Class A network. */
sprintf (qbuf, "0.0.0.%u.in-addr.arpa", net_bytes[3]);
break;
case 2:
/* Class B network. */
sprintf (qbuf, "0.0.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2]);
break;
case 1:
/* Class C network. */
sprintf (qbuf, "0.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2],
net_bytes[1]);
break;
case 0:
/* Class D - E network. */
sprintf (qbuf, "%u.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2],
net_bytes[1], net_bytes[0]);
break;
}
anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
sizeof (querybuf));
if (anslen < 0)
/* Nothing found. */
return (errno == ECONNREFUSED
|| errno == EPFNOSUPPORT
|| errno == EAFNOSUPPORT)
? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
if (status == NSS_STATUS_SUCCESS)
{
/* Strip trailing zeros. */
unsigned int u_net = net; /* Maybe net should be unsigned? */
while ((u_net & 0xff) == 0 && u_net != 0)
u_net >>= 8;
result->n_net = u_net;
}
return status;
}
#undef offsetof
#define offsetof(Type, Member) ((size_t) &((Type *) NULL)->Member)
static enum nss_status
getanswer_r (const querybuf *answer, int anslen, struct netent *result,
char *buffer, int buflen, lookup_method net_i)
{
/*
* Find first satisfactory answer
*
* answer --> +------------+ ( MESSAGE )
* | Header |
* +------------+
* | Question | the question for the name server
* +------------+
* | Answer | RRs answering the question
* +------------+
* | Authority | RRs pointing toward an authority
* | Additional | RRs holding additional information
* +------------+
*/
struct net_data
{
char *aliases[MAX_NR_ALIASES];
char linebuffer[0];
} *net_data = (struct net_data *) buffer;
int linebuflen = buflen - offsetof (struct net_data, linebuffer);
const char *end_of_message = &answer->buf[anslen];
const HEADER *header_pointer = &answer->hdr;
/* #/records in the answer section. */
int answer_count = ntohs (header_pointer->ancount);
/* #/entries in the question section. */
int question_count = ntohs (header_pointer->qdcount);
char *bp = net_data->linebuffer;
const char *cp = &answer->buf[HFIXEDSZ];
char **alias_pointer;
int have_answer;
char *ans;
if (question_count == 0)
/* FIXME: the Sun version uses for host name lookup an additional
parameter for pointing to h_errno. this is missing here.
OSF/1 has a per-thread h_errno variable. */
if (header_pointer->aa != 0)
{
__set_h_errno (HOST_NOT_FOUND);
return NSS_STATUS_NOTFOUND;
}
else
{
__set_h_errno (TRY_AGAIN);
return NSS_STATUS_TRYAGAIN;
}
/* Skip the question part. */
while (question_count-- > 0)
cp += __dn_skipname (cp, end_of_message) + QFIXEDSZ;
alias_pointer = result->n_aliases = &net_data->aliases[0];
*alias_pointer = NULL;
have_answer = 0;
ans = NULL;
while (--answer_count >= 0 && cp < end_of_message)
{
int n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
int type, class;
if (n < 0 || res_dnok (bp) == 0)
break;
cp += n;
ans = strdupa (bp);
GETSHORT (type, cp);
GETSHORT (class, cp);
cp += INT32SZ; /* TTL */
GETSHORT (n, cp);
if (class == C_IN && type == T_PTR)
{
n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen);
if (n < 0 || !res_hnok (bp))
{
/* XXX What does this mean? The original form from bind
returns NULL. Incrementing cp has no effect in any case.
What should I return here. ??? */
cp += n;
return NSS_STATUS_UNAVAIL;
}
cp += n;
*alias_pointer++ = bp;
bp += strlen (bp) + 1;
result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC;
++have_answer;
}
}
if (have_answer)
{
char *tmp;
int len;
char *in, *cp, *rp, *wp;
int cnt, first_flag;
*alias_pointer = NULL;
switch (net_i)
{
case BYADDR:
result->n_name = result->n_aliases[0];
result->n_net = 0L;
break;
case BYNAME:
len = strlen (result->n_aliases[0]);
tmp = (char *) alloca (len + 1);
tmp[len] = 0;
wp = &tmp[len - 1];
rp = in = result->n_aliases[0];
result->n_name = ans;
first_flag = 1;
for (cnt = 0; cnt < 4; ++cnt)
{
char *startp;
startp = rp;
while (*rp != '.')
++rp;
if (rp - startp > 1 || *startp != '0' || !first_flag)
{
first_flag = 0;
if (cnt > 0)
*wp-- = '.';
cp = rp;
while (cp > startp)
*wp-- = *--cp;
}
in = rp + 1;
}
result->n_net = inet_network (wp);
break;
}
++result->n_aliases;
return NSS_STATUS_SUCCESS;
}
__set_h_errno (TRY_AGAIN);
return NSS_STATUS_TRYAGAIN;
}