Add CMake quota detection and enable quota support by default
All checks were successful
Source release / source-package (push) Successful in 47s

Add a FindQuota.cmake module that checks for the Linux quota headers and
symbols required by the MARS NWE quota backend. Prefer modern
<sys/quota.h> with quotactl(), and keep <linux/quota.h> as fallback for
older systems.

Enable quota support by default, but only compile it in when the required
headers and quota symbols are available. Also move the QTAINSYS define to
the detected sys/quota.h path so modern Linux builds use the correct
header automatically.
This commit is contained in:
Mario Fetka
2026-05-26 09:32:01 +02:00
parent dd0285187d
commit 8017c0c078
3 changed files with 108 additions and 9 deletions

View File

@@ -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()

View File

@@ -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 <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
)

View File

@@ -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(