]> git.ipfire.org Git - pakfire.git/commitdiff
jail: Set some default environment variables
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 2 Aug 2022 08:55:09 +0000 (08:55 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 2 Aug 2022 08:55:09 +0000 (08:55 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/jail.c
tests/libpakfire/jail.c

index 8ac6c3287367b3c9057a0c91904ba5aa94acf026..b296aa19429a365ea6587394de86e626e0363ed6 100644 (file)
 
 #define ENVIRON_SIZE 128
 
+// The default environment that will be set for every command
+static const struct environ {
+       const char* key;
+       const char* val;
+} ENV[] = {
+       { "LANG", "en_US.utf-8" },
+       { "TERM", "vt100" },
+       { NULL, NULL },
+};
+
 struct pakfire_jail {
        struct pakfire* pakfire;
        int nrefs;
@@ -36,7 +46,21 @@ struct pakfire_jail {
        char* env[ENVIRON_SIZE];
 };
 
+static void pakfire_jail_free(struct pakfire_jail* jail) {
+       DEBUG(jail->pakfire, "Freeing jail at %p\n", jail);
+
+       // Free environment
+       for (unsigned int i = 0; jail->env[i]; i++)
+               free(jail->env[i]);
+
+       pakfire_unref(jail->pakfire);
+       free(jail);
+}
+
 int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire) {
+       int r;
+
+       // Allocate a new jail
        struct pakfire_jail* j = calloc(1, sizeof(*j));
        if (!j)
                return 1;
@@ -49,20 +73,21 @@ int pakfire_jail_create(struct pakfire_jail** jail, struct pakfire* pakfire) {
 
        DEBUG(j->pakfire, "Allocated new jail at %p\n", j);
 
+       // Set default environment
+       for (const struct environ* e = ENV; e->key; e++) {
+               r = pakfire_jail_set_env(j, e->key, e->val);
+               if (r)
+                       goto ERROR;
+       }
+
        // Done
        *jail = j;
        return 0;
-}
-
-static void pakfire_jail_free(struct pakfire_jail* jail) {
-       DEBUG(jail->pakfire, "Freeing jail at %p\n", jail);
 
-       // Free environment
-       for (unsigned int i = 0; jail->env[i]; i++)
-               free(jail->env[i]);
+ERROR:
+       pakfire_jail_free(j);
 
-       pakfire_unref(jail->pakfire);
-       free(jail);
+       return r;
 }
 
 struct pakfire_jail* pakfire_jail_ref(struct pakfire_jail* jail) {
index af8c42ba5a01b111a5cf3adb99adbb830d093f5a..f9dfe402885e3711cc3f1c563bf166942e52bac3 100644 (file)
@@ -47,6 +47,10 @@ static int test_env(const struct test* t) {
        // Create a new jail
        ASSERT_SUCCESS(pakfire_jail_create(&jail, t->pakfire));
 
+       // Check if the default variables are set
+       ASSERT(pakfire_jail_get_env(jail, "LANG"));
+       ASSERT(pakfire_jail_get_env(jail, "TERM"));
+
        // Fetch a non-existing environment variable
        ASSERT_NULL(pakfire_jail_get_env(jail, "VARIABLE"));