test-include
analysis
docs
+releases
crypt
linuxthreads
-secure_rpc
aio
+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
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.
-/* 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
#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
__assert_program_name ? ": " : "",
file, line,
function ? function : "", function ? ": " : "",
- _strerror_internal (errnum, errbuf, sizeof errbuf));
+ __strerror_r (errnum, errbuf, sizeof errbuf));
(void) fflush (stderr);
abort ();
-/* 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>.
void
__open_catalog (__nl_catd catalog)
{
- int fd;
+ int fd = -1;
struct stat st;
int swapping;
}
}
- 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;
/* 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
/* Release the lock again. */
unlock_return:
+ if (fd != -1)
+ __close (fd);
__libc_lock_unlock (catalog->lock);
}
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.
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)
#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
objname ?: "", objname && *objname ? ": " : "",
errstring, errcode ? ": " : "",
(errcode
- ? _strerror_internal (errcode, buffer, sizeof buffer)
+ ? __strerror_r (errcode, buffer, sizeof buffer)
: ""), "\n", NULL);
}
}
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;
#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')
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;
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')
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))
{
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);
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.
/* 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;
}
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;
}
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;
}
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;
}
#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. */
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;
}
}
# 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;
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;
# 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;
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;
-/* 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
__fcloseall ()
{
/* Close all streams. */
- _IO_cleanup ();
- return 0;
+ return _IO_cleanup ();
}
#ifdef weak_alias
-/* 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
_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.
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;
}
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) \
@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
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
This macro was introduced as part of the Large File Support extension
(LFS).
-@end defvar
+@end defvr
@comment (none)
@comment GNU
@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
@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
@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
@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
/* 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
case 'w':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
laststart = b;
BUF_PUSH (wordchar);
case 'W':
- if (re_syntax_options & RE_NO_GNU_OPS)
+ if (syntax & RE_NO_GNU_OPS)
goto normal_char;
laststart = b;
BUF_PUSH (notwordchar);
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;
#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 */
#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)
{
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)
{
-/* 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
#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. */
colon = ": ";
(void) fprintf (stderr, "%s%s%s\n",
- s, colon, _strerror_internal (errnum, buf, sizeof buf));
+ s, colon, __strerror_r (errnum, buf, sizeof buf));
}
\
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)
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.
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;
}
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))
if (dest > rpath + 1)
while ((--dest)[-1] != '/');
}
- else
- num_links = 0;
}
}
if (dest > rpath + 1 && dest[-1] == '/')
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 *
--- /dev/null
+/* 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;
+}
-# 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
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 \
-/* 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
#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. */
int errnum;
{
static char buf[1024];
- return _strerror_internal (errnum, buf, sizeof buf);
+ return __strerror_r (errnum, buf, sizeof buf);
}
+++ /dev/null
-/* 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)
#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
/* 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)
{
return (char *) _(_sys_errlist[errnum]);
}
+weak_alias (__strerror_r, strerror_r)
/* 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;
return (char *) _(es->subsystem[sub].codes[code]);
}
+weak_alias (__strerror_r, strerror_r)
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)
/* 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