# - Find Linux extended attribute support
#
# This module sets:
#   XATTR_FOUND       - true if getxattr/setxattr are available
#   XATTR_LIBRARIES   - libraries needed for xattr functions, if any
#
# Modern glibc exposes getxattr/setxattr from libc.  Older systems may
# require libattr, so check libc first and then retry with -lattr.

include(CheckIncludeFile)
include(CheckSymbolExists)

set(XATTR_FOUND FALSE)
set(XATTR_LIBRARIES "")

check_include_file("sys/xattr.h" XATTR_HAVE_SYS_XATTR_H)

if(XATTR_HAVE_SYS_XATTR_H)
  check_symbol_exists(getxattr "sys/types.h;sys/xattr.h" XATTR_HAVE_GETXATTR)
  check_symbol_exists(setxattr "sys/types.h;sys/xattr.h" XATTR_HAVE_SETXATTR)

  if(XATTR_HAVE_GETXATTR AND XATTR_HAVE_SETXATTR)
    set(XATTR_FOUND TRUE)
  else()
    find_library(XATTR_ATTR_LIBRARY attr)
    if(XATTR_ATTR_LIBRARY)
      set(_XATTR_SAVE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES}")
      set(CMAKE_REQUIRED_LIBRARIES "${XATTR_ATTR_LIBRARY}")
      check_symbol_exists(getxattr "sys/types.h;sys/xattr.h" XATTR_HAVE_GETXATTR_ATTR)
      check_symbol_exists(setxattr "sys/types.h;sys/xattr.h" XATTR_HAVE_SETXATTR_ATTR)
      set(CMAKE_REQUIRED_LIBRARIES "${_XATTR_SAVE_REQUIRED_LIBRARIES}")

      if(XATTR_HAVE_GETXATTR_ATTR AND XATTR_HAVE_SETXATTR_ATTR)
        set(XATTR_FOUND TRUE)
        set(XATTR_LIBRARIES "${XATTR_ATTR_LIBRARY}")
      endif()
    endif()
  endif()
endif()

if(XATTR_FOUND)
  if(XATTR_LIBRARIES)
    message(STATUS "Found XAttr: ${XATTR_LIBRARIES}")
  else()
    message(STATUS "Found XAttr: libc")
  endif()
else()
  message(STATUS "Could NOT find XAttr")
endif()

mark_as_advanced(
  XATTR_ATTR_LIBRARY
  XATTR_HAVE_SYS_XATTR_H
  XATTR_HAVE_GETXATTR
  XATTR_HAVE_SETXATTR
  XATTR_HAVE_GETXATTR_ATTR
  XATTR_HAVE_SETXATTR_ATTR
)
