X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Funix_capture.c;h=ff9a6ac00179e977ebd8cadf8dc013717c86957b;hp=fe95b9a6b6c7173bca3e225a657b7d30136fc343;hb=2799ba2de8e4409158ed47828a3be9ac26859947;hpb=dfb714d9e4291b8fe7a8d4d955d42f8169ada770 diff --git a/src/unix_capture.c b/src/unix_capture.c index fe95b9a6..ff9a6ac0 100644 --- a/src/unix_capture.c +++ b/src/unix_capture.c @@ -201,30 +201,17 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret, struct add_image_params *params) { struct wim_dentry *root = NULL; - int ret = 0; + int ret; struct wim_inode *inode; + params->progress.scan.cur_path = path; + if (exclude_path(path, path_len, params->config, true)) { - if ((params->add_flags & WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE) - && params->progress_func) - { - union wimlib_progress_info info; - info.scan.cur_path = path; - info.scan.status = WIMLIB_SCAN_DENTRY_EXCLUDED; - params->progress_func(WIMLIB_PROGRESS_MSG_SCAN_DENTRY, &info); - } + do_capture_progress(params, WIMLIB_SCAN_DENTRY_EXCLUDED); + ret = 0; goto out; } - if ((params->add_flags & WIMLIB_ADD_FLAG_VERBOSE) - && params->progress_func) - { - union wimlib_progress_info info; - info.scan.cur_path = path; - info.scan.status = WIMLIB_SCAN_DENTRY_OK; - params->progress_func(WIMLIB_PROGRESS_MSG_SCAN_DENTRY, &info); - } - struct stat stbuf; int (*stat_fn)(const char *restrict, struct stat *restrict); if ((params->add_flags & WIMLIB_ADD_FLAG_DEREFERENCE) || @@ -244,19 +231,16 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret, if (params->add_flags & WIMLIB_ADD_FLAG_NO_UNSUPPORTED_EXCLUDE) { ERROR("Can't archive unsupported file \"%s\"", path); - return WIMLIB_ERR_UNSUPPORTED_FILE; - } - if ((params->add_flags & WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE) - && params->progress_func) - { - union wimlib_progress_info info; - info.scan.cur_path = path; - info.scan.status = WIMLIB_SCAN_DENTRY_UNSUPPORTED; - params->progress_func(WIMLIB_PROGRESS_MSG_SCAN_DENTRY, &info); + ret = WIMLIB_ERR_UNSUPPORTED_FILE; + goto out; } + do_capture_progress(params, WIMLIB_SCAN_DENTRY_UNSUPPORTED); + ret = 0; goto out; } + do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK); + ret = inode_table_new_dentry(¶ms->inode_table, path_basename_with_len(path, path_len), stbuf.st_ino, stbuf.st_dev, false, &root); @@ -265,8 +249,11 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret, inode = root->d_inode; - if (inode->i_nlink > 1) /* Already captured this inode? */ + if (inode->i_nlink > 1) { + /* Already captured this inode? */ + ret = 0; goto out; + } #ifdef HAVE_STAT_NANOSECOND_PRECISION inode->i_creation_time = timespec_to_wim_timestamp(stbuf.st_mtim); @@ -295,11 +282,15 @@ unix_build_dentry_tree_recursive(struct wim_dentry **root_ret, ret = unix_capture_directory(root, path, path_len, params); else ret = unix_capture_symlink(&root, path, inode, params); + + if (ret) + goto out; + out: - if (ret == 0) - *root_ret = root; - else + if (ret) free_dentry_tree(root, params->lookup_table); + else + *root_ret = root; return ret; }