]> wimlib.net Git - wimlib/blobdiff - src/unix_capture.c
read_wim_lookup_table(): Allow multiple "subpacks" per packed run
[wimlib] / src / unix_capture.c
index 3b22a2c07142eb1333cc5db12906dc6e57d5b72b..c0aa195066e5ea3f6acf767821e2ba8e1f4551dd 100644 (file)
@@ -45,7 +45,7 @@ static int
 unix_capture_regular_file(const char *path,
                          u64 size,
                          struct wim_inode *inode,
-                         struct wim_lookup_table *lookup_table)
+                         struct list_head *unhashed_streams)
 {
        inode->i_attributes = FILE_ATTRIBUTE_NORMAL;
 
@@ -65,7 +65,7 @@ unix_capture_regular_file(const char *path,
                lte->file_on_disk = file_on_disk;
                lte->resource_location = RESOURCE_IN_FILE_ON_DISK;
                lte->size = size;
-               lookup_table_insert_unhashed(lookup_table, lte, inode, 0);
+               add_unhashed_stream(lte, inode, 0, unhashed_streams);
                inode->i_lte = lte;
        }
        return 0;
@@ -209,7 +209,10 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret,
        struct wim_inode *inode = NULL;
        struct stat stbuf;
 
-       if (exclude_path(path, path_len, params->config, true)) {
+       if (exclude_path(path + params->capture_root_nchars,
+                        path_len - params->capture_root_nchars,
+                        params->config))
+       {
                ret = 0;
                goto out_progress;
        }
@@ -242,9 +245,10 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret,
                goto out;
        }
 
-       ret = inode_table_new_dentry(&params->inode_table,
+       ret = inode_table_new_dentry(params->inode_table,
                                     path_basename_with_len(path, path_len),
-                                    stbuf.st_ino, stbuf.st_dev, false, &root);
+                                    stbuf.st_ino, stbuf.st_dev,
+                                    S_ISDIR(stbuf.st_mode), &root);
        if (ret)
                goto out;
 
@@ -278,7 +282,7 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret,
        params->add_flags &= ~WIMLIB_ADD_FLAG_ROOT;
        if (S_ISREG(stbuf.st_mode))
                ret = unix_capture_regular_file(path, stbuf.st_size,
-                                               inode, params->lookup_table);
+                                               inode, params->unhashed_streams);
        else if (S_ISDIR(stbuf.st_mode))
                ret = unix_capture_directory(root, path, path_len, params);
        else {
@@ -341,13 +345,6 @@ unix_build_dentry_tree(struct wim_dentry **root_ret,
                        return WIMLIB_ERR_STAT;
                }
 
-               if ((params->add_flags & WIMLIB_ADD_FLAG_ROOT) &&
-                   !S_ISDIR(root_stbuf.st_mode))
-               {
-                       ERROR("Root of capture \"%s\" is not a directory",
-                             root_disk_path);
-                       return WIMLIB_ERR_NOTDIR;
-               }
                params->capture_root_ino = root_stbuf.st_ino;
                params->capture_root_dev = root_stbuf.st_dev;
        }
@@ -363,6 +360,8 @@ unix_build_dentry_tree(struct wim_dentry **root_ret,
                return WIMLIB_ERR_NOMEM;
        memcpy(path_buf, root_disk_path, path_len + 1);
 
+       params->capture_root_nchars = path_len;
+
        ret = unix_build_dentry_tree_recursive(root_ret, path_buf,
                                               path_len, params);
        FREE(path_buf);