diff --git a/CMakeLists.txt b/CMakeLists.txt index fb03cec..5a1b484 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,7 +64,7 @@ option(ENABLE_DEBUG "Should we build with Debug?" ON) option(ENABLE_DEBUG_DOSUTILS "Should we build with Mars Nwe Dosutils Debugging?" OFF) option(ENABLE_INTERNAL_RIP_SAP "Should we build Mars Nwe with Internal Router?" ON) option(ENABLE_SHADOW_PWD "Should we build Mars Nwe with Shadow Password Support?" ON) -option(ENABLE_QUOTA_SUPPORT "Should we build Mars Nwe with Quota Support?" OFF) +option(ENABLE_QUOTA_SUPPORT "Should we build Mars Nwe with Quota Support?" ON) option(ENABLE_XATTR "Should we build Mars Nwe with extended attribute support?" ON) option(MARS_NWE_INSTALL_DOSUTILS "Install DOS client utilities" ON) option(MARS_NWE_INSTALL_NEW_DOSUTILS "Install the new/experimental DOS client utilities instead of legacy netold.exe" OFF) @@ -96,11 +96,12 @@ ELSE (ENABLE_SHADOW_PWD) SET (MARS_NWE_SHADOW_PWD "0") ENDIF (ENABLE_SHADOW_PWD) -IF (ENABLE_QUOTA_SUPPORT) +find_package(Quota QUIET) +IF (ENABLE_QUOTA_SUPPORT AND QUOTA_FOUND) SET (MARS_NWE_QUOTA_SUPPORT "1") -ELSE (ENABLE_QUOTA_SUPPORT) +ELSE (ENABLE_QUOTA_SUPPORT AND QUOTA_FOUND) SET (MARS_NWE_QUOTA_SUPPORT "0") -ENDIF (ENABLE_QUOTA_SUPPORT) +ENDIF (ENABLE_QUOTA_SUPPORT AND QUOTA_FOUND) find_package(XAttr QUIET) IF (ENABLE_XATTR AND XATTR_FOUND) @@ -128,6 +129,16 @@ find_package(OpenSSL REQUIRED) find_package(PAM REQUIRED) find_package(DL REQUIRED) +if(MARS_NWE_QUOTA_SUPPORT) + message(STATUS "Quota support: enabled") +else() + if(ENABLE_QUOTA_SUPPORT) + message(STATUS "Quota support: disabled (required headers/symbols not found)") + else() + message(STATUS "Quota support: disabled") + endif() +endif() + if(MARS_NWE_XATTR_SUPPORT) message(STATUS "XAttr support: enabled") else() diff --git a/cmake/modules/FindQuota.cmake b/cmake/modules/FindQuota.cmake new file mode 100644 index 0000000..956103d --- /dev/null +++ b/cmake/modules/FindQuota.cmake @@ -0,0 +1,86 @@ +# - 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 should be used +# QUOTA_USE_LINUX_QUOTA_H - true if 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 . Prefer +# that header. Older systems may only have , 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 +) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec6d833..b4d91ee 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -20,11 +20,13 @@ add_definitions( -D_VERS_P_=${VERSION_PATCH} ) -IF(ENABLE_QUOTA_SUPPORT) - add_definitions( - -DQTAINSYS - ) -ENDIF(ENABLE_QUOTA_SUPPORT) +IF(MARS_NWE_QUOTA_SUPPORT) + IF(QUOTA_USE_SYS_QUOTA_H) + add_definitions( + -DQTAINSYS + ) + ENDIF(QUOTA_USE_SYS_QUOTA_H) +ENDIF(MARS_NWE_QUOTA_SUPPORT) IF(GDBM_FOUND) add_definitions(