/* * Copyright (c) 2004, Nate Nielsen * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * Redistributions in binary form must reproduce the * above copyright notice, this list of conditions and * the following disclaimer in the documentation and/or * other materials provided with the distribution. * * The names of contributors to this software may not be * used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * * * CONTRIBUTORS * Nate Nielsen * */ /* * Original code and ideas from FreeBSD's jail.c written by * */ #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); }