return 0;
}
-static int cmdline_add_kernel_cmdline(char ***cmdline, const char *kernel) {
+static int cmdline_add_kernel_cmdline(char ***cmdline, const char *kernel, const char *smbios_dir) {
+ int r;
+
assert(cmdline);
if (strv_isempty(arg_kernel_cmdline_extra))
return 0;
}
- _cleanup_free_ char *escaped_kcl = NULL;
- escaped_kcl = escape_qemu_value(kcl);
- if (!escaped_kcl)
- return log_oom();
-
- if (strv_extend(cmdline, "-smbios") < 0)
- return log_oom();
+ FOREACH_STRING(id, "io.systemd.stub.kernel-cmdline-extra", "io.systemd.boot.kernel-cmdline-extra") {
+ _cleanup_free_ char *p = path_join(smbios_dir, id);
+ if (!p)
+ return log_oom();
- if (strv_extendf(cmdline, "type=11,value=io.systemd.stub.kernel-cmdline-extra=%s", escaped_kcl) < 0)
- return log_oom();
+ r = write_string_filef(
+ p,
+ WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_AVOID_NEWLINE|WRITE_STRING_FILE_MODE_0600,
+ "%s=%s", id, kcl);
+ if (r < 0)
+ return log_error_errno(r, "Failed to write smbios kernel command line to file: %m");
- if (strv_extend(cmdline, "-smbios") < 0)
- return log_oom();
+ if (strv_extend(cmdline, "-smbios") < 0)
+ return log_oom();
- if (strv_extendf(cmdline, "type=11,value=io.systemd.boot.kernel-cmdline-extra=%s", escaped_kcl) < 0)
- return log_oom();
+ if (strv_extendf(cmdline, "type=11,path=%s", p) < 0)
+ return log_oom();
+ }
}
return 0;
}
-static int cmdline_add_smbios11(char ***cmdline) {
+static int cmdline_add_smbios11(char ***cmdline, const char* smbios_dir) {
+ int r;
+
assert(cmdline);
if (strv_isempty(arg_smbios11))
}
STRV_FOREACH(i, arg_smbios11) {
- _cleanup_free_ char *escaped = NULL;
- escaped = escape_qemu_value(*i);
- if (!escaped)
- return log_oom();
+ _cleanup_(unlink_and_freep) char *p = NULL;
+
+ r = tempfn_random_child(smbios_dir, "smbios11", &p);
+ if (r < 0)
+ return r;
+
+ r = write_string_file(
+ p, *i,
+ WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_AVOID_NEWLINE|WRITE_STRING_FILE_MODE_0600);
+ if (r < 0)
+ return log_error_errno(r, "Failed to write smbios data to smbios file %s: %m", p);
if (strv_extend(cmdline, "-smbios") < 0)
return log_oom();
- if (strv_extendf(cmdline, "type=11,value=%s", escaped) < 0)
+ if (strv_extendf(cmdline, "type=11,path=%s", p) < 0)
return log_oom();
}
return log_oom();
}
- r = cmdline_add_kernel_cmdline(&cmdline, kernel);
+ _cleanup_(rm_rf_physical_and_freep) char *smbios_dir = NULL;
+ r = mkdtemp_malloc("/var/tmp/vmspawn-smbios-XXXXXX", &smbios_dir);
+ if (r < 0)
+ return log_error_errno(r, "Failed to create temporary directory: %m");
+
+ r = cmdline_add_kernel_cmdline(&cmdline, kernel, smbios_dir);
if (r < 0)
return r;
- r = cmdline_add_smbios11(&cmdline);
+ r = cmdline_add_smbios11(&cmdline, smbios_dir);
if (r < 0)
return r;
if (ARCHITECTURE_SUPPORTS_SMBIOS)
FOREACH_ARRAY(cred, arg_credentials.credentials, arg_credentials.n_credentials) {
- _cleanup_free_ char *cred_data_b64 = NULL;
+ _cleanup_free_ char *p = NULL, *cred_data_b64 = NULL;
ssize_t n;
n = base64mem(cred->data, cred->size, &cred_data_b64);
if (n < 0)
return log_oom();
+ p = path_join(smbios_dir, cred->id);
+ if (!p)
+ return log_oom();
+
+ r = write_string_filef(
+ p,
+ WRITE_STRING_FILE_CREATE|WRITE_STRING_FILE_AVOID_NEWLINE|WRITE_STRING_FILE_MODE_0600,
+ "io.systemd.credential.binary:%s=%s", cred->id, cred_data_b64);
+ if (r < 0)
+ return log_error_errno(r, "Failed to write smbios credential file %s: %m", p);
+
r = strv_extend(&cmdline, "-smbios");
if (r < 0)
return log_oom();
- r = strv_extendf(&cmdline, "type=11,value=io.systemd.credential.binary:%s=%s", cred->id, cred_data_b64);
+ r = strv_extendf(&cmdline, "type=11,path=%s", p);
if (r < 0)
return log_oom();
}