#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;
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;
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) {
// 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"));