linux/include/linux/user_namespace.h
<<
>>
Prefs
   1#ifndef _LINUX_USER_NAMESPACE_H
   2#define _LINUX_USER_NAMESPACE_H
   3
   4#include <linux/kref.h>
   5#include <linux/nsproxy.h>
   6#include <linux/sched.h>
   7#include <linux/err.h>
   8
   9#define UID_GID_MAP_MAX_EXTENTS 5
  10
  11struct uid_gid_map {    /* 64 bytes -- 1 cache line */
  12        u32 nr_extents;
  13        struct uid_gid_extent {
  14                u32 first;
  15                u32 lower_first;
  16                u32 count;
  17        } extent[UID_GID_MAP_MAX_EXTENTS];
  18};
  19
  20struct user_namespace {
  21        struct uid_gid_map      uid_map;
  22        struct uid_gid_map      gid_map;
  23        struct uid_gid_map      projid_map;
  24        struct kref             kref;
  25        struct user_namespace   *parent;
  26        kuid_t                  owner;
  27        kgid_t                  group;
  28        unsigned int            proc_inum;
  29};
  30
  31extern struct user_namespace init_user_ns;
  32
  33#ifdef CONFIG_USER_NS
  34
  35static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
  36{
  37        if (ns)
  38                kref_get(&ns->kref);
  39        return ns;
  40}
  41
  42extern int create_user_ns(struct cred *new);
  43extern int unshare_userns(unsigned long unshare_flags, struct cred **new_cred);
  44extern void free_user_ns(struct kref *kref);
  45
  46static inline void put_user_ns(struct user_namespace *ns)
  47{
  48        if (ns)
  49                kref_put(&ns->kref, free_user_ns);
  50}
  51
  52struct seq_operations;
  53extern struct seq_operations proc_uid_seq_operations;
  54extern struct seq_operations proc_gid_seq_operations;
  55extern struct seq_operations proc_projid_seq_operations;
  56extern ssize_t proc_uid_map_write(struct file *, const char __user *, size_t, loff_t *);
  57extern ssize_t proc_gid_map_write(struct file *, const char __user *, size_t, loff_t *);
  58extern ssize_t proc_projid_map_write(struct file *, const char __user *, size_t, loff_t *);
  59#else
  60
  61static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
  62{
  63        return &init_user_ns;
  64}
  65
  66static inline int create_user_ns(struct cred *new)
  67{
  68        return -EINVAL;
  69}
  70
  71static inline int unshare_userns(unsigned long unshare_flags,
  72                                 struct cred **new_cred)
  73{
  74        if (unshare_flags & CLONE_NEWUSER)
  75                return -EINVAL;
  76        return 0;
  77}
  78
  79static inline void put_user_ns(struct user_namespace *ns)
  80{
  81}
  82
  83#endif
  84
  85#endif /* _LINUX_USER_H */
  86