#include #include #include #include #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(running_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"); for(i = 0; i < (len / sizeof(*xp)); i++) printf("%s\n", xp[i].pr_host); free(sxp); }