assert(source);
assert(ret);
+ assert(source->rfd >= 0 || source->rfd == AT_FDCWD);
_cleanup_(context_done) Context copy = (Context) {
- .rfd = -EBADF,
+ .rfd = AT_FDCWD,
.action = source->action,
.machine_id = source->machine_id,
.machine_id_is_random = source->machine_id_is_random,
.entry_token_type = source->entry_token_type,
};
- copy.rfd = fd_reopen(source->rfd, O_CLOEXEC|O_DIRECTORY|O_PATH);
- if (copy.rfd < 0)
- return copy.rfd;
+ if (source->rfd >= 0) {
+ copy.rfd = fd_reopen(source->rfd, O_CLOEXEC|O_DIRECTORY|O_PATH);
+ if (copy.rfd < 0)
+ return copy.rfd;
+ }
r = strdup_or_null(source->layout_other, ©.layout_other);
if (r < 0)
r = strdup_or_null(source->kernel, ©.kernel);
if (r < 0)
return r;
- copy.initrds = strv_copy(source->initrds);
- if (!copy.initrds)
- return -ENOMEM;
+ r = strv_copy_unless_empty(source->initrds, ©.initrds);
+ if (r < 0)
+ return r;
r = strdup_or_null(source->initrd_generator, ©.initrd_generator);
if (r < 0)
return r;
r = strdup_or_null(source->staging_area, ©.staging_area);
if (r < 0)
return r;
- copy.plugins = strv_copy(source->plugins);
- if (!copy.plugins)
- return -ENOMEM;
- copy.argv = strv_copy(source->argv);
- if (!copy.argv)
- return -ENOMEM;
- copy.envp = strv_copy(source->envp);
- if (!copy.envp)
- return -ENOMEM;
+ r = strv_copy_unless_empty(source->plugins, ©.plugins);
+ if (r < 0)
+ return r;
+ r = strv_copy_unless_empty(source->argv, ©.argv);
+ if (r < 0)
+ return r;
+ r = strv_copy_unless_empty(source->envp, ©.envp);
+ if (r < 0)
+ return r;
*ret = copy;
copy = CONTEXT_NULL;