Blame view

3rdparty/c-ares-1.18.1/m4/ax_check_uts_namespace.m4 1.96 KB
73ef4ff3   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  # -*- 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