8#include <sys/utsname.h>
10int main(
int argc,
char** argv) {
11 setvbuf(stdout, NULL, _IONBF, 0);
12 ns_page = (size_t)sysconf(_SC_PAGESIZE);
13 if (argc > 1 && !strcmp(argv[1],
"uts-exec"))
14 return ns_exec(argc, argv);
18 } families[] = {{
"names", ns_names},
19 {
"membership", ns_membership},
21 {
"lifetime", ns_lifetime},
22 {
"admission", ns_admission}};
26 for (
size_t i = 0; i <
sizeof(families) /
sizeof(families[0]); ++i) {
27 if (argc == 2 && strcmp(argv[1],
"all") && strcmp(argv[1], families[i].name))
30 struct utsname before, after;
32 if (uname(&before) || ns_path_identity(
"/proc/thread-self/ns/uts", &original))
34 printf(
"UTS-NAMESPACE-CONTRACT: BEGIN %s\n", families[i].name);
39 if (unshare(CLONE_NEWUTS)) {
40 perror(
"family unshare");
43 result = families[i].run();
46 _exit(result ? 1 : 0);
48 int status = child < 0 ? -1 : ns_reap(child, 45000);
49 if (uname(&after) || memcmp(&before, &after,
sizeof(before)) ||
50 ns_path_identity(
"/proc/thread-self/ns/uts", &
final) || !ns_same(original,
final)) {
51 fprintf(stderr,
"supervisor namespace changed after %s\n", families[i].name);
54 printf(
"UTS-NAMESPACE-CONTRACT: %s %s status=%d\n", status ?
"FAIL" :
"PASS", families[i].name,
61 puts(
"UTS-NAMESPACE-CONTRACT: END PASS");