Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ once_cell = "1.21.3"
os-release = "0.1.0"
# We pull this one from git, as the project is no longer published as an external crate.
ostree-ext = { git = "https://github.com/containers/bootc", rev = "b76d75d6024bd0aa0f270ff181807aff4209f9c9" }
bootc-kernel-cmdline = { git = "https://github.com/containers/bootc", rev = "b76d75d6024bd0aa0f270ff181807aff4209f9c9" }
pastey = "0.1.1"
phf = { version = "0.12", features = ["macros"] }
rand = "0.9.1"
Expand Down
11 changes: 11 additions & 0 deletions rpmostree-cxxrs.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -3029,6 +3029,9 @@ extern "C"
void rpmostreecxx$cxxbridge1$cache_branch_to_nevra (::rust::Str nevra,
::rust::String *return$) noexcept;

void rpmostreecxx$cxxbridge1$kargs_delete (::rust::Str kargs, ::rust::Str to_delete,
::rust::String *return$) noexcept;

::std::uint32_t
rpmostreecxx$cxxbridge1$CxxGObjectArray$length (::rpmostreecxx::CxxGObjectArray &self) noexcept
{
Expand Down Expand Up @@ -6232,6 +6235,14 @@ cache_branch_to_nevra (::rust::Str nevra) noexcept
rpmostreecxx$cxxbridge1$cache_branch_to_nevra (nevra, &return$.value);
return ::std::move (return$.value);
}

::rust::String
kargs_delete (::rust::Str kargs, ::rust::Str to_delete) noexcept
{
::rust::MaybeUninit<::rust::String> return$;
rpmostreecxx$cxxbridge1$kargs_delete (kargs, to_delete, &return$.value);
return ::std::move (return$.value);
}
} // namespace rpmostreecxx

extern "C"
Expand Down
2 changes: 2 additions & 0 deletions rpmostree-cxxrs.h
Original file line number Diff line number Diff line change
Expand Up @@ -2134,4 +2134,6 @@ ::rpmostreecxx::GKeyFile *treefile_to_origin (::rpmostreecxx::Treefile const &tf
void origin_validate_roundtrip (::rpmostreecxx::GKeyFile const &kf) noexcept;

::rust::String cache_branch_to_nevra (::rust::Str nevra) noexcept;

::rust::String kargs_delete (::rust::Str kargs, ::rust::Str to_delete) noexcept;
} // namespace rpmostreecxx
19 changes: 19 additions & 0 deletions rust/src/kargs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*/

use bootc_kernel_cmdline::utf8::{Cmdline, Parameter};

pub fn kargs_delete(kargs: &str, to_delete: &str) -> String {
let mut cmdline = Cmdline::from(kargs.to_string());
let to_delete_param = match Parameter::parse(to_delete) {
Some(p) => p,
None => return String::new(),
};

if cmdline.remove_exact(&to_delete_param) {
cmdline.to_string()
} else {
String::new()
}
}
6 changes: 6 additions & 0 deletions rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ mod cmdutils;
mod cxxrsutil;
mod ffiutil;
pub(crate) mod ffiwrappers;
mod kargs;
pub use crate::kargs::kargs_delete;
mod reexec;
pub(crate) use cxxrsutil::*;
use ffi::BubblewrapMutability;
Expand Down Expand Up @@ -835,6 +837,10 @@ pub mod ffi {
fn cache_branch_to_nevra(nevra: &str) -> String;
}

extern "Rust" {
fn kargs_delete(kargs: &str, to_delete: &str) -> String;
}

unsafe extern "C++" {
include!("rpmostree-cxxrsutil.hpp");
#[allow(missing_debug_implementations)]
Expand Down
31 changes: 23 additions & 8 deletions src/daemon/rpmostreed-transaction-types.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -2762,12 +2762,19 @@ kernel_arg_apply_patching (KernelArgTransaction *self, RpmOstreeSysrootUpgrader
g_auto (GStrv) existing_kargs_strv = ostree_kernel_args_to_strv (existing_kargs);
gboolean changed = FALSE;

/* Delete all the entries included in the kernel args */
g_auto (GStrv) kargs_strv = ostree_kernel_args_to_strv (kargs);
g_autofree char *kargs_str = g_strjoinv (" ", kargs_strv);

for (char **iter = self->kernel_args_deleted; iter && *iter; iter++)
{
const char *arg = *iter;
if (!ostree_kernel_args_delete (kargs, arg, error))
return FALSE;
auto result = rpmostreecxx::kargs_delete (kargs_str, arg);
if (result.empty ())
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND, "No karg '%s' found", arg);
return FALSE;
}
kargs_str = g_strdup (result.c_str ());
changed = TRUE;
}

Expand All @@ -2788,8 +2795,8 @@ kernel_arg_apply_patching (KernelArgTransaction *self, RpmOstreeSysrootUpgrader
for (char **iter = append_if_missing; iter && *iter; iter++)
{
const char *arg = *iter;
g_auto (GStrv) kargs_strv = ostree_kernel_args_to_strv (kargs);
if (!g_strv_contains (kargs_strv, arg))
g_auto (GStrv) current_kargs_strv = ostree_kernel_args_to_strv (kargs);
if (!g_strv_contains (current_kargs_strv, arg))
{
ostree_kernel_args_append (kargs, arg);
changed = TRUE;
Expand All @@ -2799,14 +2806,22 @@ kernel_arg_apply_patching (KernelArgTransaction *self, RpmOstreeSysrootUpgrader
for (char **iter = delete_if_present; iter && *iter; iter++)
{
const char *arg = *iter;
if (g_strv_contains (existing_kargs_strv, arg))
auto result = rpmostreecxx::kargs_delete (kargs_str, arg);
if (!result.empty ())
{
if (!ostree_kernel_args_delete (kargs, arg, error))
return FALSE;
kargs_str = g_strdup (result.c_str ());
changed = TRUE;
}
}

if (changed)
{
g_autoptr (OstreeKernelArgs) new_kargs = ostree_kernel_args_from_string (kargs_str);
g_auto (GStrv) new_strv = ostree_kernel_args_to_strv (new_kargs);
for (char **iter = new_strv; iter && *iter; iter++)
ostree_kernel_args_append (kargs, *iter);
}

if (!kernel_arg_apply (self, upgrader, kargs, changed, cancellable, error))
return FALSE;

Expand Down