<term><varname>ExcludeFiles=</varname></term>
<term><varname>ExcludeFilesTarget=</varname></term>
- <listitem><para>Takes an absolute file system path referring to a source file or directory on the
- host. This setting may be used to exclude files or directories from the host from being copied into
- the file system when <varname>CopyFiles=</varname> is used. This option may be used multiple times to
- exclude multiple files or directories from host from being copied into the newly formatted file
- system.</para>
+ <listitem><para>Takes one or more absolute paths, separated by whitespace, each referring to a
+ source file or directory on the host. This setting may be used to exclude files or directories from
+ the host from being copied into the file system when <varname>CopyFiles=</varname> is used. This
+ option may be used multiple times to exclude multiple files or directories from host from being
+ copied into the newly formatted file system.</para>
<para>If the path is a directory and ends with <literal>/</literal>, only the directory's
contents are excluded but not the directory itself. If the path is a directory and does not end with
<literal>/</literal>, both the directory and its contents are excluded.</para>
<para><varname>ExcludeFilesTarget=</varname> is like <varname>ExcludeFiles=</varname> except that
- instead of excluding the path on the host from being copied into the partition, we exclude any files
+ instead of excluding the path on the host from being copied into the partition, it exclude any files
and directories from being copied into the given path in the partition.</para>
<para>When
const char *rvalue,
void *data,
void *userdata) {
- _cleanup_free_ char *resolved = NULL;
+
char ***exclude_files = ASSERT_PTR(data);
+ const char *p = ASSERT_PTR(rvalue);
int r;
if (isempty(rvalue)) {
return 0;
}
- r = specifier_printf(rvalue, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved);
- if (r < 0) {
- log_syntax(unit, LOG_WARNING, filename, line, r,
- "Failed to expand specifiers in ExcludeFiles= path, ignoring: %s", rvalue);
- return 0;
- }
+ for (;;) {
+ _cleanup_free_ char *word = NULL, *resolved = NULL;
- r = path_simplify_and_warn(resolved, PATH_CHECK_ABSOLUTE|PATH_KEEP_TRAILING_SLASH, unit, filename, line, lvalue);
- if (r < 0)
- return 0;
+ r = extract_first_word(&p, &word, NULL, EXTRACT_UNQUOTE);
+ if (r == -ENOMEM)
+ return log_oom();
+ if (r < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, r, "Invalid syntax, ignoring: %s", p);
+ return 0;
+ }
+ if (r == 0)
+ return 0;
- if (strv_consume(exclude_files, TAKE_PTR(resolved)) < 0)
- return log_oom();
+ r = specifier_printf(word, PATH_MAX-1, system_and_tmp_specifier_table, arg_root, NULL, &resolved);
+ if (r < 0) {
+ log_syntax(unit, LOG_WARNING, filename, line, r,
+ "Failed to expand specifiers in %s path, ignoring: %s", lvalue, word);
+ return 0;
+ }
+
+ r = path_simplify_and_warn(resolved, PATH_CHECK_ABSOLUTE|PATH_KEEP_TRAILING_SLASH, unit, filename, line, lvalue);
+ if (r < 0)
+ return 0;
+
+ if (strv_consume(exclude_files, TAKE_PTR(resolved)) < 0)
+ return log_oom();
+ }
return 0;
}