Diff for /embedaddon/libiconv/srclib/lstat.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2012/05/29 09:29:43 version 1.1.1.2, 2021/03/17 13:38:46
Line 1 Line 1
 /* Work around a bug of lstat on some systems  /* Work around a bug of lstat on some systems
   
   Copyright (C) 1997-2006, 2008-2011 Free Software Foundation, Inc.   Copyright (C) 1997-2006, 2008-2019 Free Software Foundation, Inc.
   
    This program is free software: you can redistribute it and/or modify     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     it under the terms of the GNU General Public License as published by
Line 13 Line 13
    GNU General Public License for more details.     GNU General Public License for more details.
   
    You should have received a copy of the GNU General Public License     You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
   
 /* written by Jim Meyering */  /* written by Jim Meyering */
   
   /* If the user's config.h happens to include <sys/stat.h>, let it include only
      the system's <sys/stat.h> here, so that orig_lstat doesn't recurse to
      rpl_lstat.  */
   #define __need_system_sys_stat_h
 #include <config.h>  #include <config.h>
   
 #if !HAVE_LSTAT  #if !HAVE_LSTAT
Line 27  typedef int dummy; Line 31  typedef int dummy;
 #else /* HAVE_LSTAT */  #else /* HAVE_LSTAT */
   
 /* Get the original definition of lstat.  It might be defined as a macro.  */  /* Get the original definition of lstat.  It might be defined as a macro.  */
 # define __need_system_sys_stat_h  
 # include <sys/types.h>  # include <sys/types.h>
 # include <sys/stat.h>  # include <sys/stat.h>
 # undef __need_system_sys_stat_h  # undef __need_system_sys_stat_h
   
static inline intstatic int
 orig_lstat (const char *filename, struct stat *buf)  orig_lstat (const char *filename, struct stat *buf)
 {  {
   return lstat (filename, buf);    return lstat (filename, buf);
 }  }
   
 /* Specification.  */  /* Specification.  */
# include <sys/stat.h># ifdef __osf__
 /* Write "sys/stat.h" here, not <sys/stat.h>, otherwise OSF/1 5.1 DTK cc
    eliminates this include because of the preliminary #include <sys/stat.h>
    above.  */
 #  include "sys/stat.h"
 # else
 #  include <sys/stat.h>
 # endif
   
   # include "stat-time.h"
   
 # include <string.h>  # include <string.h>
 # include <errno.h>  # include <errno.h>
   
 /* lstat works differently on Linux and Solaris systems.  POSIX (see  /* lstat works differently on Linux and Solaris systems.  POSIX (see
   `pathname resolution' in the glossary) requires that programs like   "pathname resolution" in the glossary) requires that programs like
   `ls' take into consideration the fact that FILE has a trailing slash   'ls' take into consideration the fact that FILE has a trailing slash
    when FILE is a symbolic link.  On Linux and Solaris 10 systems, the     when FILE is a symbolic link.  On Linux and Solaris 10 systems, the
    lstat function already has the desired semantics (in treating     lstat function already has the desired semantics (in treating
   `lstat ("symlink/", sbuf)' just like `lstat ("symlink/.", sbuf)',   'lstat ("symlink/", sbuf)' just like 'lstat ("symlink/.", sbuf)',
    but on Solaris 9 and earlier it does not.     but on Solaris 9 and earlier it does not.
   
    If FILE has a trailing slash and specifies a symbolic link,     If FILE has a trailing slash and specifies a symbolic link,
Line 60  orig_lstat (const char *filename, struct stat *buf) Line 72  orig_lstat (const char *filename, struct stat *buf)
 int  int
 rpl_lstat (const char *file, struct stat *sbuf)  rpl_lstat (const char *file, struct stat *sbuf)
 {  {
  size_t len;  int result = orig_lstat (file, sbuf);
  int lstat_result = orig_lstat (file, sbuf); 
   
   if (lstat_result != 0)  
     return lstat_result;  
   
   /* This replacement file can blindly check against '/' rather than    /* This replacement file can blindly check against '/' rather than
      using the ISSLASH macro, because all platforms with '\\' either       using the ISSLASH macro, because all platforms with '\\' either
      lack symlinks (mingw) or have working lstat (cygwin) and thus do       lack symlinks (mingw) or have working lstat (cygwin) and thus do
      not compile this file.  0 len should have already been filtered       not compile this file.  0 len should have already been filtered
      out above, with a failure return of ENOENT.  */       out above, with a failure return of ENOENT.  */
  len = strlen (file);  if (result == 0)
  if (file[len - 1] != '/' || S_ISDIR (sbuf->st_mode)) 
    return 0; 
 
  /* At this point, a trailing slash is only permitted on 
     symlink-to-dir; but it should have found information on the 
     directory, not the symlink.  Call stat() to get info about the 
     link's referent.  Our replacement stat guarantees valid results, 
     even if the symlink is not pointing to a directory.  */ 
  if (!S_ISLNK (sbuf->st_mode)) 
     {      {
      errno = ENOTDIR;      if (S_ISDIR (sbuf->st_mode) || file[strlen (file) - 1] != '/')
      return -1;        result = stat_time_normalize (result, sbuf);
       else
         {
           /* At this point, a trailing slash is permitted only on
              symlink-to-dir; but it should have found information on the
              directory, not the symlink.  Call 'stat' to get info about the
              link's referent.  Our replacement stat guarantees valid results,
              even if the symlink is not pointing to a directory.  */
           if (!S_ISLNK (sbuf->st_mode))
             {
               errno = ENOTDIR;
               return -1;
             }
           result = stat (file, sbuf);
         }
     }      }
  return stat (file, sbuf);  return result;
 }  }
   
 #endif /* HAVE_LSTAT */  #endif /* HAVE_LSTAT */

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>