Last active 3 weeks ago

Revision e00f66e4ddb988ba5827ef9053f4ab09133a081c

jail_set_iovec.md 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);
	}