]> git.ipfire.org Git - pakfire.git/commitdiff
jail: Introduce interactive jails
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 2 Aug 2022 09:11:39 +0000 (09:11 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 2 Aug 2022 09:11:39 +0000 (09:11 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/include/pakfire/jail.h
src/libpakfire/jail.c
tests/libpakfire/jail.c

index 53395a7f4be3ff441eb1677a61f120f8fddf2f8a..6cda85a16d31712d6157651bb1f04726b039b1e5 100644 (file)
 
 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);
index 35fcb1b3be8881dcb6ab40659aa85bde648af6b3..4dfdb5eb8d6b2d917f2b4a87f734983bc352120b 100644 (file)
@@ -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;
index de3c56488686ded4979dde0c7ce6dab99c0dd24c..48a42db4fd2e06963a9fea7354317b5d286b2881 100644 (file)
@@ -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: