From: Michihiro NAKAJIMA Date: Fri, 11 Jun 2010 07:39:27 +0000 (-0400) Subject: Add support for archive_read_disk_current_filesystem_is_synthetic and X-Git-Tag: v3.0.0a~961 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=996334f3afe2207cdf93dbaa3eae3bd301a02630;p=thirdparty%2Flibarchive.git Add support for archive_read_disk_current_filesystem_is_synthetic and archive_read_disk_current_filesystem_is_remote on Linux. SVN-Revision: 2466 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 72cb5f012..d64ab790f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -225,6 +225,7 @@ LA_CHECK_INCLUDE_FILE("langinfo.h" HAVE_LANGINFO_H) LA_CHECK_INCLUDE_FILE("limits.h" HAVE_LIMITS_H) LA_CHECK_INCLUDE_FILE("linux/fiemap.h" HAVE_LINUX_FIEMAP_H) LA_CHECK_INCLUDE_FILE("linux/fs.h" HAVE_LINUX_FS_H) +LA_CHECK_INCLUDE_FILE("linux/magic.h" HAVE_LINUX_MAGIC_H) LA_CHECK_INCLUDE_FILE("locale.h" HAVE_LOCALE_H) LA_CHECK_INCLUDE_FILE("memory.h" HAVE_MEMORY_H) LA_CHECK_INCLUDE_FILE("paths.h" HAVE_PATHS_H) @@ -251,6 +252,7 @@ LA_CHECK_INCLUDE_FILE("sys/statvfs.h" HAVE_SYS_STATVFS_H) LA_CHECK_INCLUDE_FILE("sys/time.h" HAVE_SYS_TIME_H) LA_CHECK_INCLUDE_FILE("sys/utime.h" HAVE_SYS_UTIME_H) LA_CHECK_INCLUDE_FILE("sys/utsname.h" HAVE_SYS_UTSNAME_H) +LA_CHECK_INCLUDE_FILE("sys/vfs.h" HAVE_SYS_VFS_H) LA_CHECK_INCLUDE_FILE("sys/wait.h" HAVE_SYS_WAIT_H) LA_CHECK_INCLUDE_FILE("time.h" HAVE_TIME_H) LA_CHECK_INCLUDE_FILE("unistd.h" HAVE_UNISTD_H) diff --git a/build/cmake/config.h.in b/build/cmake/config.h.in index fc17ddc29..1d742fbfb 100644 --- a/build/cmake/config.h.in +++ b/build/cmake/config.h.in @@ -362,6 +362,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_LINUX_FS_H 1 +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_LINUX_MAGIC_H 1 + /* Define to 1 if you have the `listxattr' function. */ #cmakedefine HAVE_LISTXATTR 1 @@ -594,6 +597,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine HAVE_SYS_UTSNAME_H 1 +/* Define to 1 if you have the header file. */ +#cmakedefine HAVE_SYS_VFS_H 1 + /* Define to 1 if you have that is POSIX.1 compatible. */ #cmakedefine HAVE_SYS_WAIT_H 1 diff --git a/configure.ac b/configure.ac index 2ae97470f..88e531a4b 100644 --- a/configure.ac +++ b/configure.ac @@ -195,14 +195,14 @@ AC_HEADER_SYS_WAIT AC_CHECK_HEADERS([acl/libacl.h attr/xattr.h copyfile.h ctype.h errno.h]) AC_CHECK_HEADERS([ext2fs/ext2_fs.h fcntl.h grp.h]) AC_CHECK_HEADERS([inttypes.h io.h langinfo.h limits.h]) -AC_CHECK_HEADERS([linux/fiemap.h linux/fs.h]) +AC_CHECK_HEADERS([linux/fiemap.h linux/fs.h linux/magic.h]) AC_CHECK_HEADERS([locale.h paths.h poll.h pwd.h regex.h signal.h stdarg.h]) AC_CHECK_HEADERS([stdint.h stdlib.h string.h]) AC_CHECK_HEADERS([sys/acl.h sys/cdefs.h sys/extattr.h sys/ioctl.h]) AC_CHECK_HEADERS([sys/mkdev.h sys/mount.h]) AC_CHECK_HEADERS([sys/param.h sys/poll.h sys/select.h sys/statvfs.h]) -AC_CHECK_HEADERS([sys/time.h sys/utime.h]) -AC_CHECK_HEADERS([sys/utsname.h time.h unistd.h utime.h wchar.h wctype.h]) +AC_CHECK_HEADERS([sys/time.h sys/utime.h sys/utsname.h sys/vfs.h]) +AC_CHECK_HEADERS([time.h unistd.h utime.h wchar.h wctype.h]) AC_CHECK_HEADERS([windows.h winioctl]) # Checks for libraries. diff --git a/libarchive/archive_read_disk.c b/libarchive/archive_read_disk.c index 67e58b36e..7794f8326 100644 --- a/libarchive/archive_read_disk.c +++ b/libarchive/archive_read_disk.c @@ -40,6 +40,12 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_read_disk.c 189429 2009-03-06 04 #ifdef HAVE_SYS_STATVFS_H #include #endif +#ifdef HAVE_SYS_VFS_H +#include +#endif +#ifdef HAVE_LINUX_MAGIC_H +#include +#endif #ifdef HAVE_DIRECT_H #include #endif @@ -949,6 +955,55 @@ filesystem_information(struct archive_read_disk *a, const char *path, return (ARCHIVE_OK); } +#elif defined(HAVE_SYS_VFS_H) && defined(HAVE_LINUX_MAGIC_H) +#ifndef CIFS_SUPER_MAGIC +#define CIFS_SUPER_MAGIC 0xFF534D42 +#endif +#ifndef DEVFS_SUPER_MAGIC +#define DEVFS_SUPER_MAGIC 0x1373 +#endif + +/* + * Get conditions of synthetic and remote on Linux + */ +static int +filesystem_information(struct archive_read_disk *a, const char *path, + struct filesystem *fs) +{ + struct statfs sfs; + int r; + + r = statfs(path, &sfs); + if (r == -1) { + fs->synthetic = -1; + fs->remote = -1; + archive_set_error(&a->archive, errno, "statfs failed"); + return (ARCHIVE_FAILED); + } + switch (sfs.f_type) { + case AFS_SUPER_MAGIC: + case CIFS_SUPER_MAGIC: + case CODA_SUPER_MAGIC: + case NCP_SUPER_MAGIC:/* NetWare */ + case NFS_SUPER_MAGIC: + case SMB_SUPER_MAGIC: + fs->remote = 1; + fs->synthetic = 0; + break; + case DEVFS_SUPER_MAGIC: + case PROC_SUPER_MAGIC: + case USBDEVICE_SUPER_MAGIC: + fs->remote = 0; + fs->synthetic = 1; + break; + default: + fs->remote = 0; + fs->synthetic = 0; + break; + } + return (ARCHIVE_OK); +} + #else /*