summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cvsignore2
-rw-r--r--ChangeLog67
-rw-r--r--FAQ.in2
-rw-r--r--assert/assert-perr.c8
-rw-r--r--catgets/open_catalog.c10
-rwxr-xr-xconfigure2
-rw-r--r--configure.in2
-rw-r--r--elf/dl-error.c5
-rw-r--r--elf/dl-minimal.c32
-rw-r--r--elf/dl-profile.c10
-rw-r--r--gmon/gmon.c4
-rw-r--r--libc.map13
-rw-r--r--libio/fcloseall.c5
-rw-r--r--libio/genops.c8
-rw-r--r--libio/libioP.h2
-rw-r--r--manual/creature.texi8
-rw-r--r--manual/socket.texi6
-rw-r--r--manual/time.texi4
-rw-r--r--posix/regex.c22
-rw-r--r--rt/tst-aio.c41
-rw-r--r--stdio-common/perror.c6
-rw-r--r--stdio-common/vfprintf.c8
-rw-r--r--stdlib/Makefile2
-rw-r--r--stdlib/canonicalize.c26
-rw-r--r--stdlib/test-canon2.c74
-rw-r--r--string/Makefile4
-rw-r--r--string/strerror.c6
-rw-r--r--string/strerror_r.c31
-rw-r--r--sysdeps/generic/_strerror.c7
-rw-r--r--sysdeps/mach/_strerror.c3
-rw-r--r--sysdeps/unix/sysv/linux/Makefile4
-rw-r--r--test-skeleton.c11
32 files changed, 278 insertions, 157 deletions
diff --git a/.cvsignore b/.cvsignore
index 7654da865a..b907f7a024 100644
--- a/.cvsignore
+++ b/.cvsignore
@@ -17,9 +17,9 @@ distinfo
test-include
analysis
docs
+releases
crypt
linuxthreads
-secure_rpc
aio
diff --git a/ChangeLog b/ChangeLog
index f88e5ac2d8..a75691c35d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* sysdeps/posix/mktemp.c: Increment `value' in a way which touches
diff --git a/FAQ.in b/FAQ.in
index adda0fb06a..7ca0218ec6 100644
--- a/FAQ.in
+++ b/FAQ.in
@@ -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
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
from this information.
diff --git a/assert/assert-perr.c b/assert/assert-perr.c
index 246727ee94..cdc07b56f9 100644
--- a/assert/assert-perr.c
+++ b/assert/assert-perr.c
@@ -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.
The GNU C Library is free software; you can redistribute it and/or
@@ -22,10 +22,6 @@
#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. */
/* This function, when passed an error number, a filename, and a line
@@ -53,7 +49,7 @@ __assert_perror_fail (int errnum,
__assert_program_name ? ": " : "",
file, line,
function ? function : "", function ? ": " : "",
- _strerror_internal (errnum, errbuf, sizeof errbuf));
+ __strerror_r (errnum, errbuf, sizeof errbuf));
(void) fflush (stderr);
abort ();
diff --git a/catgets/open_catalog.c b/catgets/open_catalog.c
index 62fb111e43..2197eb8363 100644
--- a/catgets/open_catalog.c
+++ b/catgets/open_catalog.c
@@ -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.
Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>.
@@ -35,7 +35,7 @@
void
__open_catalog (__nl_catd catalog)
{
- int fd;
+ int fd = -1;
struct stat st;
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;
goto unlock_return;
@@ -225,6 +226,7 @@ __open_catalog (__nl_catd catalog)
/* We don't need the file anymore. */
__close (fd);
+ fd = -1;
/* 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
@@ -271,5 +273,7 @@ __open_catalog (__nl_catd catalog)
/* Release the lock again. */
unlock_return:
+ if (fd != -1)
+ __close (fd);
__libc_lock_unlock (catalog->lock);
}
diff --git a/configure b/configure
index e94d8cdd0b..c66deb2ddc 100755
--- a/configure
+++ b/configure
@@ -63,7 +63,7 @@ ac_help="$ac_help
ac_help="$ac_help
--enable-static-nss build static NSS modules [default=no]"
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"
# Initialize some variables set by options.
diff --git a/configure.in b/configure.in
index 6d17bb30cb..86eec3c942 100644
--- a/configure.in
+++ b/configure.in
@@ -128,7 +128,7 @@ if test x"$static_nss" = xyes; then
fi
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],
force_install=$enableval, force_install=yes)
AC_SUBST(force_install)
diff --git a/elf/dl-error.c b/elf/dl-error.c
index 446ba627b5..03292abaf4 100644
--- a/elf/dl-error.c
+++ b/elf/dl-error.c
@@ -23,9 +23,6 @@
#include <unistd.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
_dl_signal_error. */
struct catch
@@ -89,7 +86,7 @@ _dl_signal_error (int errcode,
objname ?: "", objname && *objname ? ": " : "",
errstring, errcode ? ": " : "",
(errcode
- ? _strerror_internal (errcode, buffer, sizeof buffer)
+ ? __strerror_r (errcode, buffer, sizeof buffer)
: ""), "\n", NULL);
}
}
diff --git a/elf/dl-minimal.c b/elf/dl-minimal.c
index 4c15d83f8e..c9a0575fd0 100644
--- a/elf/dl-minimal.c
+++ b/elf/dl-minimal.c
@@ -131,7 +131,7 @@ longjmp (jmp_buf env, int val)
in the whole error list. */
char * weak_function
-_strerror_internal (int errnum, char *buf, size_t buflen)
+__strerror_r (int errnum, char *buf, size_t buflen)
{
char *msg;
@@ -205,11 +205,10 @@ __assert_perror_fail (int errnum,
#endif
/* This function is only used in eval.c. */
-long int
-weak_function
+long int weak_function
__strtol_internal (const char *nptr, char **endptr, int base, int group)
{
- long int result = 0;
+ unsigned long int result = 0;
long int sign = 1;
while (*nptr == ' ' || *nptr == '\t')
@@ -246,10 +245,14 @@ __strtol_internal (const char *nptr, char **endptr, int base, int group)
while (*nptr >= '0' && *nptr <= '9')
{
- long int digval = *nptr - '0';
+ unsigned long int digval = *nptr - '0';
if (result > LONG_MAX / 10
- || (result == (sign ? LONG_MAX : LONG_MAX + 1) / 10
- && digval > (sign ? LONG_MAX : LONG_MAX + 1) % 10))
+ || (result == (sign
+ ? (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;
return LONG_MAX * sign;
@@ -258,21 +261,19 @@ __strtol_internal (const char *nptr, char **endptr, int base, int group)
result += digval;
}
- return result * sign;
+ return (long int) result * sign;
}
-long int
-weak_function
+long int weak_function
strtol (const char *nptr, char **endptr, int base)
{
return __strtol_internal (nptr, endptr, base, 0);
}
-unsigned long int
-weak_function
+unsigned long int weak_function
__strtoul_internal (const char *nptr, char **endptr, int base, int group)
{
- long int result = 0;
+ unsigned long int result = 0;
long int sign = 1;
while (*nptr == ' ' || *nptr == '\t')
@@ -309,7 +310,7 @@ __strtoul_internal (const char *nptr, char **endptr, int base, int group)
while (*nptr >= '0' && *nptr <= '9')
{
- long int digval = *nptr - '0';
+ unsigned long int digval = *nptr - '0';
if (result > LONG_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;
}
-unsigned long int
-weak_function
+unsigned long int weak_function
strtoul (const char *nptr, char **endptr, int base)
{
return (unsigned long int) __strtoul_internal (nptr, endptr, base, 0);
diff --git a/elf/dl-profile.c b/elf/dl-profile.c
index 669fee7a43..c7ac360811 100644
--- a/elf/dl-profile.c
+++ b/elf/dl-profile.c
@@ -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
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));
/* 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. */
char buf[400];
_dl_sysdep_message (filename, ": cannot open file: ",
- _strerror_internal (errno, buf, sizeof buf),
+ __strerror_r (errno, buf, sizeof buf),
"\n", NULL);
return;
}
@@ -283,7 +281,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
int errnum = errno;
__close (fd);
_dl_sysdep_message (filename, ": cannot stat file: ",
- _strerror_internal (errnum, buf, sizeof buf),
+ __strerror_r (errnum, buf, sizeof buf),
"\n", NULL);
return;
}
@@ -305,7 +303,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
errnum = errno;
__close (fd);
_dl_sysdep_message (filename, ": cannot create file: ",
- _strerror_internal (errnum, buf, sizeof buf),
+ __strerror_r (errnum, buf, sizeof buf),
"\n", NULL);
return;
}
@@ -337,7 +335,7 @@ _dl_start_profile (struct link_map *map, const char *output_dir)
int errnum = errno;
__close (fd);
_dl_sysdep_message (filename, ": cannot map file: ",
- _strerror_internal (errnum, buf, sizeof buf),
+ __strerror_r (errnum, buf, sizeof buf),
"\n", NULL);
return;
}
diff --git a/gmon/gmon.c b/gmon/gmon.c
index 0087e8c0f7..834351eeec 100644
--- a/gmon/gmon.c
+++ b/gmon/gmon.c
@@ -46,8 +46,6 @@
#include <string.h>
#include <unistd.h>
-extern char *_strerror_internal __P ((int, char *buf, size_t));
-
extern int __profile_frequency __P ((void));
struct __bb *__bb_head; /* Head of basic-block list or NULL. */
@@ -330,7 +328,7 @@ write_gmon (void)
char buf[300];
int errnum = errno;
fprintf (stderr, "_mcleanup: gmon.out: %s\n",
- _strerror_internal (errnum, buf, sizeof buf));
+ __strerror_r (errnum, buf, sizeof buf));
return;
}
}
diff --git a/libc.map b/libc.map
index 81f902fbbe..6a40713d81 100644
--- a/libc.map
+++ b/libc.map
@@ -146,7 +146,8 @@ GLIBC_2.0 {
# b*
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*
cachectl; cacheflush; calloc; callrpc; canonicalize_file_name;
@@ -225,14 +226,14 @@ GLIBC_2.0 {
globfree; gmtime; gmtime_r; group_member; gsignal; gtty;
# 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;
# 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_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;
isfdtype; isgraph; isinf; isinff; isinfl; islower; isnan; isnanf;
@@ -275,7 +276,7 @@ GLIBC_2.0 {
# o*
obstack_free; obstack_printf; obstack_vprintf; on_exit; open;
- open_memstream; opendir; openlog;
+ open_memstream; opendir; openlog; outb; outl; outw;
# p*
parse_printf_format; pathconf; pause; pciconfig_read;
@@ -328,7 +329,7 @@ GLIBC_2.0 {
semctl; semget; semop; send; sendmsg; sendto; setaliasent; setbuf;
setbuffer; setcontext;
setdomainname; setegid; setenv; seteuid; setfsent;
- setfsgid; setfsuid; setgid; setgrent; setgroups; sethostent;
+ setfsgid; setfsuid; setgid; setgrent; setgroups; sethae; sethostent;
sethostid; sethostname; setitimer; setjmp; setlinebuf; setlocale;
setlogin; setlogmask; setmntent; setnetent; setnetgrent; setpgid;
setpgrp; setpriority; setprotoent; setpwent; setregid; setresgid;
diff --git a/libio/fcloseall.c b/libio/fcloseall.c
index cd01655450..9b980c6cde 100644
--- a/libio/fcloseall.c
+++ b/libio/fcloseall.c
@@ -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 library is free software; you can redistribute it and/or
@@ -30,8 +30,7 @@ int
__fcloseall ()
{
/* Close all streams. */
- _IO_cleanup ();
- return 0;
+ return _IO_cleanup ();
}
#ifdef weak_alias
diff --git a/libio/genops.c b/libio/genops.c
index ea602eda39..b0334d6d0e 100644
--- a/libio/genops.c
+++ b/libio/genops.c
@@ -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 library is free software; you can redistribute it and/or
@@ -714,10 +714,10 @@ _IO_unbuffer_all ()
_IO_SETBUF (fp, NULL, 0);
}
-void
+int
_IO_cleanup ()
{
- _IO_flush_all ();
+ int result = _IO_flush_all ();
/* We currently don't have a reliable mechanism for making sure that
C++ static destructors are executed in the correct order.
@@ -727,6 +727,8 @@ _IO_cleanup ()
The following will make the standard streambufs be unbuffered,
which forces any output from late destructors to be written out. */
_IO_unbuffer_all ();
+
+ return result;
}
diff --git a/libio/libioP.h b/libio/libioP.h
index 0452c7758f..8e8e61843a 100644
--- a/libio/libioP.h
+++ b/libio/libioP.h
@@ -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_old_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
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));
#define _IO_do_flush(_f) \
diff --git a/manual/creature.texi b/manual/creature.texi
index 4cdcce99b0..66e53aceb4 100644
--- a/manual/creature.texi
+++ b/manual/creature.texi
@@ -131,7 +131,7 @@ This macro was introduced as part of the Large File Support extension (LFS).
@comment (NONE)
@comment X/Open
-@defvar Macro _LARGEFILE64_SOURCE
+@defvr Macro _LARGEFILE64_SOURCE
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
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
(LFS). It is a transition interface for the time @w{64 bit} offsets are
not generally used (see @code{_FILE_OFFSET_BITS}.
-@end defvar
+@end defvr
@comment (NONE)
@comment X/Open
-@defvar _FILE_OFFSET_BITS
+@defvr _FILE_OFFSET_BITS
This macro lets decide which file system interface shall be used, one
replacing the other. While @code{_LARGEFILE64_SOURCE} makes the @w{64
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
(LFS).
-@end defvar
+@end defvr
@comment (none)
@comment GNU
diff --git a/manual/socket.texi b/manual/socket.texi
index ffecc992d5..0eab88a4b2 100644
--- a/manual/socket.texi
+++ b/manual/socket.texi
@@ -497,7 +497,7 @@ interface name, including its terminating zero byte.
@comment net/if.h
@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
name. If no interface exists with the name given, it returns 0.
@end deftypefun
@@ -530,7 +530,7 @@ This is the null-terminated index name.
@comment net/if.h
@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
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
@@ -999,7 +999,7 @@ data, which can be accessed (via a union) in a variety of ways.
@comment netinet/in.h
@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
above for a description of what this means. The macro
@code{IN6ADDR_LOOPBACK_INIT} is provided to allow you to initialise your
diff --git a/manual/time.texi b/manual/time.texi
index e280716304..5da12c4513 100644
--- a/manual/time.texi
+++ b/manual/time.texi
@@ -1775,10 +1775,10 @@ operand must be less than @code{RLIM_NLIMITS}.
@comment sys/resource.h
@comment BSD
-@defvr Constant int RLIM_INFINITY
+@deftypevr Constant int RLIM_INFINITY
This constant stands for a value of ``infinity'' when supplied as
the limit value in @code{setrlimit}.
-@end defvr
+@end deftypevr
@c ??? Someone want to finish these?
Two historical functions for setting resource limits, @code{ulimit} and
diff --git a/posix/regex.c b/posix/regex.c
index d29a4bf61e..b7fb962d61 100644
--- a/posix/regex.c
+++ b/posix/regex.c
@@ -966,15 +966,9 @@ printchar (c)
/* Set by `re_set_syntax' to the current regexp syntax to recognize. Can
also be assigned to arbitrarily: each pattern buffer stores its own
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
become read-only after dumping. */
reg_syntax_t re_syntax_options;
-#endif
/* Specify the precise syntax of regexps for compilation. This provides
@@ -2752,7 +2746,7 @@ regex_compile (pattern, size, syntax, bufp)
case 'w':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
laststart = b;
BUF_PUSH (wordchar);
@@ -2760,7 +2754,7 @@ regex_compile (pattern, size, syntax, bufp)
case 'W':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
laststart = b;
BUF_PUSH (notwordchar);
@@ -2768,37 +2762,37 @@ regex_compile (pattern, size, syntax, bufp)
case '<':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
BUF_PUSH (wordbeg);
break;
case '>':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
BUF_PUSH (wordend);
break;
case 'b':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
BUF_PUSH (wordbound);
break;
case 'B':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
BUF_PUSH (notwordbound);
break;
case '`':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
BUF_PUSH (begbuf);
break;
case '\'':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
BUF_PUSH (endbuf);
break;
diff --git a/rt/tst-aio.c b/rt/tst-aio.c
index 83833ee117..a6c0762a2a 100644
--- a/rt/tst-aio.c
+++ b/rt/tst-aio.c
@@ -26,9 +26,12 @@
#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[]);
+/* We have a preparation function. */
+#define PREPARE do_prepare
/* We might need a bit longer timeout. */
#define TIMEOUT 20 /* sec */
@@ -37,6 +40,28 @@ extern int do_test (int argc, char *argv[]);
#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
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
do_test (int argc, char *argv[])
{
- char *name;
- char name_len;
struct aiocb cbs[10];
struct aiocb *cbp[10];
char buf[1000];
size_t cnt;
- int fd;
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. */
for (cnt = 0; cnt < 10; ++cnt)
{
diff --git a/stdio-common/perror.c b/stdio-common/perror.c
index e7db55ae80..4b29f5286a 100644
--- a/stdio-common/perror.c
+++ b/stdio-common/perror.c
@@ -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.
The GNU C Library is free software; you can redistribute it and/or
@@ -19,8 +19,6 @@
#include <stdio.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,
a message describing the meaning of the contents of `errno' and a newline.
If S is NULL or "", the colon and space are omitted. */
@@ -37,5 +35,5 @@ perror (const char *s)
colon = ": ";
(void) fprintf (stderr, "%s%s%s\n",
- s, colon, _strerror_internal (errnum, buf, sizeof buf));
+ s, colon, __strerror_r (errnum, buf, sizeof buf));
}
diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c
index e13785f3a3..d8d0f87b0f 100644
--- a/stdio-common/vfprintf.c
+++ b/stdio-common/vfprintf.c
@@ -966,12 +966,8 @@ vfprintf (FILE *s, const CHAR_T *format, va_list ap)
\
LABEL (form_strerror): \
/* Print description of error ERRNO. */ \
- { \
- extern char *_strerror_internal __P ((int, char *buf, size_t)); \
- \
- string = (char *) \
- _strerror_internal (save_errno, work_buffer, sizeof work_buffer); \
- } \
+ string = \
+ (char *) __strerror_r (save_errno, work_buffer, sizeof work_buffer); \
is_long = 0; /* This is no wide-char string. */ \
goto LABEL (print_string)
diff --git a/stdlib/Makefile b/stdlib/Makefile
index 85a5347d32..91eaf60cfc 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -51,7 +51,7 @@ routines := \
distribute := exit.h grouping.h abort-instr.h isomac.c
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.
diff --git a/stdlib/canonicalize.c b/stdlib/canonicalize.c
index ef7311e90d..faf4422f18 100644
--- a/stdlib/canonicalize.c
+++ b/stdlib/canonicalize.c
@@ -45,10 +45,12 @@ canonicalize (const char *name, char *resolved)
long int path_max;
int num_links = 0;
- if (name == NULL || resolved == NULL)
+ if (name == NULL)
{
/* 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);
return NULL;
}
@@ -133,7 +135,7 @@ canonicalize (const char *name, char *resolved)
dest = __mempcpy (dest, start, end - start);
*dest = '\0';
- if (__lstat (rpath, &st) < 0)
+ if (__lxstat (_STAT_VER, rpath, &st) < 0)
goto error;
if (S_ISLNK (st.st_mode))
@@ -174,8 +176,6 @@ canonicalize (const char *name, char *resolved)
if (dest > rpath + 1)
while ((--dest)[-1] != '/');
}
- else
- num_links = 0;
}
}
if (dest > rpath + 1 && dest[-1] == '/')
@@ -191,8 +191,20 @@ error:
free (rpath);
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 *
diff --git a/stdlib/test-canon2.c b/stdlib/test-canon2.c
new file mode 100644
index 0000000000..0dc16154b2
--- /dev/null
+++ b/stdlib/test-canon2.c
@@ -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;
+}
diff --git a/string/Makefile b/string/Makefile
index 93d68a45be..e766429c52 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -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.
# 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 \
strverscmp strdup strndup \
- strerror _strerror strerror_r strlen strnlen \
+ strerror _strerror strlen strnlen \
strncat strncmp strncpy \
strrchr strpbrk strsignal strspn strstr strtok \
strtok_r strxfrm memchr memcmp memmove memset \
diff --git a/string/strerror.c b/string/strerror.c
index 7052ef64d6..4b3234233d 100644
--- a/string/strerror.c
+++ b/string/strerror.c
@@ -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.
The GNU C Library is free software; you can redistribute it and/or
@@ -19,8 +19,6 @@
#include <stdio.h>
#include <string.h>
-extern char *_strerror_internal __P ((int, char *, size_t));
-
/* Return a string describing the errno code in ERRNUM.
The storage is good only until the next call to strerror.
Writing to the storage causes undefined behavior. */
@@ -29,5 +27,5 @@ strerror (errnum)
int errnum;
{
static char buf[1024];
- return _strerror_internal (errnum, buf, sizeof buf);
+ return __strerror_r (errnum, buf, sizeof buf);
}
diff --git a/string/strerror_r.c b/string/strerror_r.c
deleted file mode 100644
index fc967441be..0000000000
--- a/string/strerror_r.c
+++ /dev/null
@@ -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)
diff --git a/sysdeps/generic/_strerror.c b/sysdeps/generic/_strerror.c
index e6f56556aa..53ff9343e1 100644
--- a/sysdeps/generic/_strerror.c
+++ b/sysdeps/generic/_strerror.c
@@ -23,8 +23,8 @@
#include <stdio-common/_itoa.h>
#ifndef HAVE_GNU_LD
-#define _sys_errlist sys_errlist
-#define _sys_nerr sys_nerr
+# define _sys_errlist sys_errlist
+# define _sys_nerr sys_nerr
#endif
/* 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. */
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)
{
@@ -67,3 +67,4 @@ _strerror_internal (int errnum, char *buf, size_t buflen)
return (char *) _(_sys_errlist[errnum]);
}
+weak_alias (__strerror_r, strerror_r)
diff --git a/sysdeps/mach/_strerror.c b/sysdeps/mach/_strerror.c
index 7bca7e8bd9..5be7d272a8 100644
--- a/sysdeps/mach/_strerror.c
+++ b/sysdeps/mach/_strerror.c
@@ -34,7 +34,7 @@
/* Return a string describing the errno code in ERRNUM. */
char *
-_strerror_internal (int errnum, char *buf, size_t buflen)
+__strerror_r (int errnum, char *buf, size_t buflen)
{
int system;
int sub;
@@ -115,3 +115,4 @@ _strerror_internal (int errnum, char *buf, size_t buflen)
return (char *) _(es->subsystem[sub].codes[code]);
}
+weak_alias (__strerror_r, strerror_r)
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 3d52210fb8..9a509384d6 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -78,8 +78,8 @@ ifeq ($(subdir),inet)
sysdep_headers += netinet/in_systm.h netinet/udp.h \
netinet/if_fddi.h netinet/if_tr.h netinet/igmp.h \
netinet/ip_fw.h netinet/ip_icmp.h netipx/ipx.h \
- sys/socketvar.h netax25/ax25.h netrom/netrom.h \
- netrose/rose.h netpacket/packet.h netash/ash.h
+ sys/socketvar.h netash/ash.h netax25/ax25.h netatalk/at.h \
+ netrom/netrom.h netpacket/packet.h netrose/rose.h
endif
ifeq ($(subdir),posix)
diff --git a/test-skeleton.c b/test-skeleton.c
index 497adbe5ba..e4fed67ae3 100644
--- a/test-skeleton.c
+++ b/test-skeleton.c
@@ -158,13 +158,18 @@ main (int argc, char *argv[])
/* Make sure we see all message, even those on stdout. */
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 (direct)
return TEST_FUNCTION;
- /* make sure temporary files are deleted. */
- atexit (delete_temp_files);
-
/* Set up the test environment:
- prevent core dumps
- set up the timer