From 887d8b57c4aa291919c8eec6b2af5a5f5259ac6d Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Mon, 17 May 2004 17:52:45 +0000 Subject: Initial 5.2.x files --- srcx/jails.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 srcx/jails.c (limited to 'srcx/jails.c') diff --git a/srcx/jails.c b/srcx/jails.c new file mode 100644 index 0000000..aac6a31 --- /dev/null +++ b/srcx/jails.c @@ -0,0 +1,77 @@ + +#include +#include +#include +#include +#include +#include + +#include "util.h" + +#ifdef HAVE_CONFIG_H +#include "../config.h" +#endif + +static void usage(); +static void list_jails(); + +int main(int argc, char* argv[]) +{ + if(argc > 1) + usage(); + + if(in_jail()) + errx(1, "can't run from inside jail"); + + list_jails(); + return 0; +} + +static void usage() +{ + fprintf(stderr, "usage: jails \n"); + exit(2); +} + +static void list_jails() +{ + struct xprison* sxp; + struct xprison* xp; + size_t len, i; + + /* ... otherwise it's a name */ + + if(sysctlbyname("security.jail.list", NULL, &len, NULL, 0) == -1) + err(1, "couldn't list jails"); + +retry: + + if(len <= 0) + return; + + sxp = xp = calloc(len, 1); + if(sxp == NULL) + err(1, "out of memory"); + + if(sysctlbyname("security.jail.list", xp, &len, NULL, 0) == -1) + { + if(errno == ENOMEM) + { + free(sxp); + goto retry; + } + + err(1, "couldn't list jails"); + } + + if(len < sizeof(*xp) || len % sizeof(*xp) || xp->pr_version != XPRISON_VERSION) + errx(1, "kernel and userland out of sync"); + + jid = -1; + + for(i = 0; i < (len / sizeof(*xp)); i++) + printf("%s\n", xp->pr_host); + + free(sxp); +} + -- cgit v1.2.3