/* A lot of code from jail.c in */ /* TODO: Attribute properly */ #include #include #include #include #include #include #include #include #include #include #include "util.h" #ifdef HAVE_CONFIG_H #include "../config.h" #endif #define START_SCRIPT "/etc/rc" static char* START_ARGS[] = { _PATH_BSHELL, START_SCRIPT }; static void usage(); int main(int argc, char* argv[]) { int ch, jid; struct jail j; int printjid = 0; struct in_addr in; while((ch = getopt(argc, argv, "i")) != -1) { switch(ch) { case 'i': printjid = 1; break; case '?': default: usage(); } } argc -= optind; argv += optind; if(argc < 3) usage(); if(getuid() != 0) errx(1, "must be run as root"); if(chdir(argv[0]) != 0) err(1, "couldn't change to jail directory: %s", argv[0]); if(inet_aton(argv[2], &in) != 1) errx(1, "invalid ip address: %s", argv[2]); memset(&j, 0, sizeof(j)); j.version = 0; j.path = argv[0]; j.hostname = argv[1]; j.ip_number = ntohl(in.s_addr); /* Here's where we actually go into the jail */ jid = jail(&j); if(jid == -1) err(1, "couldn't create jail"); if(printjid) { printf("%d\n", jid); fflush(stdout); } argc -= 3; argv += 3; if(argc == 0) { if(!check_jail_command(NULL, START_SCRIPT)) exit(1); run_jail_command(NULL, START_ARGS[0], START_ARGS, JAIL_RUN_CONSOLE | JAIL_RUN_STDOUT); } else { if(!check_jail_command(NULL, argv[0])) exit(1); run_jail_command(NULL, argv[0], argv, JAIL_RUN_CONSOLE | JAIL_RUN_STDOUT); } return 0; } static void usage() { fprintf(stderr, "usage: jstart [-i] path hostname ip-number [command ...]\n"); exit(2); }