jail_set_iovec.md
· 2.6 KiB · Markdown
Raw
```
/* clang-format off */
struct iovec iov[] = {
{ .iov_base = "path" , .iov_len = sizeof("path") },
{ .iov_base = jail_path , .iov_len = sizeof(jail_path) },
{ .iov_base = "name" , .iov_len = sizeof("name") },
{ .iov_base = jail_name , .iov_len = sizeof(jail_name) },
{ .iov_base = "host.hostname", .iov_len = sizeof("host.hostname") },
{ .iov_base = config->agent , .iov_len = SIZEOF0(config->agent) },
{ .iov_base = "ip4.addr" , .iov_len = sizeof("ip4.addr") },
{ .iov_base = &inet4_addr , .iov_len = sizeof(inet4_addr) },
{ .iov_base = "ip6.addr" , .iov_len = sizeof("ip6.addr") },
{ .iov_base = &inet6_addr , .iov_len = sizeof(inet6_addr) },
{ .iov_base = "allow.raw_sockets", .iov_len = sizeof("allow.raw_sockets") },
{ .iov_base = &raw_sockets, .iov_len = sizeof(raw_sockets) },
{ .iov_base = "persist" , .iov_len = sizeof("persist") },
{ .iov_base = &persist , .iov_len = sizeof(persist) },
{ .iov_base = "jid" , .iov_len = sizeof("jid") },
{ .iov_base = &jid , .iov_len = sizeof(jid) },
{ .iov_base = "osrelease" , .iov_len = sizeof("osrelease") },
{ .iov_base = jail_release , .iov_len = sizeof(jail_release) },
{ .iov_base = "osreldate" , .iov_len = sizeof("osreldate") },
{ .iov_base = &jail_reldate , .iov_len = sizeof(jail_reldate) },
{ .iov_base = "host.hostuuid", .iov_len = sizeof("host.hostuuid") },
{ .iov_base = jail_uuid , .iov_len = sizeof(jail_uuid) },
{ .iov_base = "errmsg" , .iov_len = sizeof("errmsg") },
{ .iov_base = jail_errmsg , .iov_len = JAIL_ERRMSGLEN }
};
/* clang-format on */
jid = jail_set(iov, sizeof(iov) / sizeof(*iov), JAIL_CREATE);
if (jid < 0) {
/* provide additional information via iovec errmsg */
if (jail_errmsg[0]) {
err(1, "child: jail_set err: %s", strerror(errno));
} else {
err(1, "child: jail_set msg: %s", jail_errmsg);
}
printf("FAILED\n");
exit(EXIT_FAILURE);
}
/* from outside the jail, we can use jail_getid(), inside it will fail
*/
jid = jail_getid(jail_name);
if (jid > 0) {
log_info("outside: jid=%d", jid);
} else {
log_error("inside: jid=%d", jid);
exit(EXIT_FAILURE);
}
/* attach and check jail_getid() again */
if (jail_attach(jid) < 0) {
err(1, "jail_attach");
}
jid = jail_getid(jail_name);
if (jid > 0) {
log_error("outside: jid=%d", jid);
exit(EXIT_FAILURE);
} else {
log_info("inside: jid=%d", jid);
}
```
/* clang-format off */
struct iovec iov[] = {
{ .iov_base = "path" , .iov_len = sizeof("path") },
{ .iov_base = jail_path , .iov_len = sizeof(jail_path) },
{ .iov_base = "name" , .iov_len = sizeof("name") },
{ .iov_base = jail_name , .iov_len = sizeof(jail_name) },
{ .iov_base = "host.hostname", .iov_len = sizeof("host.hostname") },
{ .iov_base = config->agent , .iov_len = SIZEOF0(config->agent) },
{ .iov_base = "ip4.addr" , .iov_len = sizeof("ip4.addr") },
{ .iov_base = &inet4_addr , .iov_len = sizeof(inet4_addr) },
{ .iov_base = "ip6.addr" , .iov_len = sizeof("ip6.addr") },
{ .iov_base = &inet6_addr , .iov_len = sizeof(inet6_addr) },
{ .iov_base = "allow.raw_sockets", .iov_len = sizeof("allow.raw_sockets") },
{ .iov_base = &raw_sockets, .iov_len = sizeof(raw_sockets) },
{ .iov_base = "persist" , .iov_len = sizeof("persist") },
{ .iov_base = &persist , .iov_len = sizeof(persist) },
{ .iov_base = "jid" , .iov_len = sizeof("jid") },
{ .iov_base = &jid , .iov_len = sizeof(jid) },
{ .iov_base = "osrelease" , .iov_len = sizeof("osrelease") },
{ .iov_base = jail_release , .iov_len = sizeof(jail_release) },
{ .iov_base = "osreldate" , .iov_len = sizeof("osreldate") },
{ .iov_base = &jail_reldate , .iov_len = sizeof(jail_reldate) },
{ .iov_base = "host.hostuuid", .iov_len = sizeof("host.hostuuid") },
{ .iov_base = jail_uuid , .iov_len = sizeof(jail_uuid) },
{ .iov_base = "errmsg" , .iov_len = sizeof("errmsg") },
{ .iov_base = jail_errmsg , .iov_len = JAIL_ERRMSGLEN }
};
/* clang-format on */
jid = jail_set(iov, sizeof(iov) / sizeof(*iov), JAIL_CREATE);
if (jid < 0) {
/* provide additional information via iovec errmsg */
if (jail_errmsg[0]) {
err(1, "child: jail_set err: %s", strerror(errno));
} else {
err(1, "child: jail_set msg: %s", jail_errmsg);
}
printf("FAILED\n");
exit(EXIT_FAILURE);
}
/* from outside the jail, we can use jail_getid(), inside it will fail
*/
jid = jail_getid(jail_name);
if (jid > 0) {
log_info("outside: jid=%d", jid);
} else {
log_error("inside: jid=%d", jid);
exit(EXIT_FAILURE);
}
/* attach and check jail_getid() again */
if (jail_attach(jid) < 0) {
err(1, "jail_attach");
}
jid = jail_getid(jail_name);
if (jid > 0) {
log_error("outside: jid=%d", jid);
exit(EXIT_FAILURE);
} else {
log_info("inside: jid=%d", jid);
}