From 00ba1d9aa66061ca167e11bb565bb790c13953c7 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Tue, 2 Aug 2022 09:11:39 +0000 Subject: [PATCH] jail: Introduce interactive jails Signed-off-by: Michael Tremer --- src/libpakfire/include/pakfire/jail.h | 5 +++++ src/libpakfire/jail.c | 32 +++++++++++++++++++++++++++ tests/libpakfire/jail.c | 6 +++++ 3 files changed, 43 insertions(+) diff --git a/src/libpakfire/include/pakfire/jail.h b/src/libpakfire/include/pakfire/jail.h index 53395a7f4..6cda85a16 100644 --- a/src/libpakfire/include/pakfire/jail.h +++ b/src/libpakfire/include/pakfire/jail.h @@ -27,6 +27,11 @@ struct pakfire_jail; +enum { + PAKFIRE_JAIL_NONE = 0, + PAKFIRE_JAIL_INTERACTIVE = (1 << 0), +}; + int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire, int flags); struct pakfire_jail* pakfire_jail_ref(struct pakfire_jail* jail); diff --git a/src/libpakfire/jail.c b/src/libpakfire/jail.c index 35fcb1b3b..4dfdb5eb8 100644 --- a/src/libpakfire/jail.c +++ b/src/libpakfire/jail.c @@ -60,6 +60,31 @@ static void pakfire_jail_free(struct pakfire_jail* jail) { free(jail); } +static int pakfire_jail_setup_interactive_env(struct pakfire_jail* jail) { + // Set PS1 + int r = pakfire_jail_set_env(jail, "PS1", "pakfire-jail \\w> "); + if (r) + return r; + + // Copy TERM + char* TERM = secure_getenv("TERM"); + if (TERM) { + r = pakfire_jail_set_env(jail, "TERM", TERM); + if (r) + return r; + } + + // Copy LANG + char* LANG = secure_getenv("LANG"); + if (LANG) { + r = pakfire_jail_set_env(jail, "LANG", LANG); + if (r) + return r; + } + + return 0; +} + int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire, int flags) { int r; @@ -86,6 +111,13 @@ int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire, int goto ERROR; } + // Setup interactive stuff + if (j->flags & PAKFIRE_JAIL_INTERACTIVE) { + r = pakfire_jail_setup_interactive_env(j); + if (r) + goto ERROR; + } + // Done *jail = j; return 0; diff --git a/tests/libpakfire/jail.c b/tests/libpakfire/jail.c index de3c56488..48a42db4f 100644 --- a/tests/libpakfire/jail.c +++ b/tests/libpakfire/jail.c @@ -35,6 +35,12 @@ static int test_create(const struct test* t) { // Destroy it ASSERT_NULL(pakfire_jail_unref(jail)); + // Create an interactive jail + ASSERT_SUCCESS(pakfire_jail_create(&jail, t->pakfire, PAKFIRE_JAIL_INTERACTIVE)); + + // Destroy it again + ASSERT_NULL(pakfire_jail_unref(jail)); + return EXIT_SUCCESS; FAIL: -- 2.47.3