]> wimlib.net Git - wimlib/blobdiff - src/modify.c
wimlib_add_image(): Fix variable name (--enable-debug only)
[wimlib] / src / modify.c
index a8ce13caabb08b8b31737f26387eacd7a46287db..5b8fe415c50dda5a5905200e906ad38316934722 100644 (file)
@@ -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) {