# - Find Linux quota support
#
# This module checks whether the system provides the headers and symbols
# needed by mars_nwe's Linux user quota backend.
#
# It sets:
#   QUOTA_FOUND              - true if usable quota support was found
#   QUOTA_USE_SYS_QUOTA_H    - true if <sys/quota.h> should be used
#   QUOTA_USE_LINUX_QUOTA_H  - true if <linux/quota.h> should be used
#   QUOTA_HAVE_Q_SETQUOTA    - true if Q_SETQUOTA is available
#   QUOTA_HAVE_Q_SETQLIM     - true if Q_SETQLIM is available
#
# Modern Linux/glibc systems declare quotactl() in <sys/quota.h>.  Prefer
# that header.  Older systems may only have <linux/quota.h>, which is kept
# as a fallback for the historical mars_nwe code path.

include(CheckIncludeFile)
include(CheckSymbolExists)

set(QUOTA_FOUND FALSE)
set(QUOTA_USE_SYS_QUOTA_H FALSE)
set(QUOTA_USE_LINUX_QUOTA_H FALSE)

check_include_file("sys/quota.h" QUOTA_HAVE_SYS_QUOTA_H)
check_include_file("linux/quota.h" QUOTA_HAVE_LINUX_QUOTA_H)

if(QUOTA_HAVE_SYS_QUOTA_H)
  check_symbol_exists(quotactl "sys/types.h;sys/quota.h" QUOTA_HAVE_QUOTACTL_SYS)
  check_symbol_exists(QCMD     "sys/types.h;sys/quota.h" QUOTA_HAVE_QCMD_SYS)
  check_symbol_exists(Q_GETQUOTA "sys/types.h;sys/quota.h" QUOTA_HAVE_Q_GETQUOTA_SYS)
  check_symbol_exists(USRQUOTA "sys/types.h;sys/quota.h" QUOTA_HAVE_USRQUOTA_SYS)
  check_symbol_exists(Q_SETQUOTA "sys/types.h;sys/quota.h" QUOTA_HAVE_Q_SETQUOTA_SYS)
  check_symbol_exists(Q_SETQLIM  "sys/types.h;sys/quota.h" QUOTA_HAVE_Q_SETQLIM_SYS)

  if(QUOTA_HAVE_QUOTACTL_SYS AND QUOTA_HAVE_QCMD_SYS AND
     QUOTA_HAVE_Q_GETQUOTA_SYS AND QUOTA_HAVE_USRQUOTA_SYS AND
     (QUOTA_HAVE_Q_SETQUOTA_SYS OR QUOTA_HAVE_Q_SETQLIM_SYS))
    set(QUOTA_FOUND TRUE)
    set(QUOTA_USE_SYS_QUOTA_H TRUE)
    set(QUOTA_HAVE_Q_SETQUOTA ${QUOTA_HAVE_Q_SETQUOTA_SYS})
    set(QUOTA_HAVE_Q_SETQLIM  ${QUOTA_HAVE_Q_SETQLIM_SYS})
  endif()
endif()

if(NOT QUOTA_FOUND AND QUOTA_HAVE_LINUX_QUOTA_H)
  check_symbol_exists(QCMD     "linux/quota.h" QUOTA_HAVE_QCMD_LINUX)
  check_symbol_exists(Q_GETQUOTA "linux/quota.h" QUOTA_HAVE_Q_GETQUOTA_LINUX)
  check_symbol_exists(USRQUOTA "linux/quota.h" QUOTA_HAVE_USRQUOTA_LINUX)
  check_symbol_exists(Q_SETQUOTA "linux/quota.h" QUOTA_HAVE_Q_SETQUOTA_LINUX)
  check_symbol_exists(Q_SETQLIM  "linux/quota.h" QUOTA_HAVE_Q_SETQLIM_LINUX)

  if(QUOTA_HAVE_QCMD_LINUX AND QUOTA_HAVE_Q_GETQUOTA_LINUX AND
     QUOTA_HAVE_USRQUOTA_LINUX AND
     (QUOTA_HAVE_Q_SETQUOTA_LINUX OR QUOTA_HAVE_Q_SETQLIM_LINUX))
    set(QUOTA_FOUND TRUE)
    set(QUOTA_USE_LINUX_QUOTA_H TRUE)
    set(QUOTA_HAVE_Q_SETQUOTA ${QUOTA_HAVE_Q_SETQUOTA_LINUX})
    set(QUOTA_HAVE_Q_SETQLIM  ${QUOTA_HAVE_Q_SETQLIM_LINUX})
  endif()
endif()

if(QUOTA_FOUND)
  if(QUOTA_USE_SYS_QUOTA_H)
    message(STATUS "Found Quota: sys/quota.h")
  else()
    message(STATUS "Found Quota: linux/quota.h")
  endif()
else()
  message(STATUS "Could NOT find Quota")
endif()

mark_as_advanced(
  QUOTA_HAVE_SYS_QUOTA_H
  QUOTA_HAVE_LINUX_QUOTA_H
  QUOTA_HAVE_QUOTACTL_SYS
  QUOTA_HAVE_QCMD_SYS
  QUOTA_HAVE_Q_GETQUOTA_SYS
  QUOTA_HAVE_USRQUOTA_SYS
  QUOTA_HAVE_Q_SETQUOTA_SYS
  QUOTA_HAVE_Q_SETQLIM_SYS
  QUOTA_HAVE_QCMD_LINUX
  QUOTA_HAVE_Q_GETQUOTA_LINUX
  QUOTA_HAVE_USRQUOTA_LINUX
  QUOTA_HAVE_Q_SETQUOTA_LINUX
  QUOTA_HAVE_Q_SETQLIM_LINUX
)
