]> wimlib.net Git - wimlib/blobdiff - src/ntfs-apply.c
License and documentation
[wimlib] / src / ntfs-apply.c
index e8e86c1ecd5efcd1bd5cd360079773f7fb8c1d56..47e12c02db759cc05df6888e882f96316a3ac8ed 100644 (file)
@@ -1,9 +1,8 @@
 /*
  * ntfs-apply.c
  *
- * Apply a WIM image to a NTFS volume, restoring everything we can, including
- * security data and alternate data streams.  There should be no loss of
- * information.
+ * Apply a WIM image to a NTFS volume.  We restore everything we can, including
+ * security data and alternate data streams.
  */
 
 /*
  * This file is part of wimlib, a library for working with WIM files.
  *
  * wimlib 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 2.1 of the License, or (at your option)
+ * 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 Lesser General Public License for more
+ * A PARTICULAR PURPOSE. See the GNU General Public License for more
  * details.
  *
- * You should have received a copy of the GNU Lesser General Public License
+ * You should have received a copy of the GNU General Public License
  * along with wimlib; if not, see http://www.gnu.org/licenses/.
  */
 
@@ -119,19 +118,38 @@ static int write_ntfs_data_streams(ntfs_inode *ni, const struct dentry *dentry,
                ntfs_attr *na;
 
                lte = dentry_stream_lte(dentry, stream_idx, w->lookup_table);
-               na = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_len);
-               if (!na) {
-                       ERROR_WITH_ERRNO("Failed to open a data stream of "
-                                        "extracted file `%s'",
-                                        dentry->full_path_utf8);
-                       ret = WIMLIB_ERR_NTFS_3G;
-                       break;
+
+               if (stream_name_len) {
+                       /* Create an empty named stream. */
+                       ret = ntfs_attr_add(ni, AT_DATA, stream_name,
+                                           stream_name_len, NULL, 0);
+                       if (ret != 0) {
+                               ERROR_WITH_ERRNO("Failed to create name data "
+                                                "stream for extracted file "
+                                                "`%s'",
+                                                dentry->full_path_utf8);
+                               ret = WIMLIB_ERR_NTFS_3G;
+                               break;
+
+                       }
                }
-               if (lte)
+               /* If there's no lookup table entry, it's an empty stream.
+                * Otherwise, we must open the attribute and extract the data.
+                * */
+               if (lte) {
+                       na = ntfs_attr_open(ni, AT_DATA, stream_name, stream_name_len);
+                       if (!na) {
+                               ERROR_WITH_ERRNO("Failed to open a data stream of "
+                                                "extracted file `%s'",
+                                                dentry->full_path_utf8);
+                               ret = WIMLIB_ERR_NTFS_3G;
+                               break;
+                       }
                        ret = extract_wim_resource_to_ntfs_attr(lte, na);
-               ntfs_attr_close(na);
-               if (ret != 0)
-                       break;
+                       if (ret != 0)
+                               break;
+                       ntfs_attr_close(na);
+               }
                if (stream_idx == dentry->num_ads)
                        break;
                stream_name = (ntfschar*)dentry->ads_entries[stream_idx].stream_name;
@@ -669,10 +687,18 @@ static int do_wim_apply_image_ntfs(WIMStruct *w, const char *device, int extract
 
        if (ret != 0)
                goto out;
-       DEBUG("Setting NTFS timestamps");
+       if (extract_flags & WIMLIB_EXTRACT_FLAG_VERBOSE)
+               printf("Setting timestamps of extracted files on NTFS "
+                      "volume `%s'\n", device);
        ret = for_dentry_in_tree_depth(wim_root_dentry(w),
                                       wim_apply_dentry_timestamps,
                                       &args);
+       if (ret == 0 && (extract_flags & WIMLIB_EXTRACT_FLAG_VERBOSE))
+               printf("Finished applying image %d of %s to NTFS "
+                      "volume `%s'\n",
+                      w->current_image,
+                      w->filename ? w->filename : "WIM",
+                      device);
 out:
        DEBUG("Unmounting NTFS volume `%s'", device);
        if (ntfs_umount(vol, FALSE) != 0) {