From aed413edff15bf9f340d963d4ff57faca8afdcbc Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 11 May 2021 21:39:27 +0100 Subject: [PATCH] Add support for old Linux statfs. --- setter/projects/make/dflybsd/Makefile | 2 +- setter/src/unix/CMakeLists.txt | 53 +++++++++++++++++++-------- setter/src/unix/linux/volume.c | 9 ++++- setter/src/unix/volume.c | 12 ++++-- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/setter/projects/make/dflybsd/Makefile b/setter/projects/make/dflybsd/Makefile index 11fd368..cff7c07 100644 --- a/setter/projects/make/dflybsd/Makefile +++ b/setter/projects/make/dflybsd/Makefile @@ -58,7 +58,7 @@ LFLAGS = # Compiler flags. This needs the definitions on how to find statfs.h as there is no autodetection # BSD 2.11 defines statfs to be in sys/mount.h -CFLAGS = -DHAVE_SYS_MOUNT_H -DHAVE_STATFS_FTYPENAME -DHAVE_STATFS_FTYPE -DNEED_SYS_TYPES_H +CFLAGS = -DHAVE_SYS_MOUNT_H -DHAVE_STATFS_TYPENAME -DHAVE_STATFS_TYPE -DNEED_SYS_TYPES_H all: fssetter diff --git a/setter/src/unix/CMakeLists.txt b/setter/src/unix/CMakeLists.txt index e60de54..065e3d9 100644 --- a/setter/src/unix/CMakeLists.txt +++ b/setter/src/unix/CMakeLists.txt @@ -22,8 +22,8 @@ # Copyright (C) 2011-2021 Natalia Portillo # *****************************************************************************/ -if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux|Darwin" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "^(([^k].*)?BSD|DragonFly)$" ) - return() +if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux|Darwin" AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "^(([^k].*)?BSD|DragonFly)$") + return() endif() include(CheckIncludeFile) @@ -33,45 +33,58 @@ include(CheckStructHasMember) CHECK_SYMBOL_EXISTS(statfs "sys/statfs.h" HAVE_SYS_STATFS) CHECK_SYMBOL_EXISTS(statfs "sys/mount.h" HAVE_SYS_MOUNT) CHECK_SYMBOL_EXISTS(statvfs "sys/statvfs.h" HAVE_SYS_STATVFS) +CHECK_SYMBOL_EXISTS(statfs "sys/vfs.h" HAVE_SYS_VFS) if(${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") message("-- Forcing statfs in sys/mount.h due to OpenBSD") add_sub_definitions(HAVE_SYS_MOUNT_H) add_sub_definitions(NEED_SYS_TYPES_H) - set(HAVE_STATFS_FTYPENAME 1) + add_sub_definitions(USE_STATFS_FLAGS) + set(HAVE_STATFS_TYPENAME 1) set(HAVE_STATFS_NAMEMAX 1) + # Old Linux +elseif(HAVE_SYS_VFS) + message("-- Found statfs in sys/vfs.h") + add_sub_definitions(HAVE_SYS_VFS_H) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namelen" "sys/vfs.h" HAVE_STATFS_NAMELEN) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_fstypename" "sys/vfs.h" HAVE_STATFS_TYPENAME) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namemax" "sys/vfs.h" HAVE_STATFS_NAMEMAX) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_type" "sys/vfs.h" HAVE_STATFS_TYPE) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_flags" "sys/vfs.h" HAVE_STATFS_FLAGS) # Linux and FreeBSD elseif(HAVE_SYS_STATFS) message("-- Found statfs in sys/statfs.h") add_sub_definitions(HAVE_SYS_STATFS_H) - add_sub_definitions(TEST) - CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namelen" "sys/statfs.h" HAVE_STATFS_FNAMELEN) - CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_fstypename" "sys/statfs.h" HAVE_STATFS_FTYPENAME) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namelen" "sys/statfs.h" HAVE_STATFS_NAMELEN) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_fstypename" "sys/statfs.h" HAVE_STATFS_TYPENAME) CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namemax" "sys/statfs.h" HAVE_STATFS_NAMEMAX) - CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_type" "sys/statfs.h" HAVE_STATFS_FTYPE) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_type" "sys/statfs.h" HAVE_STATFS_TYPE) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_flags" "sys/statfs.h" HAVE_STATFS_FLAGS) elseif(HAVE_SYS_MOUNT) # Darwin and most other BSDs message("-- Found statfs in sys/mount.h") add_sub_definitions(HAVE_SYS_MOUNT_H) - CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namelen" "sys/mount.h" HAVE_STATFS_FNAMELEN) - CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_fstypename" "sys/mount.h" HAVE_STATFS_FTYPENAME) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namelen" "sys/mount.h" HAVE_STATFS_NAMELEN) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_fstypename" "sys/mount.h" HAVE_STATFS_TYPENAME) if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # It's giving false positives sometimes CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_namemax" "sys/mount.h" HAVE_STATFS_NAMEMAX) endif() - CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_type" "sys/mount.h" HAVE_STATFS_FTYPE) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_type" "sys/mount.h" HAVE_STATFS_TYPE) + CHECK_STRUCT_HAS_MEMBER("struct statfs" "f_flags" "sys/mount.h" HAVE_STATFS_FLAGS) elseif(HAVE_SYS_STATVFS) # NetBSD >= 3.0 message("-- Found statvfs in sys/statvfs.h") add_sub_definitions(HAVE_SYS_STATVFS_H) CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_namemax" "sys/statvfs.h" HAVE_STATFS_NAMEMAX) - CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_fstypename" "sys/statvfs.h" HAVE_STATFS_FTYPENAME) - CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_type" "sys/statvfs.h" HAVE_STATFS_FTYPE) + CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_fstypename" "sys/statvfs.h" HAVE_STATFS_TYPENAME) + CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_type" "sys/statvfs.h" HAVE_STATFS_TYPE) + CHECK_STRUCT_HAS_MEMBER("struct statvfs" "f_flags" "sys/statvfs.h" HAVE_STATFS_FLAGS) endif() -if(HAVE_STATFS_FNAMELEN) +if(HAVE_STATFS_NAMELEN) message("-- statfs has f_namelen member") - add_sub_definitions(USE_STATFS_FNAMELEN) + add_sub_definitions(USE_STATFS_NAMELEN) endif() -if(HAVE_STATFS_FTYPENAME) +if(HAVE_STATFS_TYPENAME) message("-- statfs has f_fstypename member") add_sub_definitions(USE_STATFS_FTYPENAME) endif() @@ -81,6 +94,16 @@ if(HAVE_STATFS_NAMEMAX) add_sub_definitions(USE_STATFS_NAMEMAX) endif() +if(HAVE_STATFS_TYPE) + message("-- statfs has f_type member") + add_sub_definitions(USE_STATFS_FLAGS) +endif() + +if(HAVE_STATFS_FLAGS) + message("-- statfs has f_flags member") + add_sub_definitions(USE_STATFS_FLAGS) +endif() + add_subdirectory(darwin) add_subdirectory(linux) add_subdirectory(bsd) diff --git a/setter/src/unix/linux/volume.c b/setter/src/unix/linux/volume.c index 4b1bdd3..e0abcd3 100644 --- a/setter/src/unix/linux/volume.c +++ b/setter/src/unix/linux/volume.c @@ -22,11 +22,16 @@ Aaru Data Preservation Suite Copyright (C) 2011-2021 Natalia Portillo *****************************************************************************/ +#ifdef HAVE_SYS_STATFS_H #include - -#include "volume.h" +#elif defined(HAVE_SYS_VFS_H) +#include +#else +#warning statfs not found, will use custom redefinition of flags +#endif #include "../../log.h" +#include "volume.h" void LinuxPrintStatfsFlags(__fsword_t flags) { diff --git a/setter/src/unix/volume.c b/setter/src/unix/volume.c index e4ad700..39da616 100644 --- a/setter/src/unix/volume.c +++ b/setter/src/unix/volume.c @@ -34,7 +34,7 @@ Copyright (C) 2011-2021 Natalia Portillo #error Need to be compiled without -posix argument #endif -#define HAVE_STATFS_FTYPE +#define HAVE_STATFS_TYPE #if NS_TARGET >= 42 // Rhapsody DR1 #define NEED_SYS_TYPES_H @@ -54,6 +54,10 @@ Copyright (C) 2011-2021 Natalia Portillo #include #endif +#ifdef HAVE_SYS_VFS_H +#include +#endif + #if defined(HAVE_SYS_MOUNT_H) #if defined(NEED_SYS_TYPES_H) #include @@ -101,7 +105,7 @@ void GetVolumeInfo(const char* path, size_t* clusterSize) #ifdef USE_STATFS_FTYPENAME log_write("\tFilesystem: %s\n", buf.f_fstypename); -#elif defined HAVE_STATFS_FTYPE +#elif defined(HAVE_STATFS_TYPE) log_write("\tFilesystem: "); switch(buf.f_type) { @@ -195,7 +199,7 @@ void GetVolumeInfo(const char* path, size_t* clusterSize) log_write("\tVolume size: %llu bytes\n", ((unsigned long long)buf.f_blocks) * buf.f_bsize); log_write("\tVolume free: %llu bytes\n", ((unsigned long long)buf.f_bfree) * buf.f_bsize); -#ifdef USE_STATFS_FNAMELEN +#ifdef USE_STATFS_NAMELEN log_write("\tMaximum component length: %ld\n", buf.f_namelen); #elif USE_STATFS_NAMEMAX log_write("\tMaximum component length: %ld\n", buf.f_namemax); @@ -210,7 +214,7 @@ void GetVolumeInfo(const char* path, size_t* clusterSize) log_write("\tFlags: 0x%08lX\n", buf.f_flag); #endif } -#elif !defined(__NeXT__) || (defined(NS_TARGET) && NS_TARGET >= 42) +#elif(!defined(__NeXT__) || (defined(NS_TARGET) && NS_TARGET >= 42)) && defined(USE_STATFS_FLAGS) if(buf.f_flags) { #if defined(__linux__) || defined(__LINUX__) || defined(__gnu_linux)