]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Add support for archive_read_disk_current_filesystem_is_synthetic and
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Fri, 11 Jun 2010 07:39:27 +0000 (03:39 -0400)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Fri, 11 Jun 2010 07:39:27 +0000 (03:39 -0400)
archive_read_disk_current_filesystem_is_remote on Linux.

SVN-Revision: 2466

CMakeLists.txt
build/cmake/config.h.in
configure.ac
libarchive/archive_read_disk.c

index 72cb5f0121141979ed77c85ff7193733dde26c3e..d64ab790f622bad345ecc891dd80ac79aa92e552 100644 (file)
@@ -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)
index fc17ddc29e5ad177047a543be7bc7ef8b5ad1570..1d742fbfb41d2c95bce60a533986eb78f40c1512 100644 (file)
 /* Define to 1 if you have the <linux/fs.h> header file. */
 #cmakedefine HAVE_LINUX_FS_H 1
 
+/* Define to 1 if you have the <linux/magic.h> header file. */
+#cmakedefine HAVE_LINUX_MAGIC_H 1
+
 /* Define to 1 if you have the `listxattr' function. */
 #cmakedefine HAVE_LISTXATTR 1
 
 /* Define to 1 if you have the <sys/utsname.h> header file. */
 #cmakedefine HAVE_SYS_UTSNAME_H 1
 
+/* Define to 1 if you have the <sys/vfs.h> header file. */
+#cmakedefine HAVE_SYS_VFS_H 1
+
 /* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
 #cmakedefine HAVE_SYS_WAIT_H 1
 
index 2ae97470f9e0fc80890e059e92a1d024ecd423b5..88e531a4b44369b8658699c179b04cd3ce3a826f 100644 (file)
@@ -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.
index 67e58b36e452bd832101752ec412a02284ff152b..7794f8326dd60bca1ba2861cdbc65a2c478f4a94 100644 (file)
@@ -40,6 +40,12 @@ __FBSDID("$FreeBSD: head/lib/libarchive/archive_read_disk.c 189429 2009-03-06 04
 #ifdef HAVE_SYS_STATVFS_H
 #include <sys/statvfs.h>
 #endif
+#ifdef HAVE_SYS_VFS_H
+#include <sys/vfs.h>
+#endif
+#ifdef HAVE_LINUX_MAGIC_H
+#include <linux/magic.h>
+#endif
 #ifdef HAVE_DIRECT_H
 #include <direct.h>
 #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
 
 /*