X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Funix_capture.c;h=eed38f62e29beb84503653c5bb0e4f5a7c2f26ff;hb=7453f4a4245219a9c01a70902283f6ebb2a65123;hp=2843c36a6c698204c4aace20f32ebb6bc435f008;hpb=6c36e2e6311e29cede36518e4363d1bcdd87ddb3;p=wimlib diff --git a/src/unix_capture.c b/src/unix_capture.c index 2843c36a..eed38f62 100644 --- a/src/unix_capture.c +++ b/src/unix_capture.c @@ -3,7 +3,7 @@ */ /* - * Copyright (C) 2012, 2013, 2014 Eric Biggers + * Copyright (C) 2012-2016 Eric Biggers * * This file is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free @@ -33,10 +33,10 @@ #include #include "wimlib/blob_table.h" -#include "wimlib/capture.h" #include "wimlib/dentry.h" #include "wimlib/error.h" #include "wimlib/reparse.h" +#include "wimlib/scan.h" #include "wimlib/timestamp.h" #include "wimlib/unix_data.h" @@ -136,13 +136,13 @@ static int unix_build_dentry_tree_recursive(struct wim_dentry **tree_ret, char *path, size_t path_len, int dirfd, const char *relpath, - struct capture_params *params); + struct scan_params *params); static int unix_scan_directory(struct wim_dentry *dir_dentry, char *full_path, size_t full_path_len, int parent_dirfd, const char *dir_relpath, - struct capture_params *params) + struct scan_params *params) { int dirfd; @@ -277,7 +277,7 @@ unix_relativize_link_target(char *target, u64 ino, u64 dev) static noinline_for_stack int unix_scan_symlink(const char *full_path, int dirfd, const char *relpath, - struct wim_inode *inode, struct capture_params *params) + struct wim_inode *inode, struct scan_params *params) { char orig_target[REPARSE_POINT_MAX_SIZE]; char *target = orig_target; @@ -313,15 +313,20 @@ unix_scan_symlink(const char *full_path, int dirfd, const char *relpath, inode->i_rp_flags &= ~WIM_RP_FLAG_NOT_FIXED; status = WIMLIB_SCAN_DENTRY_FIXED_SYMLINK; } - ret = do_capture_progress(params, status, NULL); + ret = do_scan_progress(params, status, NULL); if (ret) return ret; } /* Translate the UNIX symlink target into a Windows reparse point. */ ret = wim_inode_set_symlink(inode, target, params->blob_table); - if (ret) + if (unlikely(ret)) { + if (ret == WIMLIB_ERR_INVALID_UTF8_STRING) { + ERROR("\"%s\": target of symbolic link is not valid " + "UTF-8. This is not supported.", full_path); + } return ret; + } /* On Windows, a reparse point can be set on both directory and * non-directory files. Usually, a link that is intended to point to a @@ -338,7 +343,7 @@ static int unix_build_dentry_tree_recursive(struct wim_dentry **tree_ret, char *full_path, size_t full_path_len, int dirfd, const char *relpath, - struct capture_params *params) + struct scan_params *params) { struct wim_dentry *tree = NULL; struct wim_inode *inode = NULL; @@ -380,17 +385,22 @@ unix_build_dentry_tree_recursive(struct wim_dentry **tree_ret, goto out; } params->progress.scan.cur_path = full_path; - ret = do_capture_progress(params, - WIMLIB_SCAN_DENTRY_UNSUPPORTED, - NULL); + ret = do_scan_progress(params, + WIMLIB_SCAN_DENTRY_UNSUPPORTED, + NULL); goto out; } } ret = inode_table_new_dentry(params->inode_table, relpath, stbuf.st_ino, stbuf.st_dev, false, &tree); - if (ret) + if (unlikely(ret)) { + if (ret == WIMLIB_ERR_INVALID_UTF8_STRING) { + ERROR("\"%s\": filename is not valid UTF-8. " + "This is not supported.", full_path); + } goto out; + } inode = tree->d_inode; @@ -443,14 +453,14 @@ unix_build_dentry_tree_recursive(struct wim_dentry **tree_ret, out_progress: params->progress.scan.cur_path = full_path; if (likely(tree)) - ret = do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode); + ret = do_scan_progress(params, WIMLIB_SCAN_DENTRY_OK, inode); else - ret = do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL); + ret = do_scan_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED, NULL); out: if (unlikely(ret)) { free_dentry_tree(tree, params->blob_table); tree = NULL; - ret = report_capture_error(params, ret, full_path); + ret = report_scan_error(params, ret, full_path); } *tree_ret = tree; return ret; @@ -461,13 +471,12 @@ out: * Builds a tree of WIM dentries from an on-disk directory tree (UNIX * version; no NTFS-specific data is captured). * - * @root_ret: Place to return a pointer to the root of the dentry tree. Only - * modified if successful. Set to NULL if the file or directory was - * excluded from capture. + * @root_ret: Place to return a pointer to the root of the dentry tree. Set + * to NULL if the file or directory was excluded from capture. * * @root_disk_path: The path to the root of the directory tree on disk. * - * @params: See doc for `struct capture_params'. + * @params: See doc for `struct scan_params'. * * @return: 0 on success, nonzero on failure. It is a failure if any of * the files cannot be `stat'ed, or if any of the needed @@ -478,8 +487,7 @@ out: */ int unix_build_dentry_tree(struct wim_dentry **root_ret, - const char *root_disk_path, - struct capture_params *params) + const char *root_disk_path, struct scan_params *params) { size_t path_len; size_t path_bufsz;