1 /*
2  * Copyright (c) 1997 Andrew G Morgan <morgan@kernel.org>
3  *
4  * This file contains internal definitions for the various functions in
5  * this small capability library.
6  */
7 
8 #ifndef LIBCAP_H
9 #define LIBCAP_H
10 
11 #include <errno.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <stdint.h>
16 #include <sys/capability.h>
17 
18 #ifndef __u8
19 #define __u8    uint8_t
20 #endif /* __8 */
21 
22 #ifndef __u32
23 #define __u32   uint32_t
24 #endif /* __u32 */
25 
26 /* include the names for the caps and a definition of __CAP_BITS */
27 #include "cap_names.h"
28 
29 #ifndef _LINUX_CAPABILITY_U32S_1
30 # define _LINUX_CAPABILITY_U32S_1          1
31 #endif /* ndef _LINUX_CAPABILITY_U32S */
32 
33 /*
34  * Do we match the local kernel?
35  */
36 
37 #if !defined(_LINUX_CAPABILITY_VERSION)
38 
39 # error Kernel <linux/capability.h> does not support library
40 # error file "libcap.h" --> fix and recompile libcap
41 
42 #elif !defined(_LINUX_CAPABILITY_VERSION_2)
43 
44 # warning Kernel <linux/capability.h> does not support 64-bit capabilities
45 # warning and libcap is being built with no support for 64-bit capabilities
46 
47 # ifndef _LINUX_CAPABILITY_VERSION_1
48 #  define _LINUX_CAPABILITY_VERSION_1 0x19980330
49 # endif
50 
51 # _LIBCAP_CAPABILITY_VERSION  _LINUX_CAPABILITY_VERSION_1
52 # _LIBCAP_CAPABILITY_U32S     _LINUX_CAPABILITY_U32S_1
53 
54 #elif defined(_LINUX_CAPABILITY_VERSION_3)
55 
56 # if (_LINUX_CAPABILITY_VERSION_3 != 0x20080522)
57 #  error Kernel <linux/capability.h> v3 does not match library
58 #  error file "libcap.h" --> fix and recompile libcap
59 # else
60 #  define _LIBCAP_CAPABILITY_VERSION  _LINUX_CAPABILITY_VERSION_3
61 #  define _LIBCAP_CAPABILITY_U32S     _LINUX_CAPABILITY_U32S_3
62 # endif
63 
64 #elif (_LINUX_CAPABILITY_VERSION_2 != 0x20071026)
65 
66 # error Kernel <linux/capability.h> does not match library
67 # error file "libcap.h" --> fix and recompile libcap
68 
69 #else
70 
71 # define _LIBCAP_CAPABILITY_VERSION  _LINUX_CAPABILITY_VERSION_2
72 # define _LIBCAP_CAPABILITY_U32S     _LINUX_CAPABILITY_U32S_2
73 
74 #endif
75 
76 #undef _LINUX_CAPABILITY_VERSION
77 #undef _LINUX_CAPABILITY_U32S
78 
79 /*
80  * This is a pointer to a struct containing three consecutive
81  * capability sets in the order of the cap_flag_t type: the are
82  * effective,inheritable and permitted.  This is the type that the
83  * user-space routines think of as 'internal' capabilities - this is
84  * the type that is passed to the kernel with the system calls related
85  * to processes.
86  */
87 
88 #if defined(VFS_CAP_REVISION_MASK) && !defined(VFS_CAP_U32)
89 # define VFS_CAP_U32_1                   1
90 # define XATTR_CAPS_SZ_1                 (sizeof(__le32)*(1 + 2*VFS_CAP_U32_1))
91 # define VFS_CAP_U32                     VFS_CAP_U32_1
92 struct _cap_vfs_cap_data {
93     __le32 magic_etc;
94     struct {
95 	__le32 permitted;
96 	__le32 inheritable;
97     } data[VFS_CAP_U32_1];
98 };
99 # define vfs_cap_data                    _cap_vfs_cap_data
100 #endif
101 
102 #ifndef CAP_TO_INDEX
103 # define CAP_TO_INDEX(x)     ((x) >> 5)  /* 1 << 5 == bits in __u32 */
104 #endif /* ndef CAP_TO_INDEX */
105 
106 #ifndef CAP_TO_MASK
107 # define CAP_TO_MASK(x)      (1 << ((x) & 31))
108 #endif /* ndef CAP_TO_MASK */
109 
110 #define NUMBER_OF_CAP_SETS      3   /* effective, inheritable, permitted */
111 #define __CAP_BLKS   (_LIBCAP_CAPABILITY_U32S)
112 #define CAP_SET_SIZE (__CAP_BLKS * sizeof(__u32))
113 
114 #define CAP_T_MAGIC 0xCA90D0
115 struct _cap_struct {
116     struct __user_cap_header_struct head;
117     union {
118 	struct __user_cap_data_struct set;
119 	__u32 flat[NUMBER_OF_CAP_SETS];
120     } u[_LIBCAP_CAPABILITY_U32S];
121 };
122 
123 /* the maximum bits supportable */
124 #define __CAP_MAXBITS (__CAP_BLKS * 32)
125 
126 /* string magic for cap_free */
127 #define CAP_S_MAGIC 0xCA95D0
128 
129 /*
130  * kernel API cap set abstraction
131  */
132 
133 #define raise_cap(x,set)   u[(x)>>5].flat[set]       |=  (1<<((x)&31))
134 #define lower_cap(x,set)   u[(x)>>5].flat[set]       &= ~(1<<((x)&31))
135 #define isset_cap(y,x,set) ((y)->u[(x)>>5].flat[set] &   (1<<((x)&31)))
136 
137 /*
138  * Private definitions for internal use by the library.
139  */
140 
141 #define __libcap_check_magic(c,magic) ((c) && *(-1+(__u32 *)(c)) == (magic))
142 #define good_cap_t(c)        __libcap_check_magic(c, CAP_T_MAGIC)
143 #define good_cap_string(c)   __libcap_check_magic(c, CAP_S_MAGIC)
144 
145 /*
146  * These match CAP_DIFFERS() expectations
147  */
148 #define LIBCAP_EFF   (1 << CAP_EFFECTIVE)
149 #define LIBCAP_INH   (1 << CAP_INHERITABLE)
150 #define LIBCAP_PER   (1 << CAP_PERMITTED)
151 
152 /*
153  * library debugging
154  */
155 #ifdef DEBUG
156 
157 #include <stdio.h>
158 # define _cap_debug(f, x...)  do { \
159     fprintf(stderr, "%s(%s:%d): ", __FUNCTION__, __FILE__, __LINE__); \
160     fprintf(stderr, f, ## x); \
161     fprintf(stderr, "\n"); \
162 } while (0)
163 
164 # define _cap_debugcap(s, c, set) do { \
165     unsigned _cap_index; \
166     fprintf(stderr, "%s(%s:%d): %s", __FUNCTION__, __FILE__, __LINE__, s); \
167     for (_cap_index=_LIBCAP_CAPABILITY_U32S; _cap_index-- > 0; ) { \
168        fprintf(stderr, "%08x", (c).u[_cap_index].flat[set]); \
169     } \
170     fprintf(stderr, "\n"); \
171 } while (0)
172 
173 #else /* !DEBUG */
174 
175 # define _cap_debug(f, x...)
176 # define _cap_debugcap(s, c, set)
177 
178 #endif /* DEBUG */
179 
180 extern char *_libcap_strdup(const char *text);
181 
182 /*
183  * These are semi-public prototypes, they will only be defined in
184  * <sys/capability.h> if _POSIX_SOURCE is not #define'd, so we
185  * place them here too.
186  */
187 
188 extern int capset(cap_user_header_t header, cap_user_data_t data);
189 extern int capget(cap_user_header_t header, const cap_user_data_t data);
190 extern int capgetp(pid_t pid, cap_t cap_d);
191 extern int capsetp(pid_t pid, cap_t cap_d);
192 
193 /* prctl based API for altering character of current process */
194 #define PR_GET_KEEPCAPS    7
195 #define PR_SET_KEEPCAPS    8
196 #define PR_CAPBSET_READ   23
197 #define PR_CAPBSET_DROP   24
198 #define PR_GET_SECUREBITS 27
199 #define PR_SET_SECUREBITS 28
200 
201 /*
202  * The library compares sizeof() with integer return values. To avoid
203  * signed/unsigned comparisons, leading to unfortunate
204  * misinterpretations of -1, we provide a convenient cast-to-signed-integer
205  * version of sizeof().
206  */
207 #define ssizeof(x) ((ssize_t) sizeof(x))
208 
209 #endif /* LIBCAP_H */
210