Blame m4/ax_check_uts_namespace.m4

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