Diff for /embedaddon/libiconv/srclib/readlink.c between versions 1.1 and 1.1.1.2

version 1.1, 2012/02/21 22:57:48 version 1.1.1.2, 2012/05/29 09:29:43
Line 1 Line 1
 /* Stub for readlink().  /* Stub for readlink().
   Copyright (C) 2003-2007 Free Software Foundation, Inc.   Copyright (C) 2003-2007, 2009-2011 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 20 Line 20
 #include <unistd.h>  #include <unistd.h>
   
 #include <errno.h>  #include <errno.h>
#include <sys/types.h>#include <string.h>
 #include <sys/stat.h>  #include <sys/stat.h>
 #include <stddef.h>  
   
 #if !HAVE_READLINK  #if !HAVE_READLINK
   
 /* readlink() substitute for systems that don't have a readlink() function,  /* readlink() substitute for systems that don't have a readlink() function,
    such as DJGPP 2.03 and mingw32.  */     such as DJGPP 2.03 and mingw32.  */
   
/* The official POSIX return type of readlink() is ssize_t, but since heressize_t
   we have no declaration in a public header file, we use 'int' as returnreadlink (const char *name, char *buf _GL_UNUSED,
   type.  */          size_t bufsize _GL_UNUSED)
 
int 
readlink (const char *path, char *buf, size_t bufsize) 
 {  {
   struct stat statbuf;    struct stat statbuf;
   
   /* In general we should use lstat() here, not stat().  But on platforms    /* In general we should use lstat() here, not stat().  But on platforms
     without symbolic links lstat() - if it exists - would be equivalent to     without symbolic links, lstat() - if it exists - would be equivalent to
      stat(), therefore we can use stat().  This saves us a configure check.  */       stat(), therefore we can use stat().  This saves us a configure check.  */
  if (stat (path, &statbuf) >= 0)  if (stat (name, &statbuf) >= 0)
     errno = EINVAL;      errno = EINVAL;
   return -1;    return -1;
 }  }
   
#endif#else /* HAVE_READLINK */
 
 # undef readlink
 
 /* readlink() wrapper that uses correct types, for systems like cygwin
    1.5.x where readlink returns int, and which rejects trailing slash,
    for Solaris 9.  */
 
 ssize_t
 rpl_readlink (const char *name, char *buf, size_t bufsize)
 {
 # if READLINK_TRAILING_SLASH_BUG
   size_t len = strlen (name);
   if (len && name[len - 1] == '/')
     {
       /* Even if name without the slash is a symlink to a directory,
          both lstat() and stat() must resolve the trailing slash to
          the directory rather than the symlink.  We can therefore
          safely use stat() to distinguish between EINVAL and
          ENOTDIR/ENOENT, avoiding extra overhead of rpl_lstat().  */
       struct stat st;
       if (stat (name, &st) == 0)
         errno = EINVAL;
       return -1;
     }
 # endif /* READLINK_TRAILING_SLASH_BUG */
   return readlink (name, buf, bufsize);
 }
 
 #endif /* HAVE_READLINK */

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


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