From 9362aa105357f0aeadf04cdc7c6a8a3802260c4e Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Tue, 18 May 2004 19:05:57 +0000 Subject: Added basic jstart functionality for 4.x --- jails_man.html | 38 ---------------- src/jstart.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+), 38 deletions(-) delete mode 100644 jails_man.html create mode 100644 src/jstart.c 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 @@ - - -jails(8) - - - - - - - -

Man Page: jails(8)

-jails(8)                  BSD System Manager's Manual                 jails(8)
-
-NAME
-     jails - lists hostnames of all running jails on the system
-
-SYNOPSIS
-     jails
-
-DESCRIPTION
-     The jails 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.
-
-NOTES
-     This command is intended only for compatibility with earlier versions of
-     the jailutils package. The jls(8) command is a better source of jail
-     information.
-
-SEE ALSO
-     jls(8), jail(8), jps(8)
-
-AUTHOR
-     Nate Nielsen <nielsen@memberwebs.com>
-
-jails                            May 18, 2004                            jails
-
Copyright, N. Nielsen   [ back | home ]
- 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 +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#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); +} + -- cgit v1.2.3