const ExecContext *context,
ExecRuntime *runtime,
char **root_image, /* both input and output! modified if ephemeral logic enabled */
- char **root_directory) { /* ditto */
+ char **root_directory, /* ditto */
+ char **reterr_path) {
_cleanup_close_ int fd = -EBADF;
_cleanup_free_ char *new_root = NULL;
fd = copy_file(*root_image, new_root, O_EXCL, 0600,
COPY_LOCK_BSD|COPY_REFLINK|COPY_CRTIME|COPY_NOCOW_AFTER);
- if (fd < 0)
+ if (fd < 0) {
+ *reterr_path = strdup(*root_image);
return log_debug_errno(fd, "Failed to copy image %s to %s: %m",
*root_image, new_root);
+ }
} else {
assert(*root_directory);
BTRFS_SNAPSHOT_FALLBACK_DIRECTORY |
BTRFS_SNAPSHOT_RECURSIVE |
BTRFS_SNAPSHOT_LOCK_BSD);
- if (fd < 0)
+ if (fd < 0) {
+ *reterr_path = strdup(*root_directory);
return log_debug_errno(fd, "Failed to snapshot directory %s to %s: %m",
*root_directory, new_root);
+ }
}
r = send_one_fd(runtime->ephemeral_storage_socket[1], fd, MSG_DONTWAIT);
const ExecContext *context,
const ExecParameters *params,
char **ret_root_image,
- char **ret_root_directory) {
+ char **ret_root_directory,
+ char **reterr_path) {
int r;
&pick_filter_image_raw,
PICK_ARCHITECTURE|PICK_TRIES|PICK_RESOLVE,
&result);
- if (r < 0)
+ if (r < 0) {
+ *reterr_path = strdup(context->root_image);
return r;
+ }
- if (!result.path)
+ if (!result.path) {
+ *reterr_path = strdup(context->root_image);
return log_exec_debug_errno(context, params, SYNTHETIC_ERRNO(ENOENT), "No matching entry in .v/ directory %s found.", context->root_image);
+ }
*ret_root_image = TAKE_PTR(result.path);
*ret_root_directory = NULL;
&pick_filter_image_dir,
PICK_ARCHITECTURE|PICK_TRIES|PICK_RESOLVE,
&result);
- if (r < 0)
+ if (r < 0) {
+ *reterr_path = strdup(context->root_directory);
return r;
+ }
- if (!result.path)
+ if (!result.path) {
+ *reterr_path = strdup(context->root_directory);
return log_exec_debug_errno(context, params, SYNTHETIC_ERRNO(ENOENT), "No matching entry in .v/ directory %s found.", context->root_directory);
+ }
*ret_root_image = NULL;
*ret_root_directory = TAKE_PTR(result.path);
context,
params,
&root_image,
- &root_dir);
+ &root_dir,
+ reterr_path);
if (r < 0)
return r;
context,
runtime,
&root_image,
- &root_dir);
+ &root_dir,
+ reterr_path);
if (r < 0)
return r;
}