X-Git-Url: https://wimlib.net/git/?p=wimlib;a=blobdiff_plain;f=src%2Fntfs-3g_capture.c;h=78199efa96fadc36d3a5058afbd7bdb91ffef292;hp=af9ebbee05cc5df78ed0f231cdbf97cdf280dd91;hb=79d279cf4581fc0295576e33a28faf65686bee2c;hpb=af141a23c4d1540b8a64759bb68c7cd7ff054e72 diff --git a/src/ntfs-3g_capture.c b/src/ntfs-3g_capture.c index af9ebbee..78199efa 100644 --- a/src/ntfs-3g_capture.c +++ b/src/ntfs-3g_capture.c @@ -8,20 +8,18 @@ /* * Copyright (C) 2012, 2013, 2014 Eric Biggers * - * This file is part of wimlib, a library for working with WIM files. + * 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 + * Software Foundation; either version 3 of the License, or (at your option) any + * later version. * - * wimlib is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) - * any later version. - * - * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more + * This file is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * - * You should have received a copy of the GNU General Public License - * along with wimlib; if not, see http://www.gnu.org/licenses/. + * You should have received a copy of the GNU Lesser General Public License + * along with this file; if not, see http://www.gnu.org/licenses/. */ #ifdef HAVE_CONFIG_H @@ -341,7 +339,7 @@ insert_dos_name(struct dos_name_map *map, const ntfschar *dos_name, DEBUG("DOS name_len = %zu", name_nbytes); new_node = MALLOC(sizeof(struct dos_name_node)); if (!new_node) - return -1; + return WIMLIB_ERR_NOMEM; /* DOS names are supposed to be 12 characters max (that's 24 bytes, * assuming 2-byte ntfs characters) */ @@ -363,7 +361,7 @@ insert_dos_name(struct dos_name_map *map, const ntfschar *dos_name, ERROR("NTFS inode %"PRIu64" has multiple DOS names", le64_to_cpu(ntfs_ino)); FREE(new_node); - return -1; + return WIMLIB_ERR_NOMEM; } DEBUG("Inserted DOS name for inode %"PRIu64, le64_to_cpu(ntfs_ino)); return 0; @@ -431,7 +429,8 @@ struct readdir_ctx { size_t path_len; struct dos_name_map *dos_name_map; ntfs_volume *vol; - struct add_image_params *params; + struct capture_params *params; + int ret; }; static int @@ -441,7 +440,7 @@ build_dentry_tree_ntfs_recursive(struct wim_dentry **root_p, size_t path_len, int name_type, ntfs_volume *ntfs_vol, - struct add_image_params *params); + struct capture_params *params); static int wim_ntfs_capture_filldir(void *dirent, const ntfschar *name, @@ -513,6 +512,7 @@ out_free_mbs_name: FREE(mbs_name); out: ctx->path[ctx->path_len] = '\0'; + ctx->ret = ret; return ret; } @@ -527,18 +527,18 @@ build_dentry_tree_ntfs_recursive(struct wim_dentry **root_ret, size_t path_len, int name_type, ntfs_volume *vol, - struct add_image_params *params) + struct capture_params *params) { - le32 attributes; + u32 attributes; int ret; struct wim_dentry *root = NULL; struct wim_inode *inode = NULL; - if (should_exclude_path(path, path_len, params->config)) { - /* Exclude a file or directory tree based on the capture - * configuration file. */ + ret = try_exclude(path, path_len, params); + if (ret < 0) /* Excluded? */ goto out_progress; - } + if (ret > 0) /* Error? */ + goto out; /* Get file attributes */ ret = ntfs_get_ntfs_attrib(ni, (char*)&attributes, sizeof(attributes)); @@ -582,7 +582,7 @@ build_dentry_tree_ntfs_recursive(struct wim_dentry **root_ret, inode->i_creation_time = le64_to_cpu(ni->creation_time); inode->i_last_write_time = le64_to_cpu(ni->last_data_change_time); inode->i_last_access_time = le64_to_cpu(ni->last_access_time); - inode->i_attributes = le32_to_cpu(attributes); + inode->i_attributes = attributes; inode->i_resolved = 1; /* Capture streams. */ @@ -624,11 +624,18 @@ build_dentry_tree_ntfs_recursive(struct wim_dentry **root_ret, .dos_name_map = &dos_name_map, .vol = vol, .params = params, + .ret = 0, }; ret = ntfs_readdir(ni, &pos, &ctx, wim_ntfs_capture_filldir); if (ret) { - ERROR_WITH_ERRNO("Error reading directory \"%s\"", path); - ret = WIMLIB_ERR_NTFS_3G; + if (ctx.ret) { + /* wimlib error */ + ret = ctx.ret; + } else { + /* error from ntfs_readdir() itself */ + ERROR_WITH_ERRNO("Error reading directory \"%s\"", path); + ret = WIMLIB_ERR_NTFS_3G; + } } else { struct wim_dentry *child; @@ -697,10 +704,12 @@ out_progress: else ret = do_capture_progress(params, WIMLIB_SCAN_DENTRY_OK, inode); out: - if (ret == 0) - *root_ret = root; - else + if (unlikely(ret)) { free_dentry_tree(root, params->lookup_table); + root = NULL; + ret = report_capture_error(params, ret, path); + } + *root_ret = root; return ret; } @@ -718,7 +727,7 @@ do_ntfs_umount(struct _ntfs_volume *vol) int build_dentry_tree_ntfs(struct wim_dentry **root_p, const char *device, - struct add_image_params *params) + struct capture_params *params) { ntfs_volume *vol; ntfs_inode *root_ni; @@ -789,8 +798,6 @@ out: if (do_ntfs_umount(vol)) { ERROR_WITH_ERRNO("Failed to unmount NTFS volume `%s'", device); - if (ret == 0) - ret = WIMLIB_ERR_NTFS_3G; } } else { /* We need to leave the NTFS volume mounted so that we can read