summaryrefslogtreecommitdiff
path: root/srcx/jkill.c
diff options
context:
space:
mode:
authorStef Walter <stef@memberwebs.com>2004-05-19 17:27:00 +0000
committerStef Walter <stef@memberwebs.com>2004-05-19 17:27:00 +0000
commite70562b7b93e79372e230738038c62cf80436088 (patch)
treecd06dcfec1089712026e33643547c46d85d7820a /srcx/jkill.c
parent571095097eb025a6f1a4fbc24737084a1e367a9f (diff)
Proper preparing of kvm for jail
Diffstat (limited to 'srcx/jkill.c')
-rw-r--r--srcx/jkill.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/srcx/jkill.c b/srcx/jkill.c
index 4311ed8..953095e 100644
--- a/srcx/jkill.c
+++ b/srcx/jkill.c
@@ -84,15 +84,17 @@ static void usage_jail(const char* name);
int main(int argc, char* argv[])
{
- int r, jid;
- int ret = 0;
+ struct xprison* sxp = NULL;
+ struct xprison* xp = NULL;
+ size_t len;
+ int jid, r, ret = 0;
pid_t child;
/*
* When running in a jail we do things slightly
* differently, and accept different args
*/
- if(running_in_jail())
+ if(running_in_jail() != 0)
{
parse_jail_opts(argc, argv);
@@ -114,17 +116,23 @@ int main(int argc, char* argv[])
argc -= optind;
argv += optind;
+ len = get_jail_sysctl(&sxp);
+
/* For each jail */
for(; argc > 0; argc--, argv++)
{
- jid = translate_jail_name(argv[0]);
- if(jid == -1)
+ xp = find_jail(str, len, sxp);
+
+ if(xp == NULL)
{
warnx("unknown jail host name: %s", argv[0]);
ret = 1;
continue;
}
+ /* This makes sure we can use kvm funcs in jail */
+ kvm_prepare_jail(xp);
+
/*
* We fork and the child goes into the jail and
* does the dirty work. Unless in debug mode where
@@ -141,6 +149,11 @@ int main(int argc, char* argv[])
/* The child */
case 0:
#endif
+ jid = xp->pri_id;
+
+ /* Always free jail info before going into jail */
+ free_jail_sysctl(len, sxp);
+
if(jail_attach(jid) == -1)
err(1, "couldn't attach to jail");
@@ -164,6 +177,7 @@ int main(int argc, char* argv[])
argv++;
}
+ free_jail_sysctl(len, sxp);
return ret;
}
}
@@ -304,7 +318,7 @@ static int kill_jail(const char* jail)
int cmdargs = JAIL_RUN_CONSOLE;
/* Open the kernel interface */
- kd = open_kvm_handle(jail, errbuf);
+ kd = kvm_openfiles(_PATH_DEVNULL, _PATH_DEVNULL, NULL, O_RDONLY, errbuf);
if(kd == NULL)
errx(1, "couldn't connect to kernel: %s", errbuf);