+2006-11-06 Paul Eggert <eggert@cs.ucla.edu>
+
+ * MODULES.html.sh (File system functions): New module
+ canonicalize-lgpl.
+ * lib/canonicalize.h: Add comments for canonicalize_filename_mode
+ and canonicalize_file_name.
+ * lib/canonicalize-lgpl.c, m4/canonicalize-lgpl.m4:
+ * modules/canonicalize-lgpl: New files.
+
2006-11-05 Bruno Haible <bruno@clisp.org>
* gnulib-tool (func_import, func_create_testdir): Create directories
* lib/mkdir-p.c: Include dirname.h, for IS_ABSOLUTE_FILE_NAME.
(make_dir_parents): Use a subprocess if necessary. New arg WD;
all users changed.
- * lib/savewd.c, savewd.h: New files.
+ * lib/savewd.c, lib/savewd.h: New files.
2006-09-15 Jim Meyering <jim@meyering.net>
2006-08-29 Paul Eggert <eggert@cs.ucla.edu>
- * lib/isapipe.c, isapipe.h: New files.
+ * lib/isapipe.c, lib/isapipe.h: New files.
2006-08-29 Jim Meyering <jim@meyering.net>
* m4/cycle-check.m4: New file.
Require gl_STRUCT_DEV_INO and gl_SAME_INODE.
- * m4/dev-ino.m4, same-inode.m4: New files.
+ * m4/dev-ino.m4, m4/same-inode.m4: New files.
2006-08-10 Eric Blake <ebb9@byu.net>
2006-08-08 Eric Blake <ebb9@byu.net>
- * lib/verror.h, verror.c: New files.
+ * lib/verror.h, lib/verror.c: New files.
2006-08-08 Eric Blake <ebb9@byu.net>
2006-07-22 Paul Eggert <eggert@cs.ucla.edu>
- * lib/close-stream.c, close-stream.h: New files.
+ * lib/close-stream.c, lib/close-stream.h: New files.
2006-07-22 Bruno Haible <bruno@clisp.org>
* modules/oset: New file.
* modules/array-oset: New file.
* modules/avltree-oset, modules/avltree-oset-tests: New files.
- * modules/rbtree-oset, rbtree-oset-tests: New files.
+ * modules/rbtree-oset, modules/rbtree-oset-tests: New files.
* tests/test-carray_list.c: New file.
* tests/test-linked_list.c: New file.
* tests/test-avltree_list.c: New file.
2006-07-16 Paul Eggert <eggert@cs.ucla.edu>
- * lib/dirchownmod.c, dirchownmod.h, mkancesdirs.c, mkancesdirs.h:
- New files.
+ * lib/dirchownmod.c, lib/dirchownmod.h, lib/mkancesdirs.c:
+ * lib/mkancesdirs.h: New files.
* lib/mkdir-p.c: Don't include alloca.h, stdio.h, sys/types.h,
unistd.h, string.h, chdir-safer.h, dirname.h, lchmod.h, lchown.h,
save-cwd.h. Instead, include dirchownmod.h and mkancesdirs.h.
2006-04-18 Derek Price <derek@ximbiot.com>
Paul Eggert <eggert@cs.ucla.edu>
- * m4/_inttypes_h.m4, full-header-path.m4, include_next: New files.
+ * m4/_inttypes_h.m4, m4/full-header-path.m4, m4/include_next.m4:
+ New files.
2006-04-18 Derek Price <derek@ximbiot.com>
Paul Eggert <eggert@cs.ucla.edu>
* lib/version-etc.c (COPYRIGHT_YEAR): Update to 2006.
- * lib/chdir-safer.h, chdir-safer.c: New files.
+ * lib/chdir-safer.h, lib/chdir-safer.c: New files.
* lib/modechange.c (mode_compile): Reject an invalid mode string
that starts with an octal digit. From Andreas Gruenbacher.
2005-12-16 Jim Meyering <jim@meyering.net>
- * lib/fprintftime.c, fprintftime.h: New files.
+ * lib/fprintftime.c, lib/fprintftime.h: New files.
2005-12-15 Simon Josefsson <jas@extundo.com>
* lib/gc-gnulib.c: Add MD2. Implement gc_hash_* API.
- * lib/md2.h, md2.c: New files.
+ * lib/md2.h, lib/md2.c: New files.
2005-10-28 Paul Eggert <eggert@cs.ucla.edu>
2005-10-21 Simon Josefsson <jas@extundo.com>
- * lib/des.h, des.c: New files.
+ * lib/des.h, lib/des.c: New files.
* lib/gc-gnulib.c: Support DES.c
2005-10-21 Simon Josefsson <jas@extundo.com>
- * lib/arctwo.h, arctwo.c: New files.
+ * lib/arctwo.h, lib/arctwo.c: New files.
* lib/gc-gnulib.c: Support ARCTWO.
2005-10-18 Simon Josefsson <jas@extundo.com>
- * lib/md4.h, md4.c: New files, based on md5.?.
+ * lib/md4.h, lib/md4.c: New files, based on md5.?.
2005-10-17 Stepan Kasal <kasal@ucw.cz>
2005-10-15 Simon Josefsson <jas@extundo.com>
- * lib/rijndael-api-fst.h, rijndael-api-fst.c: New files.
+ * lib/rijndael-api-fst.h, lib/rijndael-api-fst.c: New files.
- * lib/rijndael-alg-fst.h, rijndael-alg-fst.c: New files.
+ * lib/rijndael-alg-fst.h, lib/rijndael-alg-fst.c: New files.
2005-10-14 Simon Josefsson <jas@extundo.com>
2005-10-14 Simon Josefsson <jas@extundo.com>
- * lib/arcfour.h, arcfour.c: New files.
+ * lib/arcfour.h, lib/arcfour.c: New files.
2005-10-14 Roland McGrath <roland@redhat.com>
2005-10-12 Simon Josefsson <jas@extundo.com>
- * m4/gc-md5.m4, gc-hmac-md5: New files.
+ * m4/gc-md5.m4, m4/gc-hmac-md5.m4: New files.
* m4/gc.m4: Don't call gl_MD5, gl_MEMXOR or gl_HMAC_MD5.
2005-10-11 Simon Josefsson <jas@extundo.com>
- * lib/crc.h, crc.c: New files.
+ * lib/crc.h, lib/crc.c: New files.
* lib/gc.h (gc_hash_buffer): Add doc.
* lib/md5.h (MD5_DIGEST_SIZE, MD5_BLOCK_SIZE): Add, see also
<http://sourceware.org/bugzilla/show_bug.cgi?id=1423>.
- * lib/memxor.h, memxor.c: New files.
+ * lib/memxor.h, lib/memxor.c: New files.
* lib/getaddrinfo.h: Don't protect sys/types.h with HAVE_SYS_TYPES_H,
we assume all systems have it, suggested by Jim Meyering
2005-08-24 Jim Meyering <jim@meyering.net>
Sync from coreutils.
- * lib/fcntl--.h, fcntl-safer.h, open-safer.c: New files.
+ * lib/fcntl--.h, lib/fcntl-safer.h, lib/open-safer.c: New files.
2005-08-24 Jim Meyering <jim@meyering.net>
* lib/getline.h, getline.c: Rewrite.
- * lib/getdelim.h, getdelim.c: New files, ported from glibc.
+ * lib/getdelim.h, lib/getdelim.c: New files, ported from glibc.
2005-07-31 Bruno Haible <bruno@clisp.org>
2005-07-07 Paul Eggert <eggert@cs.ucla.edu>
* lib/regex.c, regex.h: Sync from libc.
- * lib/regcomp.c, regexec_internal.c, regex_internal.h, regexec.c:
+ * lib/regcomp.c, lib/regexec_internal.c, lib/regex_internal.h:
+ * lib/regexec.c:
New files, synced from libc, except that regex_internal.h
currently has a small porting fix.
2005-06-28 Simon Josefsson <jas@extundo.com>
- * lib/check-version.h, check-version.c: New files.
+ * lib/check-version.h, lib/check-version.c: New files.
2005-06-28 Simon Josefsson <jas@extundo.com>
2005-05-29 Derek Price <derek@ximbiot.com>
Paul Eggert <eggert@cs.ucla.edu>
- * lib/glob_.h, glob.c: New files.
+ * lib/glob_.h, lib/glob.c: New files.
2005-05-27 Paul Eggert <eggert@cs.ucla.edu>
2005-05-25 Derek Price <derek@ximbiot.com>
Paul Eggert <eggert@cs.ucla.edu>
- * modules/getlogin_r: New files.
-
-2005-05-25 Derek Price <derek@ximbiot.com>
- Paul Eggert <eggert@cs.ucla.edu>
-
- * m4/getlogin_r.m4: New files.
-
-2005-05-25 Derek Price <derek@ximbiot.com>
- Paul Eggert <eggert@cs.ucla.edu>
-
+ * modules/getlogin_r, m4/getlogin_r.m4: New files.
* lib/getlogin_r.c, getlogin_r.h: New files.
2005-05-25 Bruno Haible <bruno@clisp.org>
2005-05-17 Jim Meyering <jim@meyering.net>
- * lib/fts.c, fts_.h: New files, from coreutils.
+ * lib/fts.c, lib/fts_.h: New files, from coreutils.
2005-05-14 Paul Eggert <eggert@cs.ucla.edu>
2005-05-14 Paul Eggert <eggert@cs.ucla.edu>
Sync from coreutils.
- * lib/unlinkdir.c, unlinkdir.h: New files.
+ * lib/unlinkdir.c, lib/unlinkdir.h: New files.
* lib/gethrxtime.c, lib/gethrxtime.h, lib/getpass.h, lib/mountlist.h,
lib/path-concat.c, lib/regex.h, lib/unlocked-io.h, lib/xtime.h:
White space changes only.
2005-02-25 Paul Eggert <eggert@cs.ucla.edu>
- * m4/gethrxtime.m4, xnanosleep.m4: New files.
+ * m4/gethrxtime.m4, m4/xnanosleep.m4: New files.
* m4/gettime.m4 (gl_GETTIME): Check for nanotime.
2005-02-25 Paul Eggert <eggert@cs.ucla.edu>
- * lib/gethrxtime.h, gethrxtime.c, xtime.h: New files.
+ * lib/gethrxtime.h, lib/gethrxtime.c, lib/xtime.h: New files.
* lib/timespec.h (gettime): Return void, since it always
succeeds now. All uses changed.
* lib/gettime.c (gettime) Likewise.
2005-02-22 Simon Josefsson <jas@extundo.com>
- * lib/iconvme.h, iconvme.c: New files, from libc.
+ * lib/iconvme.h, lib/iconvme.c: New files, from libc.
2005-02-22 Simon Josefsson <jas@extundo.com>
2005-01-18 Jim Meyering <jim@meyering.net>
Merge from coreutils.
- * m4/chdir-long.m4, openat.m4: New files.
+ * m4/chdir-long.m4, m4/openat.m4: New files.
* m4/save-cwd.m4 (gl_SAVE_CWD): Add AC_LIBSOURCES for save-cwd.c,
save-cwd.h. Add AC_LIBOBJ for save-cwd.
* m4/chown.m4 (gl_FUNC_CHOWN): When cross-compiling, assume that chown
2004-11-10 Simon Josefsson <jas@extundo.com>
- * lib/getaddrinfo.h, getaddrinfo.c: New files.
+ * lib/getaddrinfo.h, lib/getaddrinfo.c: New files.
2004-11-10 Simon Josefsson <jas@extundo.com>
2004-09-30 Simon Josefsson <jas@extundo.com>
- * lib/snprintf.h, snprintf.c: New files.
+ * lib/snprintf.h, lib/snprintf.c: New files.
2004-09-30 Sergey Poznyakoff <gray@Mirddin.farlep.net>
2004-08-09 Paul Eggert <eggert@cs.ucla.edu>
- * m4/uint32_t.m4, uintptr_t.m4: New files.
+ * m4/uint32_t.m4, m4/uintptr_t.m4: New files.
* m4/sha1.m4: Renamed from sha.m4.
(gl_SHA1): Renamed from gl_SHA. All uses changed.
2004-08-08 Paul Eggert <eggert@cs.ucla.edu>
- * lib/xalloc-die.c: New files.
+ * lib/xalloc-die.c: New file.
* lib/xalloc.h (xalloc_fail_func, xalloc_msg_memory_exhausted): Remove.
All uses removed.
* lib/xmalloc.c (xalloc_fail_func, xalloc_msg_memory_exhausted):
More merge from coreutils.
- * m4/utimens.m4, utimecmp.m4: New files.
+ * m4/utimens.m4, m4/utimecmp.m4: New files.
* m4/backupfile.m4, euidacces.m4, acl.m4, afs.m4, calloc.m4, dirfd.m4,
fsusage.m4, jm-macros.m4, ls-mntd-fs.m4, md5.m4, mountlist.m4,
prereq.m4, sha.m4: Import changes from coreutils.
2004-08-06 Paul Eggert <eggert@cs.ucla.edu>
More merge from coreutils.
- * modules/raise, modules/readtokens0, modules/utimens,
- modules/utimecmp, module/xnanosleep: New files.
+ * modules/raise, modules/readtokens0, modules/utimens:
+ * modules/utimecmp, module/xnanosleep: New files.
* modules/strftime: Add lib/strftime.h.
Change include from <time.h> to "strftime.h".
* modules/yesno: Add lib/yesno.h.
we don't compile these functions for tar.
More merges from coreutils.
- * lib/raise.c, lib/readtokens0.h, lib/readtokens0.c, lib/strftime.h,
- lib/utimens.h, lib/utimens.c, lib/utimecmp.h, lib/utimecmp.c,
- lib/xnanosleep.h, lib/xnanosleep.c, lib/yesno.h: New files.
+ * lib/raise.c, lib/readtokens0.h, lib/readtokens0.c, lib/strftime.h:
+ * lib/utimens.h, lib/utimens.c, lib/utimecmp.h, lib/utimecmp.c:
+ * lib/xnanosleep.h, lib/xnanosleep.c, lib/yesno.h: New files.
* lib/addext.c: Remove; no longer needed.
* lib/yesno.c, lib/argmatch.h, lib/argmatch.c, lib/backupfile.h,
lib/backupfile.c, lib/euidaccess.c, lib/filemode.c, lib/closeout.c,
Merge from coreutils.
- * m4/c-strtod.m4, canonicalize.m4, fcntl-safer.m4, getcwd-path-max.m4:
- New files.
+ * m4/c-strtod.m4, m4/canonicalize.m4, m4/fcntl-safer.m4:
+ * m4/getcwd-path-max.m4: New files.
* m4/dos.m4 (gl_AC_DOS): filesystem -> file system renaming.
FILESYSTEM_PREFIX_LEN ->
* lib/.gdb-history: Remove; this doesn't belong here.
- * lib/c-strtod.c, c-strtod.h, c-strtold.c, cycle-check.c,
- cycle-check.h, dev-ino.h, canonicalize.h, canonicalize.c,
- fcntl-safer.h, fcntl-safer.c, getcwd.c: New files.
+ * lib/c-strtod.c, lib/c-strtod.h, lib/c-strtold.c, lib/cycle-check.c:
+ * lib/cycle-check.h, lib/dev-ino.h, lib/canonicalize.h:
+ * lib/canonicalize.c, lib/fcntl-safer.h, lib/fcntl-safer.c:
+ * lib/getcwd.c: New files.
* lib/dirname.h: Include <stdbool.h>.
(FILE_SYSTEM_PREFIX_LEN): Renamed from FILESYSTEM_PREFIX_LEN,
2004-08-05 Paul Eggert <eggert@cs.ucla.edu>
Merge from coreutils.
- * modules/c-strtod, modules/c-strtold, modules/canonicalize,
- modules/cycle-check, modules/fcntl-safer, modules/getcwd: New files.
+ * modules/c-strtod, modules/c-strtold, modules/canonicalize:
+ * modules/cycle-check, modules/fcntl-safer, modules/getcwd: New files.
* modules/path-concat: Don't depend on strdup.
2004-08-03 Simon Josefsson <jas@extundo.com>
2004-06-22 Paul Eggert <eggert@cs.ucla.edu>
- * lib/argz.c, argz_.h: New files, which are autoupdated from libtool.
+ * lib/argz.c, lib/argz_.h: New files, which are autoupdated from
+ libtool.
2004-06-22 Paul Eggert <eggert@cs.ucla.edu>
Merge from coreutils.
- * lib/imaxtostr.c, inttostr.c, inttostr.h, offtostr.c, umaxtostr.c:
- New files.
+ * lib/imaxtostr.c, lib/inttostr.c, lib/inttostr.h, lib/offtostr.c:
+ * lib/umaxtostr.c: New files.
* lib/getdate.h: Include stdbool.h, and timespec.h instead of
the usual <time.h> dance.
Include cloexec.h and xalloc.h.
(getloadavg): Restore LC_NUMERIC locale after setting it temporarily.
Use set_cloexec_flag rather than rolling our own.
- * lib/cloexec.c, cloexec.h: New files.
+ * lib/cloexec.c, lib/cloexec.h: New files.
2004-03-29 Paul Eggert <eggert@twinsun.com>
2004-02-23 Karl Berry <karl@gnu.org>
- * doc/maintain.texi, standards.texi, make-stds.texi: new files
+ * doc/maintain.texi, doc/standards.texi, doc/make-stds.texi: new files
(from fencepost.gnu.org:/gd/gnuorg).
2004-02-23 Karl Berry <karl@gnu.org>
2004-01-18 Karl Berry <karl@gnu.org>
- * doc/gpl.texi, lgpl.texi: new files.
+ * doc/gpl.texi, doc/lgpl.texi: new files.
2004-01-18 Karl Berry <karl@gnu.org>
2003-09-06 Paul Eggert <eggert@twinsun.com>
- * lib/time_r.c, time_r.h: New files.
+ * lib/time_r.c, lib/time_r.h: New files.
* lib/mktime.c (my_mktime_localtime_r): Remove; all uses changed to
__localtime_r.
2002-06-22 Jim Meyering <meyering@lucent.com>
- * lib/c-stack.c, c-stack.h: New files, from diffutils-2.8.2.
+ * lib/c-stack.c, lib/c-stack.h: New files, from diffutils-2.8.2.
* lib/exitfail.c, exitfail.h: Likewise.
* lib/Makefile.am (libfetish_a_SOURCES): Add exitfail.c and exitfail.h.
2002-04-28 Paul Eggert <eggert@twinsun.com>
- * lib/sig2str.h, sig2str.c: New files.
+ * lib/sig2str.h, lib/sig2str.c: New files.
* lib/Makefile.am (libfetish_a_SOURCES): Add sig2str.h.
2002-04-28 Paul Eggert <eggert@twinsun.com>
2002-02-25 Paul Eggert <eggert@twinsun.com>
- * lib/acl.c, acl.h: New files.
+ * lib/acl.c, lib/acl.h: New files.
* lib/Makefile.am (libfetish_a_SOURCES): Add acl.h, acl.c.
2002-02-24 Jim Meyering <meyering@lucent.com>
2002-02-15 Paul Eggert <eggert@twinsun.com>
- * lib/posixver.c, posixver.h: New files.
+ * lib/posixver.c, lib/posixver.h: New files.
* lib/Makefile.am (libfetish_a_SOURCES): Add them.
2002-02-02 Paul Eggert <eggert@twinsun.com>
2002-01-21 Paul Eggert <eggert@twinsun.com>
- * lib/xmemcoll.h, xmemcoll.c: New files.
+ * lib/xmemcoll.h, lib/xmemcoll.c: New files.
* lib/Makefile.am (libfetish_a_SOURCES): Add them.
* lib/memcoll.c: Include errno.h, and declare errno if not defined.
(memcoll): Set errno to zero if there is no error.
2001-11-01 Jim Meyering <meyering@lucent.com>
- * lib/dirfd.c, dirfd.h: New files.
+ * lib/dirfd.c, lib/dirfd.h: New files.
* lib/Makefile.am (libfetish_a_SOURCES): Add dirfd.h.
* lib/hash.c (hash_print) [TESTING]: Clean up.
Add dup-safer.c, fopen-safer.c.
(noinst_HEADERS): Add stdio-safer.h, unistd-safer.h.
- * lib/dup-safer.c, lib/fopen-safer.c, lib/stdio-safer.h,
- lib/unistd-safer.h: New files.
+ * lib/dup-safer.c, lib/fopen-safer.c, lib/stdio-safer.h:
+ * lib/unistd-safer.h: New files.
2001-02-25 Paul Eggert <eggert@twinsun.com>
* lib/mkstemp.c (__GT_FILE): Define to zero if not defined.
- * lib/mkstemp.c, tempname.c: New files, taken from glibc 2.2.2.
+ * lib/mkstemp.c, lib/tempname.c: New files, taken from glibc 2.2.2.
2001-02-18 Paul Eggert <eggert@twinsun.com>
2000-12-18 Paul Eggert <eggert@twinsun.com>
- * lib/physmem.h, physmem.c: New files.
+ * lib/physmem.h, lib/physmem.c: New files.
* lib/Makefile.am (libfetish_a_SOURCES): Add physmem.c.
(noinst_HEADERS): Add physmem.h.
* lib/config.charset: Output a line containing "Packages using this
file".
- * lib/ref-add.sed.in, ref-del.sed.in: New files.
+ * lib/ref-add.sed.in, lib/ref-del.sed.in: New files.
* lib/Makefile.am (install-exec-local, uninstall-local, ref-add.sed,
ref-del.sed): New rules.
* lib/config.charset: New file.
* lib/localcharset.c: New file.
- * lib/unicodeio.h, unicodeio.c: New files.
+ * lib/unicodeio.h, lib/unicodeio.c: New files.
* lib/Makefile.am (DEFS): Add -DLIBDIR=...
(libfetish_a_SOURCES): Add localcharset.c and unicodeio.c.
(noinst_HEADERS): Add unicodeio.h.
--- /dev/null
+/* Return the canonical absolute name of a given file.
+ Copyright (C) 1996-2003, 2005-2006 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+#include <config.h>
+
+/* Avoid a clash of our rpl_realpath() function with the prototype in
+ <stdlib.h> on Solaris 2.5.1. */
+#undef realpath
+
+#if !HAVE_CANONICALIZE_FILE_NAME || defined _LIBC
+
+#include <alloca.h>
+
+/* Specification. */
+#include "canonicalize.h"
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_UNISTD_H || defined _LIBC
+# include <unistd.h>
+#endif
+
+#include <limits.h>
+
+#if HAVE_SYS_PARAM_H || defined _LIBC
+# include <sys/param.h>
+#endif
+#ifndef MAXSYMLINKS
+# define MAXSYMLINKS 20
+#endif
+
+#include <sys/stat.h>
+
+#include <errno.h>
+#ifndef _LIBC
+# define __set_errno(e) errno = (e)
+# ifndef ENAMETOOLONG
+# define ENAMETOOLONG EINVAL
+# endif
+#endif
+
+#ifdef _LIBC
+# include <shlib-compat.h>
+#else
+# define SHLIB_COMPAT(lib, introduced, obsoleted) 0
+# define versioned_symbol(lib, local, symbol, version)
+# define compat_symbol(lib, local, symbol, version)
+# define weak_alias(local, symbol)
+# define __canonicalize_file_name canonicalize_file_name
+# define __realpath rpl_realpath
+# include "pathmax.h"
+# include "allocsa.h"
+# if HAVE_GETCWD
+# ifdef VMS
+ /* We want the directory in Unix syntax, not in VMS syntax. */
+# define __getcwd(buf, max) getcwd (buf, max, 0)
+# else
+# define __getcwd getcwd
+# endif
+# else
+# define __getcwd(buf, max) getwd (buf)
+# endif
+# define __readlink readlink
+ /* On systems without symbolic links, call stat() instead of lstat(). */
+# if !defined S_ISNLK && !HAVE_READLINK
+# define lstat stat
+# endif
+#endif
+
+/* Return the canonical absolute name of file NAME. A canonical name
+ does not contain any `.', `..' components nor any repeated path
+ separators ('/') or symlinks. All path components must exist. If
+ RESOLVED is null, the result is malloc'd; otherwise, if the
+ canonical name is PATH_MAX chars or more, returns null with `errno'
+ set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars,
+ returns the name in RESOLVED. If the name cannot be resolved and
+ RESOLVED is non-NULL, it contains the path of the first component
+ that cannot be resolved. If the path can be resolved, RESOLVED
+ holds the same value as the value returned. */
+
+char *
+__realpath (const char *name, char *resolved)
+{
+ char *rpath, *dest, *extra_buf = NULL;
+ const char *start, *end, *rpath_limit;
+ long int path_max;
+#ifdef S_ISLNK
+ int num_links = 0;
+#endif
+
+ if (name == NULL)
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ either parameter is a null pointer. We extend this to allow
+ the RESOLVED parameter to be NULL in case the we are expected to
+ allocate the room for the return value. */
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ if (name[0] == '\0')
+ {
+ /* As per Single Unix Specification V2 we must return an error if
+ the name argument points to an empty string. */
+ __set_errno (ENOENT);
+ return NULL;
+ }
+
+#ifdef PATH_MAX
+ path_max = PATH_MAX;
+#else
+ path_max = pathconf (name, _PC_PATH_MAX);
+ if (path_max <= 0)
+ path_max = 1024;
+#endif
+
+ if (resolved == NULL)
+ {
+ rpath = malloc (path_max);
+ if (rpath == NULL)
+ return NULL;
+ }
+ else
+ rpath = resolved;
+ rpath_limit = rpath + path_max;
+
+ if (name[0] != '/')
+ {
+ if (!__getcwd (rpath, path_max))
+ {
+ rpath[0] = '\0';
+ goto error;
+ }
+ dest = strchr (rpath, '\0');
+ }
+ else
+ {
+ rpath[0] = '/';
+ dest = rpath + 1;
+ }
+
+ for (start = end = name; *start; start = end)
+ {
+#ifdef _LIBC
+ struct stat64 st;
+#else
+ struct stat st;
+#endif
+
+ /* Skip sequence of multiple path-separators. */
+ while (*start == '/')
+ ++start;
+
+ /* Find end of path component. */
+ for (end = start; *end && *end != '/'; ++end)
+ /* Nothing. */;
+
+ if (end - start == 0)
+ break;
+ else if (end - start == 1 && start[0] == '.')
+ /* nothing */;
+ else if (end - start == 2 && start[0] == '.' && start[1] == '.')
+ {
+ /* Back up to previous component, ignore if at root already. */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ }
+ else
+ {
+ size_t new_size;
+
+ if (dest[-1] != '/')
+ *dest++ = '/';
+
+ if (dest + (end - start) >= rpath_limit)
+ {
+ ptrdiff_t dest_offset = dest - rpath;
+ char *new_rpath;
+
+ if (resolved)
+ {
+ __set_errno (ENAMETOOLONG);
+ if (dest > rpath + 1)
+ dest--;
+ *dest = '\0';
+ goto error;
+ }
+ new_size = rpath_limit - rpath;
+ if (end - start + 1 > path_max)
+ new_size += end - start + 1;
+ else
+ new_size += path_max;
+ new_rpath = (char *) realloc (rpath, new_size);
+ if (new_rpath == NULL)
+ goto error;
+ rpath = new_rpath;
+ rpath_limit = rpath + new_size;
+
+ dest = rpath + dest_offset;
+ }
+
+#ifdef _LIBC
+ dest = __mempcpy (dest, start, end - start);
+#else
+ memcpy (dest, start, end - start);
+ dest += end - start;
+#endif
+ *dest = '\0';
+
+#ifdef _LIBC
+ if (__lxstat64 (_STAT_VER, rpath, &st) < 0)
+#else
+ if (lstat (rpath, &st) < 0)
+#endif
+ goto error;
+
+#ifdef S_ISLNK
+ if (S_ISLNK (st.st_mode))
+ {
+ char *buf;
+ size_t len;
+ int n;
+
+ if (++num_links > MAXSYMLINKS)
+ {
+ __set_errno (ELOOP);
+ goto error;
+ }
+
+ buf = allocsa (path_max);
+ if (!buf)
+ {
+ errno = ENOMEM;
+ goto error;
+ }
+
+ n = __readlink (rpath, buf, path_max);
+ if (n < 0)
+ {
+ int saved_errno = errno;
+ freesa (buf);
+ errno = saved_errno;
+ goto error;
+ }
+ buf[n] = '\0';
+
+ if (!extra_buf)
+ {
+ extra_buf = allocsa (path_max);
+ if (!extra_buf)
+ {
+ freesa (buf);
+ errno = ENOMEM;
+ goto error;
+ }
+ }
+
+ len = strlen (end);
+ if ((long int) (n + len) >= path_max)
+ {
+ freesa (buf);
+ __set_errno (ENAMETOOLONG);
+ goto error;
+ }
+
+ /* Careful here, end may be a pointer into extra_buf... */
+ memmove (&extra_buf[n], end, len + 1);
+ name = end = memcpy (extra_buf, buf, n);
+
+ if (buf[0] == '/')
+ dest = rpath + 1; /* It's an absolute symlink */
+ else
+ /* Back up to previous component, ignore if at root already: */
+ if (dest > rpath + 1)
+ while ((--dest)[-1] != '/');
+ }
+#endif
+ }
+ }
+ if (dest > rpath + 1 && dest[-1] == '/')
+ --dest;
+ *dest = '\0';
+
+ if (extra_buf)
+ freesa (extra_buf);
+
+ return resolved ? memcpy (resolved, rpath, dest - rpath + 1) : rpath;
+
+error:
+ {
+ int saved_errno = errno;
+ if (extra_buf)
+ freesa (extra_buf);
+ if (resolved)
+ strcpy (resolved, rpath);
+ else
+ free (rpath);
+ errno = saved_errno;
+ }
+ return NULL;
+}
+#ifdef _LIBC
+versioned_symbol (libc, __realpath, realpath, GLIBC_2_3);
+#endif
+
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3)
+char *
+__old_realpath (const char *name, char *resolved)
+{
+ if (resolved == NULL)
+ {
+ __set_errno (EINVAL);
+ return NULL;
+ }
+
+ return __realpath (name, resolved);
+}
+compat_symbol (libc, __old_realpath, realpath, GLIBC_2_0);
+#endif
+
+
+char *
+__canonicalize_file_name (const char *name)
+{
+ return __realpath (name, NULL);
+}
+weak_alias (__canonicalize_file_name, canonicalize_file_name)
+
+#else
+
+/* This declaration is solely to ensure that after preprocessing
+ this file is never empty. */
+typedef int dummy;
+
+#endif