/* Entering namespaces for test case isolation.
   Copyright (C) 2016-2018 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef SUPPORT_NAMESPACE_H
#define SUPPORT_NAMESPACE_H

#include <stdbool.h>
#include <sys/cdefs.h>

__BEGIN_DECLS

/* Attempts to become root (or acquire root-like privileges), possibly
   with the help of user namespaces.  Return true if (restricted) root
   privileges could be attained in some way.  Print diagnostics to
   standard output.

   Note that this function generally has to be called before a process
   becomes multi-threaded, otherwise it may fail with insufficient
   privileges on systems which would support this operation for
   single-threaded processes.  */
bool support_become_root (void);

/* Return true if this process can perform a chroot operation.  In
   general, this is only possible if support_become_root has been
   called.  Note that the actual test is performed in a subprocess,
   after fork, so that the file system root of the original process is
   not changed.  */
bool support_can_chroot (void);

/* Enter a network namespace (and a UTS namespace if possible) and
   configure the loopback interface.  Return true if a network
   namespace could be created.  Print diagnostics to standard output.
   If a network namespace could be created, but networking in it could
   not be configured, terminate the process.  It is recommended to
   call support_become_root before this function so that the process
   has sufficient privileges.  */
bool support_enter_network_namespace (void);

/* Enter a mount namespace and mark / as private (not shared).  If
   this function returns true, mount operations in this process will
   not affect the host system afterwards.  */
bool support_enter_mount_namespace (void);

/* Return true if support_enter_network_namespace managed to enter a
   UTS namespace.  */
bool support_in_uts_namespace (void);

/* Invoke CALLBACK (CLOSURE) in a subprocess created using fork.
   Terminate the calling process if the subprocess exits with a
   non-zero exit status.  */
void support_isolate_in_subprocess (void (*callback) (void *), void *closure);

/* Describe the setup of a chroot environment, for
   support_chroot_create below.  */
struct support_chroot_configuration
{
  /* File contents.  The files are not created if the field is
     NULL.  */
  const char *resolv_conf;      /* /etc/resolv.conf.  */
  const char *hosts;            /* /etc/hosts.  */
  const char *host_conf;        /* /etc/host.conf.  */
};

/* The result of the creation of a chroot.  */
struct support_chroot
{
  /* Path information.  All these paths are relative to the parent
     chroot.  */

  /* Path to the chroot directory.  */
  char *path_chroot;

  /* Paths to files in the chroot.  These are absolute and outside of
     the chroot.  */
  char *path_resolv_conf;       /* /etc/resolv.conf.  */
  char *path_hosts;             /* /etc/hosts.  */
  char *path_host_conf;         /* /etc/host.conf.  */
};

/* Create a chroot environment.  The returned data should be freed
   using support_chroot_free below.  The files will be deleted when
   the process exits.  This function does not enter the chroot.  */
struct support_chroot *support_chroot_create
  (struct support_chroot_configuration);

/* Deallocate the chroot information created by
   support_chroot_create.  */
void support_chroot_free (struct support_chroot *);

__END_DECLS

#endif
