12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- # -*- Autoconf -*-
- # SYNOPSIS
- #
- # AX_CHECK_UTS_NAMESPACE
- #
- # DESCRIPTION
- #
- # This macro checks whether the local system supports Linux UTS namespaces.
- # Also requires user namespaces to be available, so that non-root users
- # can enter the namespace.
- # If so, it calls AC_DEFINE(HAVE_UTS_NAMESPACE).
- AC_DEFUN([AX_CHECK_UTS_NAMESPACE],[dnl
- AC_CACHE_CHECK([whether UTS namespaces are supported],
- ax_cv_uts_namespace,[
- AC_LANG_PUSH([C])
- AC_RUN_IFELSE([AC_LANG_SOURCE([[
- #define _GNU_SOURCE
- #include <sched.h>
- #include <signal.h>
- #include <stdio.h>
- #include <string.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- int utsfn(void *d) {
- char buffer[1024];
- const char *name = "autoconftest";
- int rc = sethostname(name, strlen(name));
- if (rc != 0) return 1;
- gethostname(buffer, 1024);
- return (strcmp(buffer, name) != 0);
- }
- char st2[1024*1024];
- int fn(void *d) {
- pid_t child;
- int rc, status;
- usleep(100000); /* synchronize by sleep */
- if (getuid() != 0) return 1;
- child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0);
- if (child < 0) return 1;
- rc = waitpid(child, &status, 0);
- if (rc <= 0) return 1;
- if (!WIFEXITED(status)) return 1;
- return WEXITSTATUS(status);
- }
- char st[1024*1024];
- int main() {
- char buffer[1024];
- int rc, status, fd;
- pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0);
- if (child < 0) return 1;
- sprintf(buffer, "/proc/%d/uid_map", child);
- fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755);
- sprintf(buffer, "0 %d 1\n", getuid());
- write(fd, buffer, strlen(buffer));
- close(fd);
- rc = waitpid(child, &status, 0);
- if (rc <= 0) return 1;
- if (!WIFEXITED(status)) return 1;
- return WEXITSTATUS(status);
- }
- ]])
- ],[ax_cv_uts_namespace=yes],[ax_cv_uts_namespace=no],[ax_cv_uts_namespace=no])
- AC_LANG_POP([C])
- ])
- if test "$ax_cv_uts_namespace" = yes; then
- AC_DEFINE([HAVE_UTS_NAMESPACE],[1],[Whether UTS namespaces are available])
- fi
- ]) # AX_CHECK_UTS_NAMESPACE
|