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);
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;
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;
// 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: