From: Michael Tremer Date: Tue, 2 Aug 2022 09:11:39 +0000 (+0000) Subject: jail: Introduce interactive jails X-Git-Tag: 0.9.28~641 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=00ba1d9aa66061ca167e11bb565bb790c13953c7;p=pakfire.git jail: Introduce interactive jails Signed-off-by: Michael Tremer --- 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: