1dnl #
2dnl # 2.6.38 API change
3dnl # ns_capable() was introduced
4dnl #
5AC_DEFUN([ZFS_AC_KERNEL_SRC_NS_CAPABLE], [
6	ZFS_LINUX_TEST_SRC([ns_capable], [
7		#include <linux/capability.h>
8	],[
9		ns_capable((struct user_namespace *)NULL, CAP_SYS_ADMIN);
10	])
11])
12
13AC_DEFUN([ZFS_AC_KERNEL_NS_CAPABLE], [
14	AC_MSG_CHECKING([whether ns_capable exists])
15	ZFS_LINUX_TEST_RESULT([ns_capable], [
16		AC_MSG_RESULT(yes)
17	],[
18		ZFS_LINUX_TEST_ERROR([ns_capable()])
19	])
20])
21
22dnl #
23dnl # 4.10 API change
24dnl # has_capability() was exported.
25dnl #
26AC_DEFUN([ZFS_AC_KERNEL_SRC_HAS_CAPABILITY], [
27	ZFS_LINUX_TEST_SRC([has_capability], [
28		#include <linux/capability.h>
29	],[
30		struct task_struct *task = NULL;
31		int cap = 0;
32		bool result __attribute__ ((unused));
33
34		result = has_capability(task, cap);
35	])
36])
37
38AC_DEFUN([ZFS_AC_KERNEL_HAS_CAPABILITY], [
39	AC_MSG_CHECKING([whether has_capability() is available])
40	ZFS_LINUX_TEST_RESULT_SYMBOL([has_capability],
41	    [has_capability], [kernel/capability.c], [
42		AC_MSG_RESULT(yes)
43		AC_DEFINE(HAVE_HAS_CAPABILITY, 1, [has_capability() is available])
44	],[
45		AC_MSG_RESULT(no)
46	])
47])
48
49dnl #
50dnl # 2.6.39 API change
51dnl # struct user_namespace was added to struct cred_t as cred->user_ns member
52dnl #
53AC_DEFUN([ZFS_AC_KERNEL_SRC_CRED_USER_NS], [
54	ZFS_LINUX_TEST_SRC([cred_user_ns], [
55		#include <linux/cred.h>
56	],[
57		struct cred cr;
58		cr.user_ns = (struct user_namespace *)NULL;
59	])
60])
61
62AC_DEFUN([ZFS_AC_KERNEL_CRED_USER_NS], [
63	AC_MSG_CHECKING([whether cred_t->user_ns exists])
64	ZFS_LINUX_TEST_RESULT([cred_user_ns], [
65		AC_MSG_RESULT(yes)
66	],[
67		ZFS_LINUX_TEST_ERROR([cred_t->user_ns()])
68	])
69])
70
71dnl #
72dnl # 3.4 API change
73dnl # kuid_has_mapping() and kgid_has_mapping() were added to distinguish
74dnl # between internal kernel uids/gids and user namespace uids/gids.
75dnl #
76AC_DEFUN([ZFS_AC_KERNEL_SRC_KUID_HAS_MAPPING], [
77	ZFS_LINUX_TEST_SRC([kuid_has_mapping], [
78		#include <linux/uidgid.h>
79	],[
80		kuid_has_mapping((struct user_namespace *)NULL, KUIDT_INIT(0));
81		kgid_has_mapping((struct user_namespace *)NULL, KGIDT_INIT(0));
82	])
83])
84
85AC_DEFUN([ZFS_AC_KERNEL_KUID_HAS_MAPPING], [
86	AC_MSG_CHECKING([whether kuid_has_mapping/kgid_has_mapping exist])
87	ZFS_LINUX_TEST_RESULT([kuid_has_mapping], [
88		AC_MSG_RESULT(yes)
89	],[
90		ZFS_LINUX_TEST_ERROR([kuid_has_mapping()])
91	])
92])
93
94AC_DEFUN([ZFS_AC_KERNEL_SRC_USERNS_CAPABILITIES], [
95	ZFS_AC_KERNEL_SRC_NS_CAPABLE
96	ZFS_AC_KERNEL_SRC_HAS_CAPABILITY
97	ZFS_AC_KERNEL_SRC_CRED_USER_NS
98	ZFS_AC_KERNEL_SRC_KUID_HAS_MAPPING
99])
100
101AC_DEFUN([ZFS_AC_KERNEL_USERNS_CAPABILITIES], [
102	ZFS_AC_KERNEL_NS_CAPABLE
103	ZFS_AC_KERNEL_HAS_CAPABILITY
104	ZFS_AC_KERNEL_CRED_USER_NS
105	ZFS_AC_KERNEL_KUID_HAS_MAPPING
106])
107