quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

ares_check_uts_namespace.m4 (2124B)


      1 # -*- Autoconf -*-
      2 
      3 # SYNOPSIS
      4 #
      5 #   ARES_CHECK_UTS_NAMESPACE
      6 #
      7 # DESCRIPTION
      8 #
      9 #   This macro checks whether the local system supports Linux UTS namespaces.
     10 #   Also requires user namespaces to be available, so that non-root users
     11 #   can enter the namespace.
     12 #   If so, it calls AC_DEFINE(HAVE_UTS_NAMESPACE).
     13 #
     14 # Copyright (C) The c-ares team
     15 # SPDX-License-Identifier: MIT
     16 
     17 AC_DEFUN([ARES_CHECK_UTS_NAMESPACE],[dnl
     18  AC_CACHE_CHECK([whether UTS namespaces are supported],
     19   ares_cv_uts_namespace,[
     20   AC_LANG_PUSH([C])
     21   AC_RUN_IFELSE([AC_LANG_SOURCE([[
     22 #define _GNU_SOURCE
     23 #include <sched.h>
     24 #include <signal.h>
     25 #include <stdio.h>
     26 #include <string.h>
     27 #include <fcntl.h>
     28 #include <unistd.h>
     29 #include <sys/types.h>
     30 #include <sys/wait.h>
     31 
     32 int utsfn(void *d) {
     33   char buffer[1024];
     34   const char *name = "autoconftest";
     35   int rc = sethostname(name, strlen(name));
     36   if (rc != 0) return 1;
     37   gethostname(buffer, 1024);
     38   return (strcmp(buffer, name) != 0);
     39 }
     40 
     41 char st2[1024*1024];
     42 int fn(void *d) {
     43   pid_t child;
     44   int rc, status;
     45   usleep(100000);  /* synchronize by sleep */
     46   if (getuid() != 0) return 1;
     47   child = clone(utsfn, st2 + 1024*1024, CLONE_NEWUTS|SIGCHLD, 0);
     48   if (child < 0) return 1;
     49   rc = waitpid(child, &status, 0);
     50   if (rc <= 0) return 1;
     51   if (!WIFEXITED(status)) return 1;
     52   return WEXITSTATUS(status);
     53 }
     54 char st[1024*1024];
     55 int main() {
     56   char buffer[1024];
     57   int rc, status, fd;
     58   pid_t child = clone(fn, st + 1024*1024, CLONE_NEWUSER|SIGCHLD, 0);
     59   if (child < 0) return 1;
     60 
     61   snprintf(buffer, sizeof(buffer), "/proc/%d/uid_map", child);
     62   fd = open(buffer, O_CREAT|O_WRONLY|O_TRUNC, 0755);
     63   snprintf(buffer, sizeof(buffer), "0 %d 1\n", getuid());
     64   write(fd, buffer, strlen(buffer));
     65   close(fd);
     66 
     67   rc = waitpid(child, &status, 0);
     68   if (rc <= 0) return 1;
     69   if (!WIFEXITED(status)) return 1;
     70   return WEXITSTATUS(status);
     71 }
     72 ]])
     73   ],[ares_cv_uts_namespace=yes],[ares_cv_uts_namespace=no],[ares_cv_uts_namespace=no])
     74  AC_LANG_POP([C])
     75  ])
     76  if test "$ares_cv_uts_namespace" = yes; then
     77    AC_DEFINE([HAVE_UTS_NAMESPACE],[1],[Whether UTS namespaces are available])
     78  fi
     79 ]) # ARES_CHECK_UTS_NAMESPACE