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
92struct _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
115struct _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
180extern 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
188extern int capset(cap_user_header_t header, cap_user_data_t data);
189extern int capget(cap_user_header_t header, const cap_user_data_t data);
190extern int capgetp(pid_t pid, cap_t cap_d);
191extern 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