diff options
Diffstat (limited to 'tests/same-inode.h')
| -rw-r--r-- | tests/same-inode.h | 86 | 
1 files changed, 62 insertions, 24 deletions
| diff --git a/tests/same-inode.h b/tests/same-inode.h index f65f3d03..62dd088e 100644 --- a/tests/same-inode.h +++ b/tests/same-inode.h @@ -1,6 +1,6 @@  /* Determine whether two stat buffers are known to refer to the same file. -   Copyright (C) 2006, 2009-2022 Free Software Foundation, Inc. +   Copyright (C) 2006, 2009-2024 Free Software Foundation, Inc.     This file is free software: you can redistribute it and/or modify     it under the terms of the GNU Lesser General Public License as @@ -16,32 +16,70 @@     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */  #ifndef SAME_INODE_H -# define SAME_INODE_H 1 - -# include <sys/types.h> - -# if defined __VMS && __CRTL_VER < 80200000 -#  define SAME_INODE(a, b)             \ -    ((a).st_ino[0] == (b).st_ino[0]    \ -     && (a).st_ino[1] == (b).st_ino[1] \ -     && (a).st_ino[2] == (b).st_ino[2] \ -     && (a).st_dev == (b).st_dev) -# elif defined _WIN32 && ! defined __CYGWIN__ -   /* Native Windows.  */ -#  if _GL_WINDOWS_STAT_INODES -    /* stat() and fstat() set st_dev and st_ino to 0 if information about -       the inode is not available.  */ -#   define SAME_INODE(a, b) \ -     (!((a).st_ino == 0 && (a).st_dev == 0) \ -      && (a).st_ino == (b).st_ino && (a).st_dev == (b).st_dev) +#define SAME_INODE_H 1 + +/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE.  */ +#if !_GL_CONFIG_H_INCLUDED + #error "Please include config.h first." +#endif + +#include <sys/stat.h> + +_GL_INLINE_HEADER_BEGIN +#ifndef SAME_INODE_INLINE +# define SAME_INODE_INLINE _GL_INLINE +#endif + +/* True if A and B point to structs with st_dev and st_ino members +   that are known to represent the same file. + +   Use | and ^ to shorten generated code, and to lessen the +   probability of screwups if st_ino is an array.  */ + +#if defined __VMS && __CRTL_VER < 80200000 +# define PSAME_INODE(a, b) (! (((a)->st_dev ^ (b)->st_dev) \ +                               | ((a)->st_ino[0] ^ (b)->st_ino[0]) \ +                               | ((a)->st_ino[1] ^ (b)->st_ino[1]) \ +                               | ((a)->st_ino[2] ^ (b)->st_ino[2]))) +#elif defined _WIN32 && ! defined __CYGWIN__ +  /* Native Windows.  */ +# if _GL_WINDOWS_STAT_INODES +  /* stat() and fstat() set st_dev and st_ino to 0 if information about +     the inode is not available.  */ +#  if _GL_WINDOWS_STAT_INODES == 2 +#   define PSAME_INODE(a, b) \ +     (! (! ((a)->st_dev | (a)->st_ino._gl_ino[0] | (a)->st_ino._gl_ino[1]) \ +         | ((a)->st_dev ^ (b)->st_dev) \ +         | ((a)->st_ino._gl_ino[0] ^ (b)->st_ino._gl_ino[0]) \ +         | ((a)->st_ino._gl_ino[1] ^ (b)->st_ino._gl_ino[1])))  #  else -    /* stat() and fstat() set st_ino to 0 always.  */ -#   define SAME_INODE(a, b) 0 +#   define PSAME_INODE(a, b) (! (! ((a)->st_dev | (a)->st_ino) \ +                                 | ((a)->st_dev ^ (b)->st_dev) \ +                                 | ((a)->st_ino ^ (b)->st_ino)))  #  endif  # else -#  define SAME_INODE(a, b)    \ -    ((a).st_ino == (b).st_ino \ -     && (a).st_dev == (b).st_dev) +  /* stat() and fstat() set st_ino to 0 always.  */ +#  define PSAME_INODE(a, b) 0  # endif +#else +  /* POSIX.  */ +# define PSAME_INODE(a, b) (! (((a)->st_dev ^ (b)->st_dev) \ +                               | ((a)->st_ino ^ (b)->st_ino))) +#endif + +/* True if struct objects A and B are known to represent the same file.  */ + +#define SAME_INODE(a, b) PSAME_INODE (&(a), &(b)) + +/* True if *A and *B represent the same file.  Unlike PSAME_INODE, +   args are evaluated once and must point to struct stat.  */ + +SAME_INODE_INLINE bool +psame_inode (struct stat const *a, struct stat const *b) +{ +  return PSAME_INODE (a, b); +} + +_GL_INLINE_HEADER_END  #endif | 
