quickjs-tart

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

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