PKG_CHECK_MODULES([LZMA], [liblzma])
PKG_CHECK_MODULES([MAGIC], [libmagic])
PKG_CHECK_MODULES([MOUNT], [mount])
+PKG_CHECK_MODULES([NL3], [libnl-3.0])
+PKG_CHECK_MODULES([NL3_ROUTE], [libnl-route-3.0])
PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.1.1])
PKG_CHECK_MODULES([PCRE2], [libpcre2-8])
PKG_CHECK_MODULES([SECCOMP], [libseccomp])
#include <sys/types.h>
#include <sys/wait.h>
+// libnl3
+#include <net/if.h>
+#include <netlink/route/link.h>
+
// libseccomp
#include <seccomp.h>
return 0;
}
+// Networking
+
+static int pakfire_jail_setup_loopback(struct pakfire_jail* jail) {
+ struct nl_sock* nl = NULL;
+ struct nl_cache* cache = NULL;
+ struct rtnl_link* link = NULL;
+ struct rtnl_link* change = NULL;
+ int r;
+
+ DEBUG(jail->pakfire, "Setting up loopback...\n");
+
+ // Allocate a netlink socket
+ nl = nl_socket_alloc();
+ if (!nl) {
+ ERROR(jail->pakfire, "Could not allocate a netlink socket: %m\n");
+ r = 1;
+ goto ERROR;
+ }
+
+ // Connect the socket
+ r = nl_connect(nl, NETLINK_ROUTE);
+ if (r) {
+ ERROR(jail->pakfire, "Could not connect netlink socket: %s\n", nl_geterror(r));
+ goto ERROR;
+ }
+
+ // Allocate the netlink cache
+ r = rtnl_link_alloc_cache(nl, AF_UNSPEC, &cache);
+ if (r < 0) {
+ ERROR(jail->pakfire, "Unable to allocate netlink cache: %s\n", nl_geterror(r));
+ goto ERROR;
+ }
+
+ // Fetch loopback interface
+ link = rtnl_link_get_by_name(cache, "lo");
+ if (!link) {
+ ERROR(jail->pakfire, "Could not find lo interface. Ignoring.\n");
+ r = 0;
+ goto ERROR;
+ }
+
+ // Allocate a new link
+ change = rtnl_link_alloc();
+ if (!change) {
+ ERROR(jail->pakfire, "Could not allocate change link\n");
+ r = 1;
+ goto ERROR;
+ }
+
+ // Set the link to UP
+ rtnl_link_set_flags(change, IFF_UP);
+
+ // Apply any changes
+ r = rtnl_link_change(nl, link, change, 0);
+ if (r) {
+ ERROR(jail->pakfire, "Unable to activate loopback: %s\n", nl_geterror(r));
+ goto ERROR;
+ }
+
+ // Success
+ r = 0;
+
+ERROR:
+ if (nl)
+ nl_socket_free(nl);
+
+ return r;
+}
+
// UID/GID Mapping
static int pakfire_jail_setup_uid_mapping(struct pakfire_jail* jail, pid_t pid) {
}
}
+ // Setup networking
+ if (!pakfire_jail_exec_has_flag(ctx, PAKFIRE_JAIL_HAS_NETWORKING)) {
+ r = pakfire_jail_setup_loopback(jail);
+ if (r)
+ return 1;
+ }
+
// Set nice level
if (jail->nice) {
DEBUG(jail->pakfire, "Setting nice level to %d\n", jail->nice);