xref: /freebsd/contrib/capsicum-test/capsicum.h (revision 9a696dc6bb0e8e783dfd169c8299e1f33aac2935)
1*8ac5aef8SEnji Cooper /*
2*8ac5aef8SEnji Cooper  * Minimal portability layer for Capsicum-related features.
3*8ac5aef8SEnji Cooper  */
4*8ac5aef8SEnji Cooper #ifndef __CAPSICUM_H__
5*8ac5aef8SEnji Cooper #define __CAPSICUM_H__
6*8ac5aef8SEnji Cooper 
7*8ac5aef8SEnji Cooper #ifdef __FreeBSD__
8*8ac5aef8SEnji Cooper #include "capsicum-freebsd.h"
9*8ac5aef8SEnji Cooper #endif
10*8ac5aef8SEnji Cooper 
11*8ac5aef8SEnji Cooper #ifdef __linux__
12*8ac5aef8SEnji Cooper #include "capsicum-linux.h"
13*8ac5aef8SEnji Cooper #endif
14*8ac5aef8SEnji Cooper 
15*8ac5aef8SEnji Cooper /*
16*8ac5aef8SEnji Cooper  * CAP_ALL/CAP_NONE is a value in FreeBSD9.x Capsicum, but a functional macro
17*8ac5aef8SEnji Cooper  * in FreeBSD10.x Capsicum.  Always use CAP_SET_ALL/CAP_SET_NONE instead.
18*8ac5aef8SEnji Cooper  */
19*8ac5aef8SEnji Cooper #ifndef CAP_SET_ALL
20*8ac5aef8SEnji Cooper #ifdef CAP_RIGHTS_VERSION
21*8ac5aef8SEnji Cooper #define CAP_SET_ALL(rights) CAP_ALL(rights)
22*8ac5aef8SEnji Cooper #else
23*8ac5aef8SEnji Cooper #define CAP_SET_ALL(rights) *(rights) = CAP_MASK_VALID
24*8ac5aef8SEnji Cooper #endif
25*8ac5aef8SEnji Cooper #endif
26*8ac5aef8SEnji Cooper 
27*8ac5aef8SEnji Cooper #ifndef CAP_SET_NONE
28*8ac5aef8SEnji Cooper #ifdef CAP_RIGHTS_VERSION
29*8ac5aef8SEnji Cooper #define CAP_SET_NONE(rights) CAP_NONE(rights)
30*8ac5aef8SEnji Cooper #else
31*8ac5aef8SEnji Cooper #define CAP_SET_NONE(rights) *(rights) = 0
32*8ac5aef8SEnji Cooper #endif
33*8ac5aef8SEnji Cooper #endif
34*8ac5aef8SEnji Cooper 
35*8ac5aef8SEnji Cooper 
36*8ac5aef8SEnji Cooper /************************************************************
37*8ac5aef8SEnji Cooper  * Define new-style rights in terms of old-style rights if
38*8ac5aef8SEnji Cooper  * absent.
39*8ac5aef8SEnji Cooper  ************************************************************/
40*8ac5aef8SEnji Cooper #include "capsicum-rights.h"
41*8ac5aef8SEnji Cooper 
42*8ac5aef8SEnji Cooper /*
43*8ac5aef8SEnji Cooper  * Cope with systems (e.g. FreeBSD 10.x) where CAP_RENAMEAT hasn't been split out.
44*8ac5aef8SEnji Cooper  *  (src, dest): RENAMEAT, LINKAT => RENAMEAT_SOURCE, RENAMEAT_TARGET
45*8ac5aef8SEnji Cooper  */
46*8ac5aef8SEnji Cooper #ifndef CAP_RENAMEAT_SOURCE
47*8ac5aef8SEnji Cooper #define CAP_RENAMEAT_SOURCE CAP_RENAMEAT
48*8ac5aef8SEnji Cooper #endif
49*8ac5aef8SEnji Cooper #ifndef CAP_RENAMEAT_TARGET
50*8ac5aef8SEnji Cooper #define CAP_RENAMEAT_TARGET CAP_LINKAT
51*8ac5aef8SEnji Cooper #endif
52*8ac5aef8SEnji Cooper /*
53*8ac5aef8SEnji Cooper  * Cope with systems (e.g. FreeBSD 10.x) where CAP_RENAMEAT hasn't been split out.
54*8ac5aef8SEnji Cooper  *  (src, dest): 0, LINKAT => LINKAT_SOURCE, LINKAT_TARGET
55*8ac5aef8SEnji Cooper  */
56*8ac5aef8SEnji Cooper #ifndef CAP_LINKAT_SOURCE
57*8ac5aef8SEnji Cooper #define CAP_LINKAT_SOURCE CAP_LOOKUP
58*8ac5aef8SEnji Cooper #endif
59*8ac5aef8SEnji Cooper #ifndef CAP_LINKAT_TARGET
60*8ac5aef8SEnji Cooper #define CAP_LINKAT_TARGET CAP_LINKAT
61*8ac5aef8SEnji Cooper #endif
62*8ac5aef8SEnji Cooper 
63*8ac5aef8SEnji Cooper #ifdef CAP_PREAD
64*8ac5aef8SEnji Cooper /* Existence of CAP_PREAD implies new-style CAP_SEEK semantics */
65*8ac5aef8SEnji Cooper #define CAP_SEEK_ASWAS 0
66*8ac5aef8SEnji Cooper #else
67*8ac5aef8SEnji Cooper /* Old-style CAP_SEEK semantics */
68*8ac5aef8SEnji Cooper #define CAP_SEEK_ASWAS CAP_SEEK
69*8ac5aef8SEnji Cooper #define CAP_PREAD CAP_READ
70*8ac5aef8SEnji Cooper #define CAP_PWRITE CAP_WRITE
71*8ac5aef8SEnji Cooper #endif
72*8ac5aef8SEnji Cooper 
73*8ac5aef8SEnji Cooper #ifndef CAP_MMAP_R
74*8ac5aef8SEnji Cooper #define CAP_MMAP_R (CAP_READ|CAP_MMAP)
75*8ac5aef8SEnji Cooper #define CAP_MMAP_W (CAP_WRITE|CAP_MMAP)
76*8ac5aef8SEnji Cooper #define CAP_MMAP_X (CAP_MAPEXEC|CAP_MMAP)
77*8ac5aef8SEnji Cooper #define CAP_MMAP_RW (CAP_MMAP_R|CAP_MMAP_W)
78*8ac5aef8SEnji Cooper #define CAP_MMAP_RX (CAP_MMAP_R|CAP_MMAP_X)
79*8ac5aef8SEnji Cooper #define CAP_MMAP_WX (CAP_MMAP_W|CAP_MMAP_X)
80*8ac5aef8SEnji Cooper #define CAP_MMAP_RWX (CAP_MMAP_R|CAP_MMAP_W|CAP_MMAP_X)
81*8ac5aef8SEnji Cooper #endif
82*8ac5aef8SEnji Cooper 
83*8ac5aef8SEnji Cooper #ifndef CAP_MKFIFOAT
84*8ac5aef8SEnji Cooper #define CAP_MKFIFOAT CAP_MKFIFO
85*8ac5aef8SEnji Cooper #endif
86*8ac5aef8SEnji Cooper 
87*8ac5aef8SEnji Cooper #ifndef CAP_MKNODAT
88*8ac5aef8SEnji Cooper #define CAP_MKNODAT CAP_MKFIFOAT
89*8ac5aef8SEnji Cooper #endif
90*8ac5aef8SEnji Cooper 
91*8ac5aef8SEnji Cooper #ifndef CAP_MKDIRAT
92*8ac5aef8SEnji Cooper #define CAP_MKDIRAT CAP_MKDIR
93*8ac5aef8SEnji Cooper #endif
94*8ac5aef8SEnji Cooper 
95*8ac5aef8SEnji Cooper #ifndef CAP_UNLINKAT
96*8ac5aef8SEnji Cooper #define CAP_UNLINKAT CAP_RMDIR
97*8ac5aef8SEnji Cooper #endif
98*8ac5aef8SEnji Cooper 
99*8ac5aef8SEnji Cooper #ifndef CAP_SOCK_CLIENT
100*8ac5aef8SEnji Cooper #define CAP_SOCK_CLIENT \
101*8ac5aef8SEnji Cooper         (CAP_CONNECT | CAP_GETPEERNAME | CAP_GETSOCKNAME | CAP_GETSOCKOPT | \
102*8ac5aef8SEnji Cooper          CAP_PEELOFF | CAP_READ | CAP_WRITE | CAP_SETSOCKOPT | CAP_SHUTDOWN)
103*8ac5aef8SEnji Cooper #endif
104*8ac5aef8SEnji Cooper 
105*8ac5aef8SEnji Cooper #ifndef CAP_SOCK_SERVER
106*8ac5aef8SEnji Cooper #define CAP_SOCK_SERVER \
107*8ac5aef8SEnji Cooper         (CAP_ACCEPT | CAP_BIND | CAP_GETPEERNAME | CAP_GETSOCKNAME | \
108*8ac5aef8SEnji Cooper          CAP_GETSOCKOPT | CAP_LISTEN | CAP_PEELOFF | CAP_READ | CAP_WRITE | \
109*8ac5aef8SEnji Cooper          CAP_SETSOCKOPT | CAP_SHUTDOWN)
110*8ac5aef8SEnji Cooper #endif
111*8ac5aef8SEnji Cooper 
112*8ac5aef8SEnji Cooper #ifndef CAP_EVENT
113*8ac5aef8SEnji Cooper #define CAP_EVENT CAP_POLL_EVENT
114*8ac5aef8SEnji Cooper #endif
115*8ac5aef8SEnji Cooper 
116*8ac5aef8SEnji Cooper /************************************************************
117*8ac5aef8SEnji Cooper  * Define new-style API functions in terms of old-style API
118*8ac5aef8SEnji Cooper  * functions if absent.
119*8ac5aef8SEnji Cooper  ************************************************************/
120*8ac5aef8SEnji Cooper #ifndef HAVE_CAP_RIGHTS_GET
121*8ac5aef8SEnji Cooper /* Define cap_rights_get() in terms of old-style cap_getrights() */
cap_rights_get(int fd,cap_rights_t * rights)122*8ac5aef8SEnji Cooper inline int cap_rights_get(int fd, cap_rights_t *rights) {
123*8ac5aef8SEnji Cooper   return cap_getrights(fd, rights);
124*8ac5aef8SEnji Cooper }
125*8ac5aef8SEnji Cooper #endif
126*8ac5aef8SEnji Cooper 
127*8ac5aef8SEnji Cooper #ifndef HAVE_CAP_RIGHTS_LIMIT
128*8ac5aef8SEnji Cooper /* Define cap_rights_limit() in terms of old-style cap_new() and dup2() */
129*8ac5aef8SEnji Cooper #include <unistd.h>
cap_rights_limit(int fd,const cap_rights_t * rights)130*8ac5aef8SEnji Cooper inline int cap_rights_limit(int fd, const cap_rights_t *rights) {
131*8ac5aef8SEnji Cooper   int cap = cap_new(fd, *rights);
132*8ac5aef8SEnji Cooper   if (cap < 0) return cap;
133*8ac5aef8SEnji Cooper   int rc = dup2(cap, fd);
134*8ac5aef8SEnji Cooper   if (rc < 0) return rc;
135*8ac5aef8SEnji Cooper   close(cap);
136*8ac5aef8SEnji Cooper   return rc;
137*8ac5aef8SEnji Cooper }
138*8ac5aef8SEnji Cooper #endif
139*8ac5aef8SEnji Cooper 
140*8ac5aef8SEnji Cooper #include <stdio.h>
141*8ac5aef8SEnji Cooper #ifdef CAP_RIGHTS_VERSION
142*8ac5aef8SEnji Cooper /* New-style Capsicum API extras for debugging */
cap_rights_describe(const cap_rights_t * rights,char * buffer)143*8ac5aef8SEnji Cooper static inline void cap_rights_describe(const cap_rights_t *rights, char *buffer) {
144*8ac5aef8SEnji Cooper   int ii;
145*8ac5aef8SEnji Cooper   for (ii = 0; ii < (CAP_RIGHTS_VERSION+2); ii++) {
146*8ac5aef8SEnji Cooper     int len = sprintf(buffer, "0x%016llx ", (unsigned long long)rights->cr_rights[ii]);
147*8ac5aef8SEnji Cooper     buffer += len;
148*8ac5aef8SEnji Cooper   }
149*8ac5aef8SEnji Cooper }
150*8ac5aef8SEnji Cooper 
151*8ac5aef8SEnji Cooper #ifdef __cplusplus
152*8ac5aef8SEnji Cooper #include <iostream>
153*8ac5aef8SEnji Cooper #include <iomanip>
154*8ac5aef8SEnji Cooper inline std::ostream& operator<<(std::ostream& os, cap_rights_t rights) {
155*8ac5aef8SEnji Cooper   for (int ii = 0; ii < (CAP_RIGHTS_VERSION+2); ii++) {
156*8ac5aef8SEnji Cooper     os << std::hex << std::setw(16) << std::setfill('0') << (unsigned long long)rights.cr_rights[ii] << " ";
157*8ac5aef8SEnji Cooper   }
158*8ac5aef8SEnji Cooper   return os;
159*8ac5aef8SEnji Cooper }
160*8ac5aef8SEnji Cooper #endif
161*8ac5aef8SEnji Cooper 
162*8ac5aef8SEnji Cooper #else
163*8ac5aef8SEnji Cooper 
cap_rights_describe(const cap_rights_t * rights,char * buffer)164*8ac5aef8SEnji Cooper static inline void cap_rights_describe(const cap_rights_t *rights, char *buffer) {
165*8ac5aef8SEnji Cooper   sprintf(buffer, "0x%016llx", (*rights));
166*8ac5aef8SEnji Cooper }
167*8ac5aef8SEnji Cooper 
168*8ac5aef8SEnji Cooper #endif  /* new/old style rights manipulation */
169*8ac5aef8SEnji Cooper 
170*8ac5aef8SEnji Cooper #ifdef __cplusplus
171*8ac5aef8SEnji Cooper #include <string>
172*8ac5aef8SEnji Cooper extern std::string capsicum_test_bindir;
173*8ac5aef8SEnji Cooper #endif
174*8ac5aef8SEnji Cooper 
175*8ac5aef8SEnji Cooper #endif /*__CAPSICUM_H__*/
176