1998-04-14 16:34  Ulrich Drepper  <drepper@cygnus.com>

	* test-skeleton.c: Provide hook for initializing code before the fork.
	* rt/tst-aio.c: Use PREPARE hook to make suer temp files are always
	removed.

	* libio/fcloseall.c (__fcloseall): Return return value of _IO_cleanup.
	* libio/genops.c (_IO_cleanup): Return return value of _IO_flush_all.
	* libio/libioP.h: Adopt _IO_cleanup prototype.

	* stdlib/Makefile (tests): Add test-canon2.
	* stdlib/test-canon2.c: New file.
	* stdlib/canonicalize.c (canonicalize): Allow RESOLVED parameter to
	be NULL.  Use __lxstat, not __lstat.  Correctly recognize long
	symlink sequences.
	(__realpath): Make real function which checks RESOLVED parameter for
	not being NULL.

1998-04-14  Ulrich Drepper  <drepper@cygnus.com>

	* catgets/open_catalog.c (__open_catalog): Fix problems with
	reading non-files.  Always close file.
	Reported by Cristian Gafton <gafton@redhat.com>.

	* elf/dl-minimal.c (__strtol_internal): Prevent overflow warnings.

1998-04-14 13:28  Ulrich Drepper  <drepper@cygnus.com>

	* libc.map: Add various low-level I/O functions.

1998-04-14 10:35  Ulrich Drepper  <drepper@cygnus.com>

	* string/Makefile (routines): Remove strerror_r.
	* string/strerror_r.c: Removed.
	* string/strerror.c: Call __strerror_r for doing the real work.
	* sysdeps/generic/_strerror.c: Rename function to __strerror_r and
	add weak alias strerror_r.
	* sysdeps/mach/_strerror.c: Likewise.
	* assert/assert-perr.c: Use __strerror_r instead of _strerror_internal.
	* elf/dl-error.c (_dl_signal_error): Likewise.
	* elf/dl-profile.c (_dl_start_profile): Likewise.
	* gmon/gmon.c (write_gmon): Likewise.
	* stdio-common/perror.c: Likewise.
	* stdio-common/vfprintf.c: Likewise.

1998-04-10  Mark Kettenis  <kettenis@phys.uva.nl>

	* sysdeps/unix/sysv/linux/Makefile [$(subdir)=inet]
	(sysdep_headers): Add netatalk/at.h.

1998-04-12  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* manual/socket.texi, manual/creature.texi, manual/time.texi:
	Formatting fixes.

1998-04-13  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* posix/regex.c: Rename __re_syntax_options back to
	re_syntax_options, aliases do not work with global variables due
	to copy relocations.
	(regex_compile): Use syntax parameter instead of
	re_syntax_options.

1998-04-14  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* configure.in: Document that enable-force-install is default.
This commit is contained in:
Ulrich Drepper 1998-04-14 16:51:08 +00:00
parent bbdc8261f8
commit 310b3460e0
32 changed files with 278 additions and 157 deletions

View File

@ -17,9 +17,9 @@ distinfo
test-include test-include
analysis analysis
docs docs
releases
crypt crypt
linuxthreads linuxthreads
secure_rpc
aio aio

View File

@ -1,3 +1,70 @@
1998-04-14 16:34 Ulrich Drepper <drepper@cygnus.com>
* test-skeleton.c: Provide hook for initializing code before the fork.
* rt/tst-aio.c: Use PREPARE hook to make suer temp files are always
removed.
* libio/fcloseall.c (__fcloseall): Return return value of _IO_cleanup.
* libio/genops.c (_IO_cleanup): Return return value of _IO_flush_all.
* libio/libioP.h: Adopt _IO_cleanup prototype.
* stdlib/Makefile (tests): Add test-canon2.
* stdlib/test-canon2.c: New file.
* stdlib/canonicalize.c (canonicalize): Allow RESOLVED parameter to
be NULL. Use __lxstat, not __lstat. Correctly recognize long
symlink sequences.
(__realpath): Make real function which checks RESOLVED parameter for
not being NULL.
1998-04-14 Ulrich Drepper <drepper@cygnus.com>
* catgets/open_catalog.c (__open_catalog): Fix problems with
reading non-files. Always close file.
Reported by Cristian Gafton <gafton@redhat.com>.
* elf/dl-minimal.c (__strtol_internal): Prevent overflow warnings.
1998-04-14 13:28 Ulrich Drepper <drepper@cygnus.com>
* libc.map: Add various low-level I/O functions.
1998-04-14 10:35 Ulrich Drepper <drepper@cygnus.com>
* string/Makefile (routines): Remove strerror_r.
* string/strerror_r.c: Removed.
* string/strerror.c: Call __strerror_r for doing the real work.
* sysdeps/generic/_strerror.c: Rename function to __strerror_r and
add weak alias strerror_r.
* sysdeps/mach/_strerror.c: Likewise.
* assert/assert-perr.c: Use __strerror_r instead of _strerror_internal.
* elf/dl-error.c (_dl_signal_error): Likewise.
* elf/dl-profile.c (_dl_start_profile): Likewise.
* gmon/gmon.c (write_gmon): Likewise.
* stdio-common/perror.c: Likewise.
* stdio-common/vfprintf.c: Likewise.
1998-04-10 Mark Kettenis <kettenis@phys.uva.nl>
* sysdeps/unix/sysv/linux/Makefile [$(subdir)=inet]
(sysdep_headers): Add netatalk/at.h.
1998-04-12 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* manual/socket.texi, manual/creature.texi, manual/time.texi:
Formatting fixes.
1998-04-13 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* posix/regex.c: Rename __re_syntax_options back to
re_syntax_options, aliases do not work with global variables due
to copy relocations.
(regex_compile): Use syntax parameter instead of
re_syntax_options.
1998-04-14 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* configure.in: Document that enable-force-install is default.
1998-04-13 Ulrich Drepper <drepper@cygnus.com> 1998-04-13 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/posix/mktemp.c: Increment `value' in a way which touches * sysdeps/posix/mktemp.c: Increment `value' in a way which touches

2
FAQ.in
View File

@ -945,7 +945,7 @@ Also, make sure you have a suitably recent kernel. As of the 970401
snapshot, according to Philip Blundell <Philip.Blundell@pobox.com>, the snapshot, according to Philip Blundell <Philip.Blundell@pobox.com>, the
required kernel version is at least 2.1.30. required kernel version is at least 2.1.30.
?? When I set the timezone I'm by setting the TZ environment variable ?? When I set the timezone by setting the TZ environment variable
to EST5EDT things go wrong since glibc computes the wrong time to EST5EDT things go wrong since glibc computes the wrong time
from this information. from this information.

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1994, 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -22,10 +22,6 @@
#include <sysdep.h> #include <sysdep.h>
/* This is the internal function we use to generate the error string. */
extern char *_strerror_internal __P ((int, char *, size_t));
extern const char *__assert_program_name; /* In assert.c. */ extern const char *__assert_program_name; /* In assert.c. */
/* This function, when passed an error number, a filename, and a line /* This function, when passed an error number, a filename, and a line
@ -53,7 +49,7 @@ __assert_perror_fail (int errnum,
__assert_program_name ? ": " : "", __assert_program_name ? ": " : "",
file, line, file, line,
function ? function : "", function ? ": " : "", function ? function : "", function ? ": " : "",
_strerror_internal (errnum, errbuf, sizeof errbuf)); __strerror_r (errnum, errbuf, sizeof errbuf));
(void) fflush (stderr); (void) fflush (stderr);
abort (); abort ();

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>. Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
@ -35,7 +35,7 @@
void void
__open_catalog (__nl_catd catalog) __open_catalog (__nl_catd catalog)
{ {
int fd; int fd = -1;
struct stat st; struct stat st;
int swapping; int swapping;
@ -169,7 +169,8 @@ __open_catalog (__nl_catd catalog)
} }
} }
if (fd < 0 || __fstat (fd, &st) < 0) /* Avoid dealing with directories and block devices */
if (fd < 0 || __fstat (fd, &st) < 0 || !S_ISREG (st.st_mode))
{ {
catalog->status = nonexisting; catalog->status = nonexisting;
goto unlock_return; goto unlock_return;
@ -225,6 +226,7 @@ __open_catalog (__nl_catd catalog)
/* We don't need the file anymore. */ /* We don't need the file anymore. */
__close (fd); __close (fd);
fd = -1;
/* Determine whether the file is a catalog file and if yes whether /* Determine whether the file is a catalog file and if yes whether
it is written using the correct byte order. Else we have to swap it is written using the correct byte order. Else we have to swap
@ -271,5 +273,7 @@ __open_catalog (__nl_catd catalog)
/* Release the lock again. */ /* Release the lock again. */
unlock_return: unlock_return:
if (fd != -1)
__close (fd);
__libc_lock_unlock (catalog->lock); __libc_lock_unlock (catalog->lock);
} }

2
configure vendored
View File

@ -63,7 +63,7 @@ ac_help="$ac_help
ac_help="$ac_help ac_help="$ac_help
--enable-static-nss build static NSS modules [default=no]" --enable-static-nss build static NSS modules [default=no]"
ac_help="$ac_help ac_help="$ac_help
--enable-force-install force installation of files from this package, --disable-force-install don't force installation of files from this package,
even if they are older than the installed files" even if they are older than the installed files"
# Initialize some variables set by options. # Initialize some variables set by options.

View File

@ -128,7 +128,7 @@ if test x"$static_nss" = xyes; then
fi fi
AC_ARG_ENABLE(force-install, AC_ARG_ENABLE(force-install,
[ --enable-force-install force installation of files from this package, [ --disable-force-install don't force installation of files from this package,
even if they are older than the installed files], even if they are older than the installed files],
force_install=$enableval, force_install=yes) force_install=$enableval, force_install=yes)
AC_SUBST(force_install) AC_SUBST(force_install)

View File

@ -23,9 +23,6 @@
#include <unistd.h> #include <unistd.h>
#include <elf/ldsodefs.h> #include <elf/ldsodefs.h>
/* This is the internal function we use to generate the error string. */
extern char *_strerror_internal __P ((int, char *, size_t));
/* This structure communicates state between _dl_catch_error and /* This structure communicates state between _dl_catch_error and
_dl_signal_error. */ _dl_signal_error. */
struct catch struct catch
@ -89,7 +86,7 @@ _dl_signal_error (int errcode,
objname ?: "", objname && *objname ? ": " : "", objname ?: "", objname && *objname ? ": " : "",
errstring, errcode ? ": " : "", errstring, errcode ? ": " : "",
(errcode (errcode
? _strerror_internal (errcode, buffer, sizeof buffer) ? __strerror_r (errcode, buffer, sizeof buffer)
: ""), "\n", NULL); : ""), "\n", NULL);
} }
} }

View File

@ -131,7 +131,7 @@ longjmp (jmp_buf env, int val)
in the whole error list. */ in the whole error list. */
char * weak_function char * weak_function
_strerror_internal (int errnum, char *buf, size_t buflen) __strerror_r (int errnum, char *buf, size_t buflen)
{ {
char *msg; char *msg;
@ -205,11 +205,10 @@ __assert_perror_fail (int errnum,
#endif #endif
/* This function is only used in eval.c. */ /* This function is only used in eval.c. */
long int long int weak_function
weak_function
__strtol_internal (const char *nptr, char **endptr, int base, int group) __strtol_internal (const char *nptr, char **endptr, int base, int group)
{ {
long int result = 0; unsigned long int result = 0;
long int sign = 1; long int sign = 1;
while (*nptr == ' ' || *nptr == '\t') while (*nptr == ' ' || *nptr == '\t')
@ -246,10 +245,14 @@ __strtol_internal (const char *nptr, char **endptr, int base, int group)
while (*nptr >= '0' && *nptr <= '9') while (*nptr >= '0' && *nptr <= '9')
{ {
long int digval = *nptr - '0'; unsigned long int digval = *nptr - '0';
if (result > LONG_MAX / 10 if (result > LONG_MAX / 10
|| (result == (sign ? LONG_MAX : LONG_MAX + 1) / 10 || (result == (sign
&& digval > (sign ? LONG_MAX : LONG_MAX + 1) % 10)) ? (unsigned long int) LONG_MAX
: (unsigned long int) LONG_MAX + 1) / 10
&& digval > (sign
? (unsigned long int) LONG_MAX
: (unsigned long int) LONG_MAX + 1) % 10))
{ {
errno = ERANGE; errno = ERANGE;
return LONG_MAX * sign; return LONG_MAX * sign;
@ -258,21 +261,19 @@ __strtol_internal (const char *nptr, char **endptr, int base, int group)
result += digval; result += digval;
} }
return result * sign; return (long int) result * sign;
} }
long int long int weak_function
weak_function
strtol (const char *nptr, char **endptr, int base) strtol (const char *nptr, char **endptr, int base)
{ {
return __strtol_internal (nptr, endptr, base, 0); return __strtol_internal (nptr, endptr, base, 0);
} }
unsigned long int unsigned long int weak_function
weak_function
__strtoul_internal (const char *nptr, char **endptr, int base, int group) __strtoul_internal (const char *nptr, char **endptr, int base, int group)
{ {
long int result = 0; unsigned long int result = 0;
long int sign = 1; long int sign = 1;
while (*nptr == ' ' || *nptr == '\t') while (*nptr == ' ' || *nptr == '\t')
@ -309,7 +310,7 @@ __strtoul_internal (const char *nptr, char **endptr, int base, int group)
while (*nptr >= '0' && *nptr <= '9') while (*nptr >= '0' && *nptr <= '9')
{ {
long int digval = *nptr - '0'; unsigned long int digval = *nptr - '0';
if (result > LONG_MAX / 10 if (result > LONG_MAX / 10
|| (result == ULONG_MAX / 10 && digval > ULONG_MAX % 10)) || (result == ULONG_MAX / 10 && digval > ULONG_MAX % 10))
{ {
@ -323,8 +324,7 @@ __strtoul_internal (const char *nptr, char **endptr, int base, int group)
return result * sign; return result * sign;
} }
unsigned long int unsigned long int weak_function
weak_function
strtoul (const char *nptr, char **endptr, int base) strtoul (const char *nptr, char **endptr, int base)
{ {
return (unsigned long int) __strtoul_internal (nptr, endptr, base, 0); return (unsigned long int) __strtoul_internal (nptr, endptr, base, 0);

View File

@ -124,8 +124,6 @@ extern ssize_t __libc_write __P ((int __fd, __const __ptr_t __buf,
data structures at the program start. To do this we'll simply visit all data structures at the program start. To do this we'll simply visit all
entries in the call graph table and add it to the appropriate list. */ entries in the call graph table and add it to the appropriate list. */
extern char *_strerror_internal __P ((int, char *buf, size_t));
extern int __profile_frequency __P ((void)); extern int __profile_frequency __P ((void));
/* We define a special type to address the elements of the arc table. /* We define a special type to address the elements of the arc table.
@ -271,7 +269,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
/* We cannot write the profiling data so don't do anything. */ /* We cannot write the profiling data so don't do anything. */
char buf[400]; char buf[400];
_dl_sysdep_message (filename, ": cannot open file: ", _dl_sysdep_message (filename, ": cannot open file: ",
_strerror_internal (errno, buf, sizeof buf), __strerror_r (errno, buf, sizeof buf),
"\n", NULL); "\n", NULL);
return; return;
} }
@ -283,7 +281,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
int errnum = errno; int errnum = errno;
__close (fd); __close (fd);
_dl_sysdep_message (filename, ": cannot stat file: ", _dl_sysdep_message (filename, ": cannot stat file: ",
_strerror_internal (errnum, buf, sizeof buf), __strerror_r (errnum, buf, sizeof buf),
"\n", NULL); "\n", NULL);
return; return;
} }
@ -305,7 +303,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
errnum = errno; errnum = errno;
__close (fd); __close (fd);
_dl_sysdep_message (filename, ": cannot create file: ", _dl_sysdep_message (filename, ": cannot create file: ",
_strerror_internal (errnum, buf, sizeof buf), __strerror_r (errnum, buf, sizeof buf),
"\n", NULL); "\n", NULL);
return; return;
} }
@ -337,7 +335,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
int errnum = errno; int errnum = errno;
__close (fd); __close (fd);
_dl_sysdep_message (filename, ": cannot map file: ", _dl_sysdep_message (filename, ": cannot map file: ",
_strerror_internal (errnum, buf, sizeof buf), __strerror_r (errnum, buf, sizeof buf),
"\n", NULL); "\n", NULL);
return; return;
} }

View File

@ -46,8 +46,6 @@
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
extern char *_strerror_internal __P ((int, char *buf, size_t));
extern int __profile_frequency __P ((void)); extern int __profile_frequency __P ((void));
struct __bb *__bb_head; /* Head of basic-block list or NULL. */ struct __bb *__bb_head; /* Head of basic-block list or NULL. */
@ -330,7 +328,7 @@ write_gmon (void)
char buf[300]; char buf[300];
int errnum = errno; int errnum = errno;
fprintf (stderr, "_mcleanup: gmon.out: %s\n", fprintf (stderr, "_mcleanup: gmon.out: %s\n",
_strerror_internal (errnum, buf, sizeof buf)); __strerror_r (errnum, buf, sizeof buf));
return; return;
} }
} }

View File

@ -146,7 +146,8 @@ GLIBC_2.0 {
# b* # b*
basename; bcmp; bcopy; bdflush; bind; bindresvport; basename; bcmp; bcopy; bdflush; bind; bindresvport;
bindtextdomain; brk; bsd_signal; bsearch; btowc; bzero; bindtextdomain; brk; bsd_signal; bsearch; btowc; bus_base; bus_base_sparse;
bzero;
# c* # c*
cachectl; cacheflush; calloc; callrpc; canonicalize_file_name; cachectl; cacheflush; calloc; callrpc; canonicalize_file_name;
@ -225,14 +226,14 @@ GLIBC_2.0 {
globfree; gmtime; gmtime_r; group_member; gsignal; gtty; globfree; gmtime; gmtime_r; group_member; gsignal; gtty;
# h* # h*
hasmntopt; hcreate; hcreate_r; hdestroy; hdestroy_r; herror; hae_shift; hasmntopt; hcreate; hcreate_r; hdestroy; hdestroy_r; herror;
hsearch; hsearch_r; hstrerror; htonl; htons; hsearch; hsearch_r; hstrerror; htonl; htons;
# i* # i*
index; inet_addr; inet_aton; inet_lnaof; inet_makeaddr; inb; index; inet_addr; inet_aton; inet_lnaof; inet_makeaddr;
inet_netof; inet_network; inet_nsap_addr; inet_nsap_ntoa; inet_ntoa; inet_netof; inet_network; inet_nsap_addr; inet_nsap_ntoa; inet_ntoa;
inet_ntop; inet_pton; init_module; initgroups; initstate; initstate_r; inet_ntop; inet_pton; init_module; initgroups; initstate; initstate_r;
innetgr; insque; ioctl; ioperm; iopl; iruserok; inl; innetgr; insque; inw; ioctl; ioperm; iopl; iruserok;
isalnum; isalpha; isascii; isatty; isblank; iscntrl; isdigit; isalnum; isalpha; isascii; isatty; isblank; iscntrl; isdigit;
isfdtype; isgraph; isinf; isinff; isinfl; islower; isnan; isnanf; isfdtype; isgraph; isinf; isinff; isinfl; islower; isnan; isnanf;
@ -275,7 +276,7 @@ GLIBC_2.0 {
# o* # o*
obstack_free; obstack_printf; obstack_vprintf; on_exit; open; obstack_free; obstack_printf; obstack_vprintf; on_exit; open;
open_memstream; opendir; openlog; open_memstream; opendir; openlog; outb; outl; outw;
# p* # p*
parse_printf_format; pathconf; pause; pciconfig_read; parse_printf_format; pathconf; pause; pciconfig_read;
@ -328,7 +329,7 @@ GLIBC_2.0 {
semctl; semget; semop; send; sendmsg; sendto; setaliasent; setbuf; semctl; semget; semop; send; sendmsg; sendto; setaliasent; setbuf;
setbuffer; setcontext; setbuffer; setcontext;
setdomainname; setegid; setenv; seteuid; setfsent; setdomainname; setegid; setenv; seteuid; setfsent;
setfsgid; setfsuid; setgid; setgrent; setgroups; sethostent; setfsgid; setfsuid; setgid; setgrent; setgroups; sethae; sethostent;
sethostid; sethostname; setitimer; setjmp; setlinebuf; setlocale; sethostid; sethostname; setitimer; setjmp; setlinebuf; setlocale;
setlogin; setlogmask; setmntent; setnetent; setnetgrent; setpgid; setlogin; setlogmask; setmntent; setnetent; setnetgrent; setpgid;
setpgrp; setpriority; setprotoent; setpwent; setregid; setresgid; setpgrp; setpriority; setprotoent; setpwent; setregid; setresgid;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU IO Library. This file is part of the GNU IO Library.
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
@ -30,8 +30,7 @@ int
__fcloseall () __fcloseall ()
{ {
/* Close all streams. */ /* Close all streams. */
_IO_cleanup (); return _IO_cleanup ();
return 0;
} }
#ifdef weak_alias #ifdef weak_alias

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993, 1995, 1997 Free Software Foundation, Inc. /* Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU IO Library. This file is part of the GNU IO Library.
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
@ -714,10 +714,10 @@ _IO_unbuffer_all ()
_IO_SETBUF (fp, NULL, 0); _IO_SETBUF (fp, NULL, 0);
} }
void int
_IO_cleanup () _IO_cleanup ()
{ {
_IO_flush_all (); int result = _IO_flush_all ();
/* We currently don't have a reliable mechanism for making sure that /* We currently don't have a reliable mechanism for making sure that
C++ static destructors are executed in the correct order. C++ static destructors are executed in the correct order.
@ -727,6 +727,8 @@ _IO_cleanup ()
The following will make the standard streambufs be unbuffered, The following will make the standard streambufs be unbuffered,
which forces any output from late destructors to be written out. */ which forces any output from late destructors to be written out. */
_IO_unbuffer_all (); _IO_unbuffer_all ();
return result;
} }

View File

@ -341,7 +341,7 @@ extern struct _IO_jump_t _IO_str_jumps;
extern int _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t)); extern int _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
extern int _IO_old_do_write __P ((_IO_FILE *, const char *, _IO_size_t)); extern int _IO_old_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
extern int _IO_flush_all __P ((void)); extern int _IO_flush_all __P ((void));
extern void _IO_cleanup __P ((void)); extern int _IO_cleanup __P ((void));
extern void _IO_flush_all_linebuffered __P ((void)); extern void _IO_flush_all_linebuffered __P ((void));
#define _IO_do_flush(_f) \ #define _IO_do_flush(_f) \

View File

@ -131,7 +131,7 @@ This macro was introduced as part of the Large File Support extension (LFS).
@comment (NONE) @comment (NONE)
@comment X/Open @comment X/Open
@defvar Macro _LARGEFILE64_SOURCE @defvr Macro _LARGEFILE64_SOURCE
If you define this macro an additional set of function gets available If you define this macro an additional set of function gets available
which enables to use on @w{32 bit} systems to use files of sizes beyond which enables to use on @w{32 bit} systems to use files of sizes beyond
the usual limit of 2GB. This interface is not available if the system the usual limit of 2GB. This interface is not available if the system
@ -147,11 +147,11 @@ vs. @code{off64_t} and @code{fseeko} vs. @code{fseeko64}.
This macro was introduced as part of the Large File Support extension This macro was introduced as part of the Large File Support extension
(LFS). It is a transition interface for the time @w{64 bit} offsets are (LFS). It is a transition interface for the time @w{64 bit} offsets are
not generally used (see @code{_FILE_OFFSET_BITS}. not generally used (see @code{_FILE_OFFSET_BITS}.
@end defvar @end defvr
@comment (NONE) @comment (NONE)
@comment X/Open @comment X/Open
@defvar _FILE_OFFSET_BITS @defvr _FILE_OFFSET_BITS
This macro lets decide which file system interface shall be used, one This macro lets decide which file system interface shall be used, one
replacing the other. While @code{_LARGEFILE64_SOURCE} makes the @w{64 replacing the other. While @code{_LARGEFILE64_SOURCE} makes the @w{64
bit} interface available as an additional interface bit} interface available as an additional interface
@ -175,7 +175,7 @@ since the @code{*64} functions are identical to the normal functions.
This macro was introduced as part of the Large File Support extension This macro was introduced as part of the Large File Support extension
(LFS). (LFS).
@end defvar @end defvr
@comment (none) @comment (none)
@comment GNU @comment GNU

View File

@ -497,7 +497,7 @@ interface name, including its terminating zero byte.
@comment net/if.h @comment net/if.h
@comment IPv6 basic API @comment IPv6 basic API
@deftypefun unsigned int if_nametoindex (const char *ifname) @deftypefun {unsigned int} if_nametoindex (const char *ifname)
This function yields the interface index corresponding to a particular This function yields the interface index corresponding to a particular
name. If no interface exists with the name given, it returns 0. name. If no interface exists with the name given, it returns 0.
@end deftypefun @end deftypefun
@ -530,7 +530,7 @@ This is the null-terminated index name.
@comment net/if.h @comment net/if.h
@comment IPv6 basic API @comment IPv6 basic API
@deftypefun struct if_nameindex *if_nameindex (void) @deftypefun {struct if_nameindex *} if_nameindex (void)
This function returns an array of @code{if_nameindex} structures, one This function returns an array of @code{if_nameindex} structures, one
for every interface that is present. The end of the list is indicated for every interface that is present. The end of the list is indicated
by a structure with an interface of 0 and a null name pointer. If an by a structure with an interface of 0 and a null name pointer. If an
@ -999,7 +999,7 @@ data, which can be accessed (via a union) in a variety of ways.
@comment netinet/in.h @comment netinet/in.h
@comment IPv6 basic API @comment IPv6 basic API
@deftypevr Constant {struct in6_addr} in6addr_loopback. @deftypevr Constant {struct in6_addr} in6addr_loopback
This constant is the IPv6 address @samp{::1}, the loopback address. See This constant is the IPv6 address @samp{::1}, the loopback address. See
above for a description of what this means. The macro above for a description of what this means. The macro
@code{IN6ADDR_LOOPBACK_INIT} is provided to allow you to initialise your @code{IN6ADDR_LOOPBACK_INIT} is provided to allow you to initialise your

View File

@ -1775,10 +1775,10 @@ operand must be less than @code{RLIM_NLIMITS}.
@comment sys/resource.h @comment sys/resource.h
@comment BSD @comment BSD
@defvr Constant int RLIM_INFINITY @deftypevr Constant int RLIM_INFINITY
This constant stands for a value of ``infinity'' when supplied as This constant stands for a value of ``infinity'' when supplied as
the limit value in @code{setrlimit}. the limit value in @code{setrlimit}.
@end defvr @end deftypevr
@c ??? Someone want to finish these? @c ??? Someone want to finish these?
Two historical functions for setting resource limits, @code{ulimit} and Two historical functions for setting resource limits, @code{ulimit} and

View File

@ -966,15 +966,9 @@ printchar (c)
/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can /* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
also be assigned to arbitrarily: each pattern buffer stores its own also be assigned to arbitrarily: each pattern buffer stores its own
syntax, so it can be changed between regex compilations. */ syntax, so it can be changed between regex compilations. */
#ifdef _LIBC
reg_syntax_t __re_syntax_options = 0;
weak_alias (__re_syntax_options, re_syntax_options)
# define re_syntax_options __re_syntax_options
#else
/* This has no initializer because initialized variables in Emacs /* This has no initializer because initialized variables in Emacs
become read-only after dumping. */ become read-only after dumping. */
reg_syntax_t re_syntax_options; reg_syntax_t re_syntax_options;
#endif
/* Specify the precise syntax of regexps for compilation. This provides /* Specify the precise syntax of regexps for compilation. This provides
@ -2752,7 +2746,7 @@ regex_compile (pattern, size, syntax, bufp)
case 'w': case 'w':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
laststart = b; laststart = b;
BUF_PUSH (wordchar); BUF_PUSH (wordchar);
@ -2760,7 +2754,7 @@ regex_compile (pattern, size, syntax, bufp)
case 'W': case 'W':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
laststart = b; laststart = b;
BUF_PUSH (notwordchar); BUF_PUSH (notwordchar);
@ -2768,37 +2762,37 @@ regex_compile (pattern, size, syntax, bufp)
case '<': case '<':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
BUF_PUSH (wordbeg); BUF_PUSH (wordbeg);
break; break;
case '>': case '>':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
BUF_PUSH (wordend); BUF_PUSH (wordend);
break; break;
case 'b': case 'b':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
BUF_PUSH (wordbound); BUF_PUSH (wordbound);
break; break;
case 'B': case 'B':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
BUF_PUSH (notwordbound); BUF_PUSH (notwordbound);
break; break;
case '`': case '`':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
BUF_PUSH (begbuf); BUF_PUSH (begbuf);
break; break;
case '\'': case '\'':
if (re_syntax_options & RE_NO_GNU_OPS) if (syntax & RE_NO_GNU_OPS)
goto normal_char; goto normal_char;
BUF_PUSH (endbuf); BUF_PUSH (endbuf);
break; break;

View File

@ -26,9 +26,12 @@
#include <sys/stat.h> #include <sys/stat.h>
/* prototype for our test function. */ /* Prototype for our test function. */
extern void do_prepare (int argc, char *argv[]);
extern int do_test (int argc, char *argv[]); extern int do_test (int argc, char *argv[]);
/* We have a preparation function. */
#define PREPARE do_prepare
/* We might need a bit longer timeout. */ /* We might need a bit longer timeout. */
#define TIMEOUT 20 /* sec */ #define TIMEOUT 20 /* sec */
@ -37,6 +40,28 @@ extern int do_test (int argc, char *argv[]);
#include <test-skeleton.c> #include <test-skeleton.c>
/* These are for the temporary file we generate. */
char *name;
int fd;
void
do_prepare (int argc, char *argv[])
{
char name_len;
name_len = strlen (test_dir);
name = malloc (name_len + sizeof ("/aioXXXXXX"));
mempcpy (mempcpy (name, test_dir, name_len),
"/aioXXXXXX", sizeof ("/aioXXXXXX"));
add_temp_file (name);
/* Open our test file. */
fd = mkstemp (name);
if (fd == -1)
error (EXIT_FAILURE, errno, "cannot open test file `%s'", name);
}
int int
test_file (const void *buf, size_t size, int fd, const char *msg) test_file (const void *buf, size_t size, int fd, const char *msg)
{ {
@ -98,26 +123,12 @@ do_wait (struct aiocb **cbp, size_t nent)
int int
do_test (int argc, char *argv[]) do_test (int argc, char *argv[])
{ {
char *name;
char name_len;
struct aiocb cbs[10]; struct aiocb cbs[10];
struct aiocb *cbp[10]; struct aiocb *cbp[10];
char buf[1000]; char buf[1000];
size_t cnt; size_t cnt;
int fd;
int result = 0; int result = 0;
name_len = strlen (test_dir);
name = malloc (name_len + sizeof ("/aioXXXXXX"));
mempcpy (mempcpy (name, test_dir, name_len),
"/aioXXXXXX", sizeof ("/aioXXXXXX"));
add_temp_file (name);
/* Open our test file. */
fd = mkstemp (name);
if (fd == -1)
error (EXIT_FAILURE, errno, "cannot open test file `%s'", name);
/* Preparation. */ /* Preparation. */
for (cnt = 0; cnt < 10; ++cnt) for (cnt = 0; cnt < 10; ++cnt)
{ {

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1993, 1997 Free Software Foundation, Inc. /* Copyright (C) 1991, 1992, 1993, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,8 +19,6 @@
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
extern char *_strerror_internal __P ((int, char *buf, size_t));
/* Print a line on stderr consisting of the text in S, a colon, a space, /* Print a line on stderr consisting of the text in S, a colon, a space,
a message describing the meaning of the contents of `errno' and a newline. a message describing the meaning of the contents of `errno' and a newline.
If S is NULL or "", the colon and space are omitted. */ If S is NULL or "", the colon and space are omitted. */
@ -37,5 +35,5 @@ perror (const char *s)
colon = ": "; colon = ": ";
(void) fprintf (stderr, "%s%s%s\n", (void) fprintf (stderr, "%s%s%s\n",
s, colon, _strerror_internal (errnum, buf, sizeof buf)); s, colon, __strerror_r (errnum, buf, sizeof buf));
} }

View File

@ -966,12 +966,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
\ \
LABEL (form_strerror): \ LABEL (form_strerror): \
/* Print description of error ERRNO. */ \ /* Print description of error ERRNO. */ \
{ \ string = \
extern char *_strerror_internal __P ((int, char *buf, size_t)); \ (char *) __strerror_r (save_errno, work_buffer, sizeof work_buffer); \
\
string = (char *) \
_strerror_internal (save_errno, work_buffer, sizeof work_buffer); \
} \
is_long = 0; /* This is no wide-char string. */ \ is_long = 0; /* This is no wide-char string. */ \
goto LABEL (print_string) goto LABEL (print_string)

View File

@ -51,7 +51,7 @@ routines := \
distribute := exit.h grouping.h abort-instr.h isomac.c distribute := exit.h grouping.h abort-instr.h isomac.c
tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ tests := tst-strtol tst-strtod testmb testrand testsort testdiv \
test-canon test-canon test-canon2
# Several mpn functions from GNU MP are used by the strtod function. # Several mpn functions from GNU MP are used by the strtod function.

View File

@ -45,10 +45,12 @@ canonicalize (const char *name, char *resolved)
long int path_max; long int path_max;
int num_links = 0; int num_links = 0;
if (name == NULL || resolved == NULL) if (name == NULL)
{ {
/* As per Single Unix Specification V2 we must return an error if /* As per Single Unix Specification V2 we must return an error if
either parameter is a null pointer. */ either parameter is a null pointer. We extend this to allow
the RESOLVED parameter be NULL in case the we are expected to
allocate the room for the return value. */
__set_errno (EINVAL); __set_errno (EINVAL);
return NULL; return NULL;
} }
@ -133,7 +135,7 @@ canonicalize (const char *name, char *resolved)
dest = __mempcpy (dest, start, end - start); dest = __mempcpy (dest, start, end - start);
*dest = '\0'; *dest = '\0';
if (__lstat (rpath, &st) < 0) if (__lxstat (_STAT_VER, rpath, &st) < 0)
goto error; goto error;
if (S_ISLNK (st.st_mode)) if (S_ISLNK (st.st_mode))
@ -174,8 +176,6 @@ canonicalize (const char *name, char *resolved)
if (dest > rpath + 1) if (dest > rpath + 1)
while ((--dest)[-1] != '/'); while ((--dest)[-1] != '/');
} }
else
num_links = 0;
} }
} }
if (dest > rpath + 1 && dest[-1] == '/') if (dest > rpath + 1 && dest[-1] == '/')
@ -191,8 +191,20 @@ error:
free (rpath); free (rpath);
return NULL; return NULL;
} }
strong_alias (canonicalize, __realpath)
weak_alias (canonicalize, realpath)
char *
__realpath (const char *name, char *resolved)
{
if (resolved == NULL)
{
__set_errno (EINVAL);
return NULL;
}
return canonicalize (name, resolved);
}
weak_alias (__realpath, realpath)
char * char *

74
stdlib/test-canon2.c Normal file
View File

@ -0,0 +1,74 @@
/* Test for realpath/canonicalize function.
Copyright (C) 1998 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
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. */
#include <errno.h>
#include <string.h>
/* Prototype for our test function. */
extern void do_prepare (int argc, char *argv[]);
extern int do_test (int argc, char *argv[]);
/* We have a preparation function. */
#define PREPARE do_prepare
#include <test-skeleton.c>
/* Name of the temporary files we create. */
char *name1;
char *name2;
/* Preparation. */
void
do_prepare (int argc, char *argv[])
{
char test_dir_len;
test_dir_len = strlen (test_dir);
/* Generate the circular symlinks. */
name1 = malloc (test_dir_len + sizeof ("/canonXXXXXX"));
mempcpy (mempcpy (name1, test_dir, test_dir_len),
"/canonXXXXXX", sizeof ("/canonXXXXXX"));
name2 = strdup (name1);
add_temp_file (mktemp (name1));
add_temp_file (mktemp (name2));
}
/* Run the test. */
int
do_test (int argc, char *argv[])
{
char *canon;
printf ("create symlinks from %s to %s and vice versa\n", name1, name2);
if (symlink (name1, name2) == -1
|| symlink (name2, name1) == -1)
/* We cannot test this. */
return 0;
/* Call the function. This is equivalent the using `realpath' but the
function allocates the room for the result. */
errno = 0;
canon = canonicalize_file_name (name1);
return canon != NULL || errno != ELOOP;
}

View File

@ -1,4 +1,4 @@
# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 Free Software Foundation, Inc. # Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98 Free Software Foundation, Inc.
# This file is part of the GNU C Library. # This file is part of the GNU C Library.
# The GNU C Library is free software; you can redistribute it and/or # The GNU C Library is free software; you can redistribute it and/or
@ -27,7 +27,7 @@ headers := string.h strings.h memory.h endian.h bits/endian.h \
routines := strcat strchr strcmp strcoll strcpy strcspn \ routines := strcat strchr strcmp strcoll strcpy strcspn \
strverscmp strdup strndup \ strverscmp strdup strndup \
strerror _strerror strerror_r strlen strnlen \ strerror _strerror strlen strnlen \
strncat strncmp strncpy \ strncat strncmp strncpy \
strrchr strpbrk strsignal strspn strstr strtok \ strrchr strpbrk strsignal strspn strstr strtok \
strtok_r strxfrm memchr memcmp memmove memset \ strtok_r strxfrm memchr memcmp memmove memset \

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc. /* Copyright (C) 1991, 93, 94, 95, 96, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@ -19,8 +19,6 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
extern char *_strerror_internal __P ((int, char *, size_t));
/* Return a string describing the errno code in ERRNUM. /* Return a string describing the errno code in ERRNUM.
The storage is good only until the next call to strerror. The storage is good only until the next call to strerror.
Writing to the storage causes undefined behavior. */ Writing to the storage causes undefined behavior. */
@ -29,5 +27,5 @@ strerror (errnum)
int errnum; int errnum;
{ {
static char buf[1024]; static char buf[1024];
return _strerror_internal (errnum, buf, sizeof buf); return __strerror_r (errnum, buf, sizeof buf);
} }

View File

@ -1,31 +0,0 @@
/* Copyright (C) 1991, 93, 94, 95, 96, 98 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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. */
#include <stdio.h>
#include <string.h>
extern char *_strerror_internal __P ((int, char *, size_t));
/* Return a string describing the errno code in ERRNUM. If a temporary
buffer is required, at most BUFLEN bytes of BUF will be used. */
char *
__strerror_r (int errnum, char *buf, size_t buflen)
{
return _strerror_internal (errnum, buf, buflen);
}
weak_alias (__strerror_r, strerror_r)

View File

@ -23,8 +23,8 @@
#include <stdio-common/_itoa.h> #include <stdio-common/_itoa.h>
#ifndef HAVE_GNU_LD #ifndef HAVE_GNU_LD
#define _sys_errlist sys_errlist # define _sys_errlist sys_errlist
#define _sys_nerr sys_nerr # define _sys_nerr sys_nerr
#endif #endif
/* It is critical here that we always use the `dcgettext' function for /* It is critical here that we always use the `dcgettext' function for
@ -38,7 +38,7 @@
/* Return a string describing the errno code in ERRNUM. */ /* Return a string describing the errno code in ERRNUM. */
char * char *
_strerror_internal (int errnum, char *buf, size_t buflen) __strerror_r (int errnum, char *buf, size_t buflen)
{ {
if (errnum < 0 || errnum >= _sys_nerr) if (errnum < 0 || errnum >= _sys_nerr)
{ {
@ -67,3 +67,4 @@ _strerror_internal (int errnum, char *buf, size_t buflen)
return (char *) _(_sys_errlist[errnum]); return (char *) _(_sys_errlist[errnum]);
} }
weak_alias (__strerror_r, strerror_r)

View File

@ -34,7 +34,7 @@
/* Return a string describing the errno code in ERRNUM. */ /* Return a string describing the errno code in ERRNUM. */
char * char *
_strerror_internal (int errnum, char *buf, size_t buflen) __strerror_r (int errnum, char *buf, size_t buflen)
{ {
int system; int system;
int sub; int sub;
@ -115,3 +115,4 @@ _strerror_internal (int errnum, char *buf, size_t buflen)
return (char *) _(es->subsystem[sub].codes[code]); return (char *) _(es->subsystem[sub].codes[code]);
} }
weak_alias (__strerror_r, strerror_r)

View File

@ -78,8 +78,8 @@ ifeq ($(subdir),inet)
sysdep_headers += netinet/in_systm.h netinet/udp.h \ sysdep_headers += netinet/in_systm.h netinet/udp.h \
netinet/if_fddi.h netinet/if_tr.h netinet/igmp.h \ netinet/if_fddi.h netinet/if_tr.h netinet/igmp.h \
netinet/ip_fw.h netinet/ip_icmp.h netipx/ipx.h \ netinet/ip_fw.h netinet/ip_icmp.h netipx/ipx.h \
sys/socketvar.h netax25/ax25.h netrom/netrom.h \ sys/socketvar.h netash/ash.h netax25/ax25.h netatalk/at.h \
netrose/rose.h netpacket/packet.h netash/ash.h netrom/netrom.h netpacket/packet.h netrose/rose.h
endif endif
ifeq ($(subdir),posix) ifeq ($(subdir),posix)

View File

@ -158,13 +158,18 @@ main (int argc, char *argv[])
/* Make sure we see all message, even those on stdout. */ /* Make sure we see all message, even those on stdout. */
setvbuf (stdout, NULL, _IONBF, 0); setvbuf (stdout, NULL, _IONBF, 0);
/* make sure temporary files are deleted. */
atexit (delete_temp_files);
/* Call the initializing function, if one is available. */
#ifdef PREPARE
PREPARE (argc, argv);
#endif
/* If we are not expected to fork run the function immediately. */ /* If we are not expected to fork run the function immediately. */
if (direct) if (direct)
return TEST_FUNCTION; return TEST_FUNCTION;
/* make sure temporary files are deleted. */
atexit (delete_temp_files);
/* Set up the test environment: /* Set up the test environment:
- prevent core dumps - prevent core dumps
- set up the timer - set up the timer