diff options
| -rw-r--r-- | jails_man.html | 38 | ||||
| -rw-r--r-- | src/jstart.c | 134 | 
2 files changed, 134 insertions, 38 deletions
diff --git a/jails_man.html b/jails_man.html deleted file mode 100644 index 6fc953b..0000000 --- a/jails_man.html +++ /dev/null @@ -1,38 +0,0 @@ -<HTML> -<HEAD> -<TITLE>jails(8)</TITLE> -<link rev="made" href="mailto:wosch@FreeBSD.ORG"> -<META name="robots" content="nofollow"> -<meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"> -<link rel="stylesheet" type="text/css" href="/nielsen/style.css"> -</HEAD> -<BODY BGCOLOR="#FFFFFF" TEXT="#000000"> - -<H1>Man Page: jails(8)</H1><PRE> -jails(8)                  BSD System Manager's Manual                 jails(8) - -<B>NAME</B> -     <B>jails</B> - lists hostnames of all running jails on the system - -<B>SYNOPSIS</B> -     <B>jails</B> - -<B>DESCRIPTION</B> -     The <B>jails</B> command will print a list of all the various jails running on -     your system. The hostnames of those jails are printed. The list is not -     ordered. - -<B>NOTES</B> -     This command is intended only for compatibility with earlier versions of -     the <I>jailutils</I> package. The <U>jls(8)</U> command is a better source of jail -     information. - -<B>SEE ALSO</B> -     <U>jls(8)</U>, <U>jail(8)</U>, <U>jps(8)</U> - -<B>AUTHOR</B> -     Nate Nielsen <<A HREF="mailto:nielsen@memberwebs.com">nielsen@memberwebs.com</A>> - -jails                            May 18, 2004                            jails -<H6>Copyright, N. Nielsen   [ <a href='./'>back</a> | <a href='../../'>home</a> ]</h6></BODY> -</HTML> diff --git a/src/jstart.c b/src/jstart.c new file mode 100644 index 0000000..b244aa4 --- /dev/null +++ b/src/jstart.c @@ -0,0 +1,134 @@ + +/* A lot of code from jail.c in */ +/* TODO: Attribute properly */ + +#include <sys/types.h> +#include <sys/param.h> +#include <sys/jail.h> + +#include <netinet/in.h> +#include <arpa/inet.h> + +#include <paths.h> +#include <stdio.h> +#include <err.h> +#include <unistd.h> +#include <limits.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(); +static void check_command(const char* cmd); +static void run_command(const char* cmd, char* args[]); + +int main(int argc, char* argv[]) +{ +  int ch; +  struct jail j; +  struct in_addr in; + +  argc--; +  argv++; + +  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 */ +  if(jail(&j) != 0) +    err(1, "couldn't create jail"); + +  argc -= 3; +  argv += 3; + +  if(argc == 0) +  { +    check_command(START_SCRIPT); +    run_command(START_ARGS[0], START_ARGS); +  } + +  else +  { +    check_command(argv[0]); +    run_command(argv[0], argv); +  } + +  return 0; +} + +static void usage() +{ +  fprintf(stderr, "usage: jstart path hostname ip-number [command ...]\n"); +  exit(2); +} + +static void check_command(const char* cmd) +{ +  struct stat sb; + +  if(stat(cmd, &sb) == -1) +  { +    if(errno == EACCES || errno == ELOOP || errno == ENAMETOOLONG || +       errno == ENOENT || errno == ENOTDIR) +    { +      err(1, "can't execute in jail: %s", cmd); +    } + +    err(1, "couldn't stat file: %s", cmd); +  } + +  if(!(sb.st_mode & S_IFREG)) +    errx(1, "not a regular file: %s", cmd); + +  if(sb.st_uid != 0) +    errx(1, "not owned by root: %s", cmd); +} + +static void run_command(const char* cmd, char* args[]) +{ +  char* env[5]; +  char* t; +  int j; + +  memset(env, 0, sizeof(env)); + +#define MAKE_ENV_VAR(n)                         \ +  t = getenv(n);                                \ +  if(t != NULL)                                 \ +  {                                             \ +    env[j] = alloca(strlen(n) + 2 + strlen(t)); \ +    sprintf(env[j], "%s=%s", (char*)(n), t);    \ +    j++;                                        \ +  } + +  /* Prepare an environment for the cmd */ +  env[0] = "PATH=" _PATH_STDPATH; +  j = 1; + +  MAKE_ENV_VAR("TERM"); +  MAKE_ENV_VAR("COLUMNS"); +  MAKE_ENV_VAR("LINES"); + +  if(execve(cmd, args, env) != 0) +    err("couldn't execute command: %s", cmd); +} +  | 
