return ret;
}
-static char *
-fixup_symlink(char *dest, ino_t capture_root_ino, dev_t capture_root_dev)
-{
- char *p = dest;
- struct stat stbuf;
-
- for (;;) {
- char save;
- int ret;
-
- while (*p == '/')
- p++;
-
- save = *p;
- *p = '\0';
- if (stat(dest, &stbuf)) {
- WARNING_WITH_ERRNO("Failed to stat \"%s\": %m", dest);
- *p = save;
- /* Treat as a link pointing outside the capture root (it
- * most likely is). */
- return NULL;
- }
- *p = save;
-
- if (stbuf.st_ino == capture_root_ino &&
- stbuf.st_dev == capture_root_dev)
- {
- /* Link points inside capture root. Return abbreviated
- * path. */
- if (*p == '\0')
- *(p - 1) = '/';
- while (p - 1 >= dest && *(p - 1) == '/')
- p--;
- return p;
- }
-
- if (*p == '\0') {
- /* Link points outside capture root. */
- return NULL;
- }
-
- do {
- p++;
- } while (*p != '/' && *p != '\0');
- }
-}
-
static int
unix_capture_symlink(struct wim_dentry **root_p,
const char *path,
*root_p = NULL;
return 0;
}
+ inode->i_not_rpfixed = 0;
}
ret = inode_set_symlink(inode, dest,
params->lookup_table, NULL);
struct wim_inode *inode;
if (exclude_path(path, path_len, params->config, true)) {
- if (params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) {
- ERROR("Cannot exclude the root directory from capture");
- ret = WIMLIB_ERR_INVALID_CAPTURE_CONFIG;
- goto out;
- }
if ((params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_EXCLUDE_VERBOSE)
&& params->progress_func)
{
return WIMLIB_ERR_STAT;
}
- if (!S_ISDIR(root_stbuf.st_mode)) {
+ if ((params->add_image_flags & WIMLIB_ADD_IMAGE_FLAG_ROOT) &&
+ !S_ISDIR(root_stbuf.st_mode))
+ {
ERROR("Root of capture \"%s\" is not a directory",
root_disk_path);
return WIMLIB_ERR_NOTDIR;
if ((add_image_flags & (WIMLIB_ADD_IMAGE_FLAG_RPFIX |
WIMLIB_ADD_IMAGE_FLAG_NORPFIX)) == 0)
- if (w->hdr.flags & WIM_HDR_FLAG_RP_FIX)
+ {
+ /* Do reparse-point fixups by default if the header flag is set
+ * from previous images, or if this is the first image being
+ * added. */
+ if ((w->hdr.flags & WIM_HDR_FLAG_RP_FIX) || w->hdr.image_count == 0)
add_image_flags |= WIMLIB_ADD_IMAGE_FLAG_RPFIX;
+ }
if (!name || !*name) {
ERROR("Must specify a non-empty string for the image name");