X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fmodify.c;h=5b8fe415c50dda5a5905200e906ad38316934722;hb=034fd063f956d0806e557680a36a69a42556a776;hp=a8ce13caabb08b8b31737f26387eacd7a46287db;hpb=9b9a502863318d6208da2818b1d522346e5eee9e;p=wimlib diff --git a/src/modify.c b/src/modify.c index a8ce13ca..5b8fe415 100644 --- a/src/modify.c +++ b/src/modify.c @@ -96,7 +96,8 @@ static int build_dentry_tree(struct dentry **root_ret, struct lookup_table *lookup_table, struct wim_security_data *sd, const struct capture_config *config, - int add_flags, + int add_image_flags, + wimlib_progress_func_t progress_func, void *extra_arg) { struct stat root_stbuf; @@ -107,33 +108,43 @@ static int build_dentry_tree(struct dentry **root_ret, struct inode *inode; if (exclude_path(root_disk_path, config, true)) { - if (add_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) { + if (add_image_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) { ERROR("Cannot exclude the root directory from capture"); return WIMLIB_ERR_INVALID_CAPTURE_CONFIG; } - if (add_flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE) - printf("Excluding file `%s' from capture\n", - root_disk_path); + if ((add_image_flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE) + && progress_func) + { + union wimlib_progress_info info; + info.scan.cur_path = root_disk_path; + info.scan.excluded = true; + progress_func(WIMLIB_PROGRESS_MSG_SCAN_DENTRY, &info); + } *root_ret = NULL; return 0; } + if ((add_image_flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE) + && progress_func) + { + union wimlib_progress_info info; + info.scan.cur_path = root_disk_path; + info.scan.excluded = false; + progress_func(WIMLIB_PROGRESS_MSG_SCAN_DENTRY, &info); + } - if (add_flags & WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE) + if (add_image_flags & WIMLIB_ADD_IMAGE_FLAG_DEREFERENCE) stat_fn = stat; else stat_fn = lstat; - if (add_flags & WIMLIB_ADD_IMAGE_FLAG_VERBOSE) - printf("Scanning `%s'\n", root_disk_path); - ret = (*stat_fn)(root_disk_path, &root_stbuf); if (ret != 0) { ERROR_WITH_ERRNO("Failed to stat `%s'", root_disk_path); return WIMLIB_ERR_STAT; } - if ((add_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) && + if ((add_image_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) && !S_ISDIR(root_stbuf.st_mode)) { ERROR("`%s' is not a directory", root_disk_path); return WIMLIB_ERR_NOTDIR; @@ -145,7 +156,7 @@ static int build_dentry_tree(struct dentry **root_ret, return WIMLIB_ERR_SPECIAL_FILE; } - if (add_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) + if (add_image_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) filename = ""; else filename = path_basename(root_disk_path); @@ -156,16 +167,22 @@ static int build_dentry_tree(struct dentry **root_ret, inode = root->d_inode; +#ifdef HAVE_STAT_NANOSECOND_PRECISION inode->creation_time = timespec_to_wim_timestamp(&root_stbuf.st_mtim); inode->last_write_time = timespec_to_wim_timestamp(&root_stbuf.st_mtim); inode->last_access_time = timespec_to_wim_timestamp(&root_stbuf.st_atim); +#else + inode->creation_time = unix_timestamp_to_wim(root_stbuf.st_mtime); + inode->last_write_time = unix_timestamp_to_wim(root_stbuf.st_mtime); + inode->last_access_time = unix_timestamp_to_wim(root_stbuf.st_atime); +#endif if (sizeof(ino_t) >= 8) inode->ino = (u64)root_stbuf.st_ino; else inode->ino = (u64)root_stbuf.st_ino | ((u64)root_stbuf.st_dev << ((sizeof(ino_t) * 8) & 63)); - add_flags &= ~WIMLIB_ADD_IMAGE_FLAG_ROOT; + add_image_flags &= ~WIMLIB_ADD_IMAGE_FLAG_ROOT; inode->resolved = true; if (S_ISREG(root_stbuf.st_mode)) { /* Archiving a regular file */ @@ -219,7 +236,7 @@ static int build_dentry_tree(struct dentry **root_ret, inode->attributes = FILE_ATTRIBUTE_DIRECTORY; DIR *dir; - struct dirent *p; + struct dirent entry, *result; struct dentry *child; dir = opendir(root_disk_path); @@ -240,23 +257,23 @@ static int build_dentry_tree(struct dentry **root_ret, * to any subdirectories. */ while (1) { errno = 0; - p = readdir(dir); - if (p == NULL) { - if (errno) { - ret = WIMLIB_ERR_READ; - ERROR_WITH_ERRNO("Error reading the " - "directory `%s'", - root_disk_path); - } + ret = readdir_r(dir, &entry, &result); + if (ret != 0) { + ret = WIMLIB_ERR_READ; + ERROR_WITH_ERRNO("Error reading the " + "directory `%s'", + root_disk_path); break; } - if (p->d_name[0] == '.' && (p->d_name[1] == '\0' - || (p->d_name[1] == '.' && p->d_name[2] == '\0'))) + if (result == NULL) + break; + if (result->d_name[0] == '.' && (result->d_name[1] == '\0' + || (result->d_name[1] == '.' && result->d_name[2] == '\0'))) continue; - strcpy(name + len + 1, p->d_name); + strcpy(name + len + 1, result->d_name); ret = build_dentry_tree(&child, name, lookup_table, - NULL, config, - add_flags, NULL); + NULL, config, add_image_flags, + progress_func, NULL); if (ret != 0) break; if (child) @@ -953,7 +970,7 @@ WIMLIBAPI int wimlib_add_image(WIMStruct *w, const char *source, struct lookup_table *, struct wim_security_data *, const struct capture_config *, - int, void *); + int, wimlib_progress_func_t, void *); void *extra_arg; struct dentry *root_dentry = NULL; @@ -972,8 +989,8 @@ WIMLIBAPI int wimlib_add_image(WIMStruct *w, const char *source, capture_tree = build_dentry_tree_ntfs; extra_arg = &w->ntfs_vol; #else - ERROR("wimlib was compiled without support for NTFS-3g, so"); - ERROR("we cannot capture a WIM image directly from a NTFS volume"); + ERROR("wimlib was compiled without support for NTFS-3g, so\n" + " cannot capture a WIM image directly from a NTFS volume!"); return WIMLIB_ERR_UNSUPPORTED; #endif } else { @@ -981,7 +998,7 @@ WIMLIBAPI int wimlib_add_image(WIMStruct *w, const char *source, extra_arg = NULL; } - DEBUG("Adding dentry tree from directory or NTFS volume `%s'.", dir); + DEBUG("Adding dentry tree from directory or NTFS volume `%s'.", source); if (!name || !*name) { ERROR("Must specify a non-empty string for the image name"); @@ -1033,7 +1050,7 @@ WIMLIBAPI int wimlib_add_image(WIMStruct *w, const char *source, DEBUG("Building dentry tree."); ret = (*capture_tree)(&root_dentry, source, w->lookup_table, sd, &config, add_image_flags | WIMLIB_ADD_IMAGE_FLAG_ROOT, - extra_arg); + progress_func, extra_arg); destroy_capture_config(&config); if (ret != 0) {