ares_check_user_namespace.m4 (1533B)
1 # -*- Autoconf -*- 2 3 # SYNOPSIS 4 # 5 # ARES_CHECK_USER_NAMESPACE 6 # 7 # DESCRIPTION 8 # 9 # This macro checks whether the local system supports Linux user namespaces. 10 # If so, it calls AC_DEFINE(HAVE_USER_NAMESPACE). 11 # 12 # Copyright (C) The c-ares team 13 # SPDX-License-Identifier: MIT 14 15 AC_DEFUN([ARES_CHECK_USER_NAMESPACE],[dnl 16 AC_CACHE_CHECK([whether user namespaces are supported], 17 ares_cv_user_namespace,[ 18 AC_LANG_PUSH([C]) 19 AC_RUN_IFELSE([AC_LANG_SOURCE([[ 20 #define _GNU_SOURCE 21 #include <fcntl.h> 22 #include <sched.h> 23 #include <signal.h> 24 #include <stdio.h> 25 #include <string.h> 26 #include <sys/types.h> 27 #include <sys/wait.h> 28 29 int userfn(void *d) { 30 usleep(100000); /* synchronize by sleep */ 31 return (getuid() != 0); 32 } 33 char userst[1024*1024]; 34 int main() { 35 char buffer[1024]; 36 int rc, status, fd; 37 pid_t child = clone(userfn, userst + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0); 38 if (child < 0) return 1; 39 40 snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child); 41 fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755); 42 snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid()); 43 write(fd, buffer, strlen(buffer)); 44 close(fd); 45 46 rc = waitpid(child, &status, 0); 47 if (rc <= 0) return 1; 48 if (!WIFEXITED(status)) return 1; 49 return WEXITSTATUS(status); 50 } 51 ]])],[ares_cv_user_namespace=yes],[ares_cv_user_namespace=no],[ares_cv_user_namespace=no]) 52 AC_LANG_POP([C]) 53 ]) 54 if test "$ares_cv_user_namespace" = yes; then 55 AC_DEFINE([HAVE_USER_NAMESPACE],[1],[Whether user namespaces are available]) 56 fi 57 ]) # ARES_CHECK_USER_NAMESPACE