mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-22 13:00:06 +00:00
df21c8581a
Wed Aug 14 21:36:16 1996 Ulrich Drepper <drepper@cygnus.com> * stdlib/strtod.c (STRTOD): Correct assertion about size of wint_t and wchar_t. Reported by David Mosberger-Tang. Mon Aug 12 22:40:16 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * elf/dl-lookup.c (_dl_lookup_symbol): Remove fifth parameter RELOC_ADDR and make NOPLT a set of flags. All callers changed. Delete condition that checks for resolving to the location being filled in. Add condition to skip the executable's symbols if requested. * elf/link.h: Change declaration of _dl_lookup_symbol accordingly. (DL_LOOKUP_NOEXEC, DL_LOOKUP_NOPLT): New definitions. * elf/dl-reloc.c (RESOLVE): Remove second parameter and rename NOPLT to FLAGS. * elf/dl-runtime.c (RESOLVE): Likewise. * elf/rtld.c (RESOLVE): Likewise. * sysdeps/m68k/dl-machine.h (elf_machine_rela): Pass DL_LOOKUP_NOEXEC as second argument to the RESOLVE macro if processing a copy reloc, DL_LOOKUP_NOPLT for a jump slot reloc, zero otherwise. * sysdeps/alpha/dl-machine.h (elf_machine_rela): Likewise. * sysdeps/i386/dl-machine.h (elf_machine_rel): Likewise. * sysdeps/mips/dl-machine.h (elf_machine_rel): Likewise. Wed Aug 14 17:57:08 1996 Ulrich Drepper <drepper@cygnus.com> * MakeTAGS: Clean up use of --omit-header and -n for xgettext. * po/header.pot: Add empty line at end. Sun Aug 11 13:45:33 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * MakeTAGS (all-pot): Remove $P/errlist.pot, all error messages are now in $P/stdio-common.pot. (XGETTEXTFLAGS-errlist.pot): Variable removed. Mon Aug 12 19:25:03 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makerules (do-ar, o-iterator-doit): Compute path to autolock script at run time, not configure time. * config.make.in, configure.in: Undo previous change. Wed Aug 14 13:20:02 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/i386/close.S: Push return value of thread on stack as argument for `_exit'. Reported by Andreas Schwab. Mon Aug 12 19:36:25 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/unix/sysv/linux/m68k/clone.S: New file. Wed Aug 14 04:22:35 1996 Richard Henderson <rth@tamu.edu> * elf/dl-load.c (_dl_map_object): Save name in malloced memory. (_dl_map_object_from_fd): Free name on error. Wed Aug 14 13:00:09 1996 Ulrich Drepper <drepper@cygnus.com> * string/strdup.c: Use result of memcpy to avoid reloading. Tue Aug 13 00:55:03 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * shadow/sgetspent_r.c (__sgetspent_r): Copy string to buffer, not the other way round. * resolv/Makefile (libresolv-routines): Add base64, inet_net_ntop, inet_net_pton, inet_net. * resolv/arpa/nameser.h (__BIND): Update version number. Mon Aug 12 19:03:22 1996 Thomas Bushnell n/BSG <thomas@psilocin.gnu.ai.mit.edu> * sysdeps/generic/gnu/types.h: Declare __fd_mask as `unsigned long'. * mach/Makefile (mach/mach_host.uh): Depend on $(objpfx)/mach-syscalls.mk. ($(objpfx)mach-shortcuts.h): Depend on $(objpfx)mach/mach_host.h. (This fixes a make loop; thanks to Marcus Daniels <marcus@sysc.pdx.edu> for the patch.)
175 lines
4.4 KiB
C
175 lines
4.4 KiB
C
/* Return the canonical absolute name of a given file.
|
|
Copyright (C) 1996 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., 675 Mass Ave,
|
|
Cambridge, MA 02139, USA. */
|
|
|
|
#include <assert.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <limits.h>
|
|
#include <sys/param.h>
|
|
#include <sys/stat.h>
|
|
#include <errno.h>
|
|
|
|
/* 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. */
|
|
|
|
static char *
|
|
canonicalize (const char *name, char *resolved)
|
|
{
|
|
char *rpath, *dest, *extra_buf = NULL;
|
|
const char *start, *end, *rpath_limit;
|
|
long int path_max;
|
|
int num_links = 0;
|
|
|
|
#ifdef PATH_MAX
|
|
path_max = PATH_MAX;
|
|
#else
|
|
path_max = pathconf (name, _PC_PATH_MAX);
|
|
if (path_max <= 0)
|
|
path_max = 1024;
|
|
#endif
|
|
|
|
rpath = resolved;
|
|
rpath_limit = rpath + path_max;
|
|
if (!resolved)
|
|
rpath = malloc (path_max);
|
|
|
|
strcpy (rpath, "/");
|
|
if (name[0] != '/' && !getcwd (rpath, path_max))
|
|
goto error;
|
|
dest = rpath + strlen (rpath);
|
|
|
|
for (start = end = name; *start; start = end)
|
|
{
|
|
struct stat st;
|
|
int n;
|
|
|
|
/* skip sequence of multiple path-separators: */
|
|
while (*start == '/') ++start;
|
|
|
|
/* find end of path component: */
|
|
for (end = start; *end && *end != '/'; ++end);
|
|
|
|
if (end - start == 0)
|
|
break;
|
|
else if (strncmp (start, ".", end - start) == 0)
|
|
/* nothing */;
|
|
else if (strncmp (start, "..", end - start) == 0) {
|
|
/* 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)
|
|
{
|
|
if (resolved)
|
|
{
|
|
errno = ENAMETOOLONG;
|
|
goto error;
|
|
}
|
|
new_size = rpath_limit - rpath;
|
|
if (end - start + 1 > path_max)
|
|
new_size += end - start + 1;
|
|
else
|
|
new_size += path_max;
|
|
rpath = realloc (rpath, new_size);
|
|
rpath_limit = rpath + new_size;
|
|
if (!rpath)
|
|
return NULL;
|
|
}
|
|
|
|
memcpy (dest, start, end - start);
|
|
dest += end - start;
|
|
*dest = '\0';
|
|
|
|
if (__lstat (rpath, &st) < 0)
|
|
goto error;
|
|
|
|
if (S_ISLNK (st.st_mode))
|
|
{
|
|
char * buf = __alloca(path_max);
|
|
|
|
if (++num_links > MAXSYMLINKS)
|
|
{
|
|
errno = ELOOP;
|
|
goto error;
|
|
}
|
|
|
|
n = readlink (rpath, buf, path_max);
|
|
if (n < 0)
|
|
goto error;
|
|
buf[n] = '\0';
|
|
|
|
if (!extra_buf)
|
|
extra_buf = __alloca (path_max);
|
|
|
|
if ((long int) (n + strlen (end)) >= path_max)
|
|
{
|
|
errno = ENAMETOOLONG;
|
|
goto error;
|
|
}
|
|
|
|
/* careful here, end may be a pointer into extra_buf... */
|
|
strcat (buf, end);
|
|
strcpy (extra_buf, buf);
|
|
name = end = extra_buf;
|
|
|
|
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] != '/');
|
|
}
|
|
else
|
|
num_links = 0;
|
|
}
|
|
}
|
|
if (dest > rpath + 1 && dest[-1] == '/')
|
|
--dest;
|
|
*dest = '\0';
|
|
return rpath;
|
|
|
|
error:
|
|
if (!resolved)
|
|
free (rpath);
|
|
return NULL;
|
|
}
|
|
|
|
weak_alias (canonicalize, realpath)
|
|
|
|
char *
|
|
canonicalize_file_name (const char *name)
|
|
{
|
|
return canonicalize (name, NULL);
|
|
}
|