X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Funix_capture.c;h=dd79b658e0238cc9f15ed3d039ef1285e2dc9015;hp=0d9b3998094c6902194cf87c6990ee8d0e7b50b1;hb=5d3d469e410dc5f4a28814ad231336fc174cba56;hpb=7a013be24d13570d28fea34c1c8c1f10ee3d653f diff --git a/src/unix_capture.c b/src/unix_capture.c index 0d9b3998..dd79b658 100644 --- a/src/unix_capture.c +++ b/src/unix_capture.c @@ -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; @@ -163,14 +163,17 @@ unix_capture_symlink(struct wim_dentry **root_p, dest = capture_fixup_absolute_symlink(dest, params->capture_root_ino, params->capture_root_dev); - if (!dest) { - WARNING("Ignoring out of tree absolute symlink " - "\"%s\" -> \"%s\"\n" - " (Use --norpfix to capture " - "absolute symlinks as-is)", - path, deref_name_buf); + if (dest == NULL) { + /* RPFIX (reparse point fixup) mode: Ignore + * absolute symbolic link that points out of the + * tree to be captured. */ free_dentry(*root_p); *root_p = NULL; + params->progress.scan.cur_path = path; + params->progress.scan.symlink_target = deref_name_buf; + do_capture_progress(params, + WIMLIB_SCAN_DENTRY_EXCLUDED_SYMLINK, + NULL); return 0; } inode->i_not_rpfixed = 0; @@ -203,7 +206,7 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret, { struct wim_dentry *root = NULL; int ret; - struct wim_inode *inode; + struct wim_inode *inode = NULL; struct stat stbuf; if (exclude_path(path, path_len, params->config, true)) { @@ -275,11 +278,14 @@ 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 + else { ret = unix_capture_symlink(&root, path, inode, params); + if (root == NULL) + goto out; + } if (ret) goto out;