WIMBoot capture: Override WimBootCompress.ini when config specified
authorEric Biggers <ebiggers3@gmail.com>
Fri, 25 Apr 2014 20:57:47 +0000 (15:57 -0500)
committerEric Biggers <ebiggers3@gmail.com>
Fri, 25 Apr 2014 23:26:06 +0000 (18:26 -0500)
doc/man1/imagex-capture.1.in
src/update_image.c

index c5deb3d..1c35863 100644 (file)
@@ -284,23 +284,32 @@ Specifies a configuration file (UTF-8 or UTF-16LE encoded) for capturing the new
 image.  The configuration file specifies files that are to be treated specially
 during the image capture.
 .IP ""
-The format of the configuration file is a number of sections containing path
-globs one per line, where each section begins with the tag [ExclusionList],
-[ExclusionException], [CompressionExclusionList], or [AlignmentList].
-Currently, only the [ExclusionList] and [ExclusionException] sections are
-implemented.  The [ExclusionList] section specifies a list of path globs to
-exclude from capture, while the [ExclusionException] section specifies a list of
-path globs to include in the capture even if the matched file or directory name
-also appears in the [ExclusionList].
+The format of the configuration file is INI-style; that is, it is arranged in
+bracketed sections.  Currently, only the following sections are recognized:
+.RS
+.IP \[bu] 4
+[ExclusionList] ---  contains a list of path globs to exclude from capture.  If
+a directory is matched, both the directory and its contents are excluded.
+.IP \[bu]
+[ExclusionException] --- contains a list of path globs to include in the
+capture, even when the file or directory also matches a glob in [ExclusionList].
+.IP \[bu]
+[PrepopulateList] --- this does not affect capture, but if the image is
+applied later with \fB--wimboot\fR, these are globs of files that shall be
+extracted normally, not as WIMBoot "pointer files".  Note that these globs do
+\fInot\fR match recursively; so, for example, you may want to use \\Boot\\* and
+\\Boot\\*\\* rather than simply \\Boot.
+.RE
+.IP ""
+Any unrecognized sections will be ignored, with a warning printed.  Sections
+dealing with compression (e.g. [CompressionExclusion]) are not particularly
+important.
 .IP ""
 Relative globs with only one path component (e.g. *.mp3) match against a
 filename in any directory.  Relative globs with multiple path components (e.g.
 dir/file), as well as absolute globs (e.g. /dir/file), are treated as paths
 starting at the root directory of capture, or the root of the NTFS volume for
-NTFS volume capture mode.  If a directory is matched by a glob in the
-[ExclusionList], the entire directory tree rooted at that directory is excluded
-from the capture, unless \fB--dereference\fR is specified and there is another
-path into that directory through a symbolic link.
+NTFS volume capture mode.
 .IP ""
 For compatibility with Windows, the path separators in the globs may be either
 forward slashes or backslashes, and the line separators may be either UNIX-style
@@ -328,6 +337,14 @@ used:
 .RE
 .RE
 .fi
+.IP ""
+However, special behavior applies if \fB--wimboot\fR is also specified.  By
+default, with \fB--wimboot\fR specified, the file
+Windows/System32/WimBootCompress.ini in the directory being captured will be
+used as the configuration file.  However, this can be overridden using
+\fB--config\fR; and this also causes the specified configuration file to be
+saved in the WIM image as Windows/System32/WimBootCompress.ini, overriding any
+that may be present on the filesystem.
 .TP
 \fB--unix-data\fR
 (UNIX-like systems only) Store the UNIX owner, group, and mode of all captured
index 05861f2..505a2f6 100644 (file)
@@ -174,6 +174,9 @@ static const char wincfg[] =
 "/RECYCLER\n"
 "/Windows/CSC\n";
 
+static const tchar *wimboot_cfgfile =
+               T("/Windows/System32/WimBootCompress.ini");
+
 static int
 get_capture_config(const tchar *config_file, struct capture_config *config,
                   int add_flags, const tchar *fs_source_path)
@@ -189,8 +192,6 @@ get_capture_config(const tchar *config_file, struct capture_config *config,
 
                /* XXX: Handle loading file correctly when in NTFS volume.  */
 
-               const tchar *wimboot_cfgfile =
-                       T("/Windows/System32/WimBootCompress.ini");
                size_t len = tstrlen(fs_source_path) +
                             tstrlen(wimboot_cfgfile);
                tmp_config_file = MALLOC((len + 1) * sizeof(tchar));
@@ -228,6 +229,32 @@ get_capture_config(const tchar *config_file, struct capture_config *config,
 }
 
 static int
+replace_wimboot_cfg(WIMStruct *wim, const tchar *config_file)
+{
+       struct wimlib_update_command cmds[] = {
+               {
+                       .op = WIMLIB_UPDATE_OP_DELETE,
+                       .delete_ = {
+                               .wim_path = (tchar *)wimboot_cfgfile,
+                               .delete_flags = WIMLIB_DELETE_FLAG_FORCE |
+                                               WIMLIB_DELETE_FLAG_RECURSIVE,
+                       },
+               },
+               {
+                       .op = WIMLIB_UPDATE_OP_ADD,
+                       .add = {
+                               .fs_source_path = (tchar *)config_file,
+                               .wim_target_path = (tchar *)wimboot_cfgfile,
+                               .add_flags = 0,
+                               .config_file = NULL,
+                       },
+               },
+       };
+       return wimlib_update_image(wim, wim->current_image,
+                                  cmds, ARRAY_LEN(cmds), 0, NULL);
+}
+
+static int
 execute_add_command(WIMStruct *wim,
                    const struct wimlib_update_command *add_cmd,
                    wimlib_progress_func_t progress_func)
@@ -337,6 +364,22 @@ execute_add_command(WIMStruct *wim,
                if (ret)
                        goto out_ntfs_umount;
        }
+
+       if (config_file && (add_flags & WIMLIB_ADD_FLAG_WIMBOOT) &&
+           wim_target_path[0] == T('\0'))
+       {
+               /* Save configuration file as \Windows\System32\WimBootCompress.ini  */
+               ret = replace_wimboot_cfg(wim, config_file);
+               if (ret) {
+                       /* Undo attach_branch()  */
+                       if (imd->root_dentry == branch)
+                               imd->root_dentry = NULL;
+                       else
+                               branch = NULL;
+                       goto out_ntfs_umount;
+               }
+       }
+
        if (progress_func)
                progress_func(WIMLIB_PROGRESS_MSG_SCAN_END, &params.progress);
        list_splice_tail(&unhashed_streams, &imd->unhashed_streams);