Build fixes
authorEric Biggers <ebiggers3@gmail.com>
Wed, 29 Aug 2012 03:38:21 +0000 (22:38 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Wed, 29 Aug 2012 03:38:21 +0000 (22:38 -0500)
Use casts to or from `uintptr_t' to avoid warnings on 32-bit platforms when we
get or set the FUSE private data in mount.c.

Make the XATTR interface optional.  Support is omitted automatically if the
setxattr() function or the `attr/xattr.h' header is not found.

Fix a couple of the test cases.

config.h.in
configure.ac
programs/imagex.c
src/lookup_table.c
src/mount.c
src/ntfs-capture.c
tests/test-imagex

index 800155e..db9f0e2 100644 (file)
@@ -24,6 +24,9 @@
 /* Define to 1 to verify compressed data */
 #undef ENABLE_VERIFY_COMPRESSION
 
+/* Define to 1 if using the xattr interface to WIM alternate data streams */
+#undef ENABLE_XATTR
+
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
index af814b9..786c4d1 100644 (file)
@@ -198,6 +198,26 @@ fi
 AC_SUBST([LIBFUSE_LDADD], [$LIBFUSE_LDADD])
 AC_SUBST([LIBFUSE_CFLAGS], [$LIBFUSE_CFLAGS])
 
+ENABLE_XATTR=no
+AC_ARG_ENABLE([xattr],
+       [AS_HELP_STRING([--enable-xattr], [Enable the xattr interface to access WIM
+                       alternate data streams (default: autodetect)])],
+       [ENABLE_XATTR=$enableval],
+       [AC_CHECK_FUNC([setxattr],
+               [AC_CHECK_HEADER([attr/xattr.h],
+                       [ENABLE_XATTR=yes],
+                       [AC_MSG_WARN([Cannot find the "attr/xattr.h" header.  You will not be
+                        able to use the xattr interface to access WIM alternate data
+                        streams.])])],
+               [AC_MSG_WARN([Cannot find the setxattr() function.  You will not be
+                able to use the xattr interface to access WIM alternate data
+                streams.])])])
+
+if test "x$ENABLE_XATTR" = "xyes"; then
+       AC_DEFINE([ENABLE_XATTR], [1], [Define to 1 if using the xattr
+                       interface to WIM alternate data streams])
+fi
+
 AC_MSG_CHECKING([whether to use SSSE3-accelerated SHA1 ])
 AC_ARG_ENABLE([ssse3-sha1],
            AS_HELP_STRING([--enable-ssse3-sha1], [use assembly language implementation
index fe7f3be..cf118b3 100644 (file)
 #include <errno.h>
 #include <sys/stat.h>
 
-#ifdef WITH_NTFS_3G
-#include <unistd.h>
-#include <sys/wait.h>
-#endif
-
 #define ARRAY_LEN(array) (sizeof(array) / sizeof(array[0]))
 
 #define swap(a, b) ({ typeof(a) __a = (a); typeof(b) __b = (b); \
index 007cd9e..1e6c05f 100644 (file)
@@ -133,7 +133,10 @@ lte_decrement_refcnt(struct lookup_table_entry *lte, struct lookup_table *table)
                wimlib_assert(lte->refcnt);
                if (--lte->refcnt == 0) {
                        lookup_table_unlink(table, lte);
-                       if (lte->num_opened_fds == 0) {
+               #ifdef WITH_FUSE
+                       if (lte->num_opened_fds == 0)
+               #endif
+                       {
                                free_lookup_table_entry(lte);
                                lte = NULL;
                        }
index 82abe7d..24c32f2 100644 (file)
 #include <fuse.h>
 #include <ftw.h>
 #include <mqueue.h>
+
+#ifdef ENABLE_XATTR
 #include <attr/xattr.h>
+#endif
 
 struct wimlib_fd {
        u16 idx;
@@ -950,10 +953,11 @@ done:
        close_message_queues();
 }
 
+#if 0
 static int wimfs_fallocate(const char *path, int mode,
                           off_t offset, off_t len, struct fuse_file_info *fi)
 {
-       struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
+       struct wimlib_fd *fd = (struct wimlib_fd*)(uintptr_t)fi->fh;
        wimlib_assert(fd->staging_fd != -1);
        return fallocate(fd->staging_fd, mode, offset, len);
 }
@@ -961,14 +965,15 @@ static int wimfs_fallocate(const char *path, int mode,
 static int wimfs_fgetattr(const char *path, struct stat *stbuf,
                          struct fuse_file_info *fi)
 {
-       struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
+       struct wimlib_fd *fd = (struct wimlib_fd*)(uintptr_t)fi->fh;
        return dentry_to_stbuf(fd->dentry, stbuf);
 }
+#endif
 
 static int wimfs_ftruncate(const char *path, off_t size,
                           struct fuse_file_info *fi)
 {
-       struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
+       struct wimlib_fd *fd = (struct wimlib_fd*)(uintptr_t)fi->fh;
        int ret = ftruncate(fd->staging_fd, size);
        if (ret != 0)
                return ret;
@@ -992,6 +997,7 @@ static int wimfs_getattr(const char *path, struct stat *stbuf)
        return dentry_to_stbuf(dentry, stbuf);
 }
 
+#ifdef ENABLE_XATTR
 /* Read an alternate data stream through the XATTR interface, or get its size */
 static int wimfs_getxattr(const char *path, const char *name, char *value,
                          size_t size)
@@ -1028,6 +1034,7 @@ static int wimfs_getxattr(const char *path, const char *name, char *value,
                return -EIO;
        return res_size;
 }
+#endif
 
 /* Create a hard link */
 static int wimfs_link(const char *to, const char *from)
@@ -1081,6 +1088,7 @@ static int wimfs_link(const char *to, const char *from)
        return 0;
 }
 
+#ifdef ENABLE_XATTR
 static int wimfs_listxattr(const char *path, char *list, size_t size)
 {
        struct dentry *dentry;
@@ -1113,6 +1121,7 @@ static int wimfs_listxattr(const char *path, char *list, size_t size)
                return p - list;
        }
 }
+#endif
 
 /* 
  * Create a directory in the WIM.  
@@ -1255,7 +1264,7 @@ static int wimfs_open(const char *path, struct fuse_file_info *fi)
                        return -errno;
                }
        }
-       fi->fh = (uint64_t)fd;
+       fi->fh = (uintptr_t)fd;
        return 0;
 }
 
@@ -1270,7 +1279,7 @@ static int wimfs_opendir(const char *path, struct fuse_file_info *fi)
        if (!dentry_is_directory(dentry))
                return -ENOTDIR;
        dentry->num_times_opened++;
-       fi->fh = (uint64_t)dentry;
+       fi->fh = (uintptr_t)dentry;
        return 0;
 }
 
@@ -1281,7 +1290,7 @@ static int wimfs_opendir(const char *path, struct fuse_file_info *fi)
 static int wimfs_read(const char *path, char *buf, size_t size, 
                      off_t offset, struct fuse_file_info *fi)
 {
-       struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
+       struct wimlib_fd *fd = (struct wimlib_fd*)(uintptr_t)fi->fh;
 
        if (!fd) {
                /* Empty file with no lookup table entry on read-only mounted
@@ -1333,7 +1342,7 @@ static int wimfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
 {
        struct dentry *parent, *child;
        
-       parent = (struct dentry*)fi->fh;
+       parent = (struct dentry*)(uintptr_t)fi->fh;
        wimlib_assert(parent);
        child = parent->children;
 
@@ -1370,7 +1379,7 @@ static int wimfs_readlink(const char *path, char *buf, size_t buf_len)
 /* Close a file. */
 static int wimfs_release(const char *path, struct fuse_file_info *fi)
 {
-       struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
+       struct wimlib_fd *fd = (struct wimlib_fd*)(uintptr_t)fi->fh;
 
        if (!fd) {
                /* Empty file with no lookup table entry on read-only mounted
@@ -1390,7 +1399,7 @@ static int wimfs_release(const char *path, struct fuse_file_info *fi)
 
 static int wimfs_releasedir(const char *path, struct fuse_file_info *fi)
 {
-       struct dentry *dentry = (struct dentry *)fi->fh;
+       struct dentry *dentry = (struct dentry *)(uintptr_t)fi->fh;
 
        wimlib_assert(dentry);
        wimlib_assert(dentry->num_times_opened);
@@ -1399,6 +1408,7 @@ static int wimfs_releasedir(const char *path, struct fuse_file_info *fi)
        return 0;
 }
 
+#ifdef ENABLE_XATTR
 /* Remove an alternate data stream through the XATTR interface */
 static int wimfs_removexattr(const char *path, const char *name)
 {
@@ -1421,6 +1431,7 @@ static int wimfs_removexattr(const char *path, const char *name)
        remove_ads(dentry, ads_entry, w->lookup_table);
        return 0;
 }
+#endif
 
 /* Renames a file or directory.  See rename (3) */
 static int wimfs_rename(const char *from, const char *to)
@@ -1508,6 +1519,7 @@ static int wimfs_rmdir(const char *path)
        return 0;
 }
 
+#ifdef ENABLE_XATTR
 /* Write an alternate data stream through the XATTR interface */
 static int wimfs_setxattr(const char *path, const char *name,
                          const char *value, size_t size, int flags)
@@ -1571,6 +1583,7 @@ static int wimfs_setxattr(const char *path, const char *name,
        new_ads_entry->lte = lte;
        return 0;
 }
+#endif
 
 static int wimfs_symlink(const char *to, const char *from)
 {
@@ -1706,7 +1719,7 @@ static int wimfs_utimens(const char *path, const struct timespec tv[2])
 static int wimfs_write(const char *path, const char *buf, size_t size, 
                       off_t offset, struct fuse_file_info *fi)
 {
-       struct wimlib_fd *fd = (struct wimlib_fd*)fi->fh;
+       struct wimlib_fd *fd = (struct wimlib_fd*)(uintptr_t)fi->fh;
        int ret;
 
        wimlib_assert(fd);
@@ -1729,13 +1742,19 @@ static int wimfs_write(const char *path, const char *buf, size_t size,
 static struct fuse_operations wimfs_operations = {
        .access      = wimfs_access,
        .destroy     = wimfs_destroy,
+#if 0
        .fallocate   = wimfs_fallocate,
        .fgetattr    = wimfs_fgetattr,
+#endif
        .ftruncate   = wimfs_ftruncate,
        .getattr     = wimfs_getattr,
+#ifdef ENABLE_XATTR
        .getxattr    = wimfs_getxattr,
+#endif
        .link        = wimfs_link,
+#ifdef ENABLE_XATTR
        .listxattr   = wimfs_listxattr,
+#endif
        .mkdir       = wimfs_mkdir,
        .mknod       = wimfs_mknod,
        .open        = wimfs_open,
@@ -1745,10 +1764,14 @@ static struct fuse_operations wimfs_operations = {
        .readlink    = wimfs_readlink,
        .release     = wimfs_release,
        .releasedir  = wimfs_releasedir,
+#ifdef ENABLE_XATTR
        .removexattr = wimfs_removexattr,
+#endif
        .rename      = wimfs_rename,
        .rmdir       = wimfs_rmdir,
+#ifdef ENABLE_XATTR
        .setxattr    = wimfs_setxattr,
+#endif
        .symlink     = wimfs_symlink,
        .truncate    = wimfs_truncate,
        .unlink      = wimfs_unlink,
index 51434ac..a38a4ec 100644 (file)
@@ -619,11 +619,9 @@ WIMLIBAPI int wimlib_add_image_from_ntfs_volume(WIMStruct *w,
 WIMLIBAPI int wimlib_add_image_from_ntfs_volume(WIMStruct *w,
                                                const char *device,
                                                const char *name,
-                                               const char *description,
-                                               const char *flags_element,
-                                               int flags,
                                                const char *config_str,
-                                               size_t config_len)
+                                               size_t config_len,
+                                               int flags)
 {
        ERROR("wimlib was compiled without support for NTFS-3g, so");
        ERROR("we cannot capture a WIM image directly from a NTFS volume");
index faae7d4..9fdaf03 100755 (executable)
@@ -260,12 +260,14 @@ echo "Testing appending non-existent file (should generate errors)"
 if imagex append SOME_NONEXISTENT_FILE dir.wim; then
        error "Incorrectly succeeded to append non-existent file to WIM"
 fi
-echo "Testing appending directory containing unreadable file (should generate errors)"
-mkdir -p dir3
-echo 1 > dir3/file
-chmod -r dir3/file
-if imagex append dir3 dir.wim; then
-       error "Incorrectly succeeded in capturing directory with unreadable file"
+if [ `id -u` != 0 ]; then
+       echo "Testing appending directory containing unreadable file (should generate errors)"
+       mkdir -p dir3
+       echo 1 > dir3/file
+       chmod -r dir3/file
+       if imagex append dir3 dir.wim; then
+               error "Incorrectly succeeded in capturing directory with unreadable file"
+       fi
 fi
 rm -rf dir3 dir.wim
 
@@ -361,7 +363,7 @@ fi
 if test "`stat -c %i tmp/subdir/hello`" = "`stat -c %i tmp/subdir/hello2`"; then
        error "Incorrect inode number"
 fi
-if ! test -L tmp/subdir/hello || ! test -L tmp/subdir/hello2; then
+if ! test -L tmp/subdir/hello -o -L tmp/subdir/hello2 -o -L tmp/subdir/hellolink; then
        error "Expected symlinks, but found non-symlinks"
 fi
 rm -rf dir.wim tmp