runshare 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +38 -0
- data/LICENSE.txt +21 -0
- data/README.md +103 -0
- data/Rakefile +14 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/ext/runshare/extconf.rb +33 -0
- data/ext/runshare/include/all-io.h +115 -0
- data/ext/runshare/include/c.h +479 -0
- data/ext/runshare/include/caputils.h +34 -0
- data/ext/runshare/include/namespace.h +56 -0
- data/ext/runshare/include/pathnames.h +218 -0
- data/ext/runshare/include/pwdutils.h +14 -0
- data/ext/runshare/include/signames.h +8 -0
- data/ext/runshare/include/strutils.h +393 -0
- data/ext/runshare/runshare.c +261 -0
- data/ext/runshare/unshare.c +498 -0
- data/ext/runshare/unshare.h +82 -0
- data/lib/runshare/version.rb +3 -0
- data/lib/runshare.rb +7 -0
- data/runshare.gemspec +44 -0
- metadata +231 -0
@@ -0,0 +1,479 @@
|
|
1
|
+
/*
|
2
|
+
* Fundamental C definitions.
|
3
|
+
*
|
4
|
+
* No copyright is claimed. This code is in the public domain; do with
|
5
|
+
* it what you wish.
|
6
|
+
*/
|
7
|
+
#ifndef UTIL_LINUX_C_H
|
8
|
+
#define UTIL_LINUX_C_H
|
9
|
+
|
10
|
+
#include <limits.h>
|
11
|
+
#include <stddef.h>
|
12
|
+
#include <stdint.h>
|
13
|
+
#include <stdio.h>
|
14
|
+
#include <unistd.h>
|
15
|
+
#include <stdarg.h>
|
16
|
+
#include <stdlib.h>
|
17
|
+
#include <string.h>
|
18
|
+
#include <errno.h>
|
19
|
+
#include <sys/types.h>
|
20
|
+
#include <grp.h>
|
21
|
+
|
22
|
+
#include <assert.h>
|
23
|
+
|
24
|
+
#ifdef HAVE_ERR_H
|
25
|
+
# include <err.h>
|
26
|
+
#endif
|
27
|
+
|
28
|
+
#ifdef HAVE_SYS_SYSMACROS_H
|
29
|
+
# include <sys/sysmacros.h> /* for major, minor */
|
30
|
+
#endif
|
31
|
+
|
32
|
+
#ifndef LOGIN_NAME_MAX
|
33
|
+
# define LOGIN_NAME_MAX 256
|
34
|
+
#endif
|
35
|
+
|
36
|
+
#ifndef NAME_MAX
|
37
|
+
# define NAME_MAX PATH_MAX
|
38
|
+
#endif
|
39
|
+
|
40
|
+
/*
|
41
|
+
* __GNUC_PREREQ is deprecated in favour of __has_attribute() and
|
42
|
+
* __has_feature(). The __has macros are supported by clang and gcc>=5.
|
43
|
+
*/
|
44
|
+
#ifndef __GNUC_PREREQ
|
45
|
+
# if defined __GNUC__ && defined __GNUC_MINOR__
|
46
|
+
# define __GNUC_PREREQ(maj, min) \
|
47
|
+
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
|
48
|
+
# else
|
49
|
+
# define __GNUC_PREREQ(maj, min) 0
|
50
|
+
# endif
|
51
|
+
#endif
|
52
|
+
|
53
|
+
#ifdef __GNUC__
|
54
|
+
|
55
|
+
/* &a[0] degrades to a pointer: a different type from an array */
|
56
|
+
# define __must_be_array(a) \
|
57
|
+
UL_BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(__typeof__(a), __typeof__(&a[0])))
|
58
|
+
|
59
|
+
# define ignore_result(x) __extension__ ({ \
|
60
|
+
__typeof__(x) __dummy __attribute__((__unused__)) = (x); (void) __dummy; \
|
61
|
+
})
|
62
|
+
|
63
|
+
#else /* !__GNUC__ */
|
64
|
+
# define __must_be_array(a) 0
|
65
|
+
# define __attribute__(_arg_)
|
66
|
+
# define ignore_result(x) ((void) (x))
|
67
|
+
#endif /* !__GNUC__ */
|
68
|
+
|
69
|
+
|
70
|
+
/* "restrict" keyword fallback */
|
71
|
+
#if __STDC__ != 1
|
72
|
+
# define restrict __restrict /* use implementation __ format */
|
73
|
+
#else
|
74
|
+
# ifndef __STDC_VERSION__
|
75
|
+
# define restrict __restrict /* use implementation __ format */
|
76
|
+
# else
|
77
|
+
# if __STDC_VERSION__ < 199901L
|
78
|
+
# define restrict __restrict /* use implementation __ format */
|
79
|
+
# endif
|
80
|
+
# endif
|
81
|
+
#endif
|
82
|
+
|
83
|
+
|
84
|
+
/*
|
85
|
+
* It evaluates to 1 if the attribute/feature is supported by the current
|
86
|
+
* compilation target. Fallback for old compilers.
|
87
|
+
*/
|
88
|
+
#ifndef __has_attribute
|
89
|
+
#define __has_attribute(x) 0
|
90
|
+
#endif
|
91
|
+
|
92
|
+
#ifndef __has_feature
|
93
|
+
#define __has_feature(x) 0
|
94
|
+
#endif
|
95
|
+
|
96
|
+
/*
|
97
|
+
* Function attributes
|
98
|
+
*/
|
99
|
+
#ifndef __ul_alloc_size
|
100
|
+
# if (__has_attribute(alloc_size) && __has_attribute(warn_unused_result)) || __GNUC_PREREQ (4, 3)
|
101
|
+
# define __ul_alloc_size(s) __attribute__((alloc_size(s), warn_unused_result))
|
102
|
+
# else
|
103
|
+
# define __ul_alloc_size(s)
|
104
|
+
# endif
|
105
|
+
#endif
|
106
|
+
|
107
|
+
#ifndef __ul_calloc_size
|
108
|
+
# if (__has_attribute(alloc_size) && __has_attribute(warn_unused_result)) || __GNUC_PREREQ (4, 3)
|
109
|
+
# define __ul_calloc_size(n, s) __attribute__((alloc_size(n, s), warn_unused_result))
|
110
|
+
# else
|
111
|
+
# define __ul_calloc_size(n, s)
|
112
|
+
# endif
|
113
|
+
#endif
|
114
|
+
|
115
|
+
#if __has_attribute(returns_nonnull) || __GNUC_PREREQ (4, 9)
|
116
|
+
# define __ul_returns_nonnull __attribute__((returns_nonnull))
|
117
|
+
#else
|
118
|
+
# define __ul_returns_nonnull
|
119
|
+
#endif
|
120
|
+
|
121
|
+
/*
|
122
|
+
* Force a compilation error if condition is true, but also produce a
|
123
|
+
* result (of value 0 and type size_t), so the expression can be used
|
124
|
+
* e.g. in a structure initializer (or wherever else comma expressions
|
125
|
+
* aren't permitted).
|
126
|
+
*/
|
127
|
+
#define UL_BUILD_BUG_ON_ZERO(e) __extension__ (sizeof(struct { int:-!!(e); }))
|
128
|
+
#define BUILD_BUG_ON_NULL(e) ((void *)sizeof(struct { int:-!!(e); }))
|
129
|
+
|
130
|
+
#ifndef ARRAY_SIZE
|
131
|
+
# define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))
|
132
|
+
#endif
|
133
|
+
|
134
|
+
#ifndef PATH_MAX
|
135
|
+
# define PATH_MAX 4096
|
136
|
+
#endif
|
137
|
+
|
138
|
+
#ifndef TRUE
|
139
|
+
# define TRUE 1
|
140
|
+
#endif
|
141
|
+
|
142
|
+
#ifndef FALSE
|
143
|
+
# define FALSE 0
|
144
|
+
#endif
|
145
|
+
|
146
|
+
#ifndef min
|
147
|
+
# define min(x, y) __extension__ ({ \
|
148
|
+
__typeof__(x) _min1 = (x); \
|
149
|
+
__typeof__(y) _min2 = (y); \
|
150
|
+
(void) (&_min1 == &_min2); \
|
151
|
+
_min1 < _min2 ? _min1 : _min2; })
|
152
|
+
#endif
|
153
|
+
|
154
|
+
#ifndef max
|
155
|
+
# define max(x, y) __extension__ ({ \
|
156
|
+
__typeof__(x) _max1 = (x); \
|
157
|
+
__typeof__(y) _max2 = (y); \
|
158
|
+
(void) (&_max1 == &_max2); \
|
159
|
+
_max1 > _max2 ? _max1 : _max2; })
|
160
|
+
#endif
|
161
|
+
|
162
|
+
#ifndef cmp_numbers
|
163
|
+
# define cmp_numbers(x, y) __extension__ ({ \
|
164
|
+
__typeof__(x) _a = (x); \
|
165
|
+
__typeof__(y) _b = (y); \
|
166
|
+
(void) (&_a == &_b); \
|
167
|
+
_a == _b ? 0 : _a > _b ? 1 : -1; })
|
168
|
+
#endif
|
169
|
+
|
170
|
+
#ifndef offsetof
|
171
|
+
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
172
|
+
#endif
|
173
|
+
|
174
|
+
/*
|
175
|
+
* container_of - cast a member of a structure out to the containing structure
|
176
|
+
* @ptr: the pointer to the member.
|
177
|
+
* @type: the type of the container struct this is embedded in.
|
178
|
+
* @member: the name of the member within the struct.
|
179
|
+
*/
|
180
|
+
#ifndef container_of
|
181
|
+
#define container_of(ptr, type, member) __extension__ ({ \
|
182
|
+
const __typeof__( ((type *)0)->member ) *__mptr = (ptr); \
|
183
|
+
(type *)( (char *)__mptr - offsetof(type,member) );})
|
184
|
+
#endif
|
185
|
+
|
186
|
+
#ifndef HAVE_PROGRAM_INVOCATION_SHORT_NAME
|
187
|
+
# ifdef HAVE___PROGNAME
|
188
|
+
extern char *__progname;
|
189
|
+
# define program_invocation_short_name __progname
|
190
|
+
# else
|
191
|
+
# ifdef HAVE_GETEXECNAME
|
192
|
+
# define program_invocation_short_name \
|
193
|
+
prog_inv_sh_nm_from_file(getexecname(), 0)
|
194
|
+
# else
|
195
|
+
# define program_invocation_short_name \
|
196
|
+
prog_inv_sh_nm_from_file(__FILE__, 1)
|
197
|
+
# endif
|
198
|
+
static char prog_inv_sh_nm_buf[256];
|
199
|
+
static inline char *
|
200
|
+
prog_inv_sh_nm_from_file(char *f, char stripext)
|
201
|
+
{
|
202
|
+
char *t;
|
203
|
+
|
204
|
+
if ((t = strrchr(f, '/')) != NULL)
|
205
|
+
t++;
|
206
|
+
else
|
207
|
+
t = f;
|
208
|
+
|
209
|
+
strncpy(prog_inv_sh_nm_buf, t, sizeof(prog_inv_sh_nm_buf) - 1);
|
210
|
+
prog_inv_sh_nm_buf[sizeof(prog_inv_sh_nm_buf) - 1] = '\0';
|
211
|
+
|
212
|
+
if (stripext && (t = strrchr(prog_inv_sh_nm_buf, '.')) != NULL)
|
213
|
+
*t = '\0';
|
214
|
+
|
215
|
+
return prog_inv_sh_nm_buf;
|
216
|
+
}
|
217
|
+
# endif
|
218
|
+
#endif
|
219
|
+
|
220
|
+
|
221
|
+
#ifndef HAVE_ERR_H
|
222
|
+
static inline void __attribute__ ((__format__ (__printf__, 4, 5)))
|
223
|
+
errmsg(char doexit, int excode, char adderr, const char *fmt, ...)
|
224
|
+
{
|
225
|
+
fprintf(stderr, "%s: ", program_invocation_short_name);
|
226
|
+
if (fmt != NULL) {
|
227
|
+
va_list argp;
|
228
|
+
va_start(argp, fmt);
|
229
|
+
vfprintf(stderr, fmt, argp);
|
230
|
+
va_end(argp);
|
231
|
+
if (adderr)
|
232
|
+
fprintf(stderr, ": ");
|
233
|
+
}
|
234
|
+
if (adderr)
|
235
|
+
fprintf(stderr, "%m");
|
236
|
+
fprintf(stderr, "\n");
|
237
|
+
if (doexit)
|
238
|
+
exit(excode);
|
239
|
+
}
|
240
|
+
|
241
|
+
#ifndef HAVE_ERR
|
242
|
+
# define err(E, FMT...) errmsg(1, E, 1, FMT)
|
243
|
+
#endif
|
244
|
+
|
245
|
+
#ifndef HAVE_ERRX
|
246
|
+
# define errx(E, FMT...) errmsg(1, E, 0, FMT)
|
247
|
+
#endif
|
248
|
+
|
249
|
+
#ifndef HAVE_WARN
|
250
|
+
# define warn(FMT...) errmsg(0, 0, 1, FMT)
|
251
|
+
#endif
|
252
|
+
|
253
|
+
#ifndef HAVE_WARNX
|
254
|
+
# define warnx(FMT...) errmsg(0, 0, 0, FMT)
|
255
|
+
#endif
|
256
|
+
#endif /* !HAVE_ERR_H */
|
257
|
+
|
258
|
+
|
259
|
+
/* Don't use inline function to avoid '#include "nls.h"' in c.h
|
260
|
+
*/
|
261
|
+
#define errtryhelp(eval) __extension__ ({ \
|
262
|
+
fprintf(stderr, _("Try '%s --help' for more information.\n"), \
|
263
|
+
program_invocation_short_name); \
|
264
|
+
exit(eval); \
|
265
|
+
})
|
266
|
+
|
267
|
+
/* After failed execvp() */
|
268
|
+
#define EX_EXEC_FAILED 126 /* Program located, but not usable. */
|
269
|
+
#define EX_EXEC_ENOENT 127 /* Could not find program to exec. */
|
270
|
+
#define errexec(name) err(errno == ENOENT ? EX_EXEC_ENOENT : EX_EXEC_FAILED, \
|
271
|
+
_("failed to execute %s"), name)
|
272
|
+
|
273
|
+
|
274
|
+
static inline __attribute__((const)) int is_power_of_2(unsigned long num)
|
275
|
+
{
|
276
|
+
return (num != 0 && ((num & (num - 1)) == 0));
|
277
|
+
}
|
278
|
+
|
279
|
+
#ifndef HAVE_LOFF_T
|
280
|
+
typedef int64_t loff_t;
|
281
|
+
#endif
|
282
|
+
|
283
|
+
#if !defined(HAVE_DIRFD) && (!defined(HAVE_DECL_DIRFD) || HAVE_DECL_DIRFD == 0) && defined(HAVE_DIR_DD_FD)
|
284
|
+
#include <sys/types.h>
|
285
|
+
#include <dirent.h>
|
286
|
+
static inline int dirfd(DIR *d)
|
287
|
+
{
|
288
|
+
return d->dd_fd;
|
289
|
+
}
|
290
|
+
#endif
|
291
|
+
|
292
|
+
/*
|
293
|
+
* Fallback defines for old versions of glibc
|
294
|
+
*/
|
295
|
+
#include <fcntl.h>
|
296
|
+
|
297
|
+
#ifdef O_CLOEXEC
|
298
|
+
#define UL_CLOEXECSTR "e"
|
299
|
+
#else
|
300
|
+
#define UL_CLOEXECSTR ""
|
301
|
+
#endif
|
302
|
+
|
303
|
+
#ifndef O_CLOEXEC
|
304
|
+
#define O_CLOEXEC 0
|
305
|
+
#endif
|
306
|
+
|
307
|
+
#ifdef __FreeBSD_kernel__
|
308
|
+
#ifndef F_DUPFD_CLOEXEC
|
309
|
+
#define F_DUPFD_CLOEXEC 17 /* Like F_DUPFD, but FD_CLOEXEC is set */
|
310
|
+
#endif
|
311
|
+
#endif
|
312
|
+
|
313
|
+
|
314
|
+
#ifndef AI_ADDRCONFIG
|
315
|
+
#define AI_ADDRCONFIG 0x0020
|
316
|
+
#endif
|
317
|
+
|
318
|
+
#ifndef IUTF8
|
319
|
+
#define IUTF8 0040000
|
320
|
+
#endif
|
321
|
+
|
322
|
+
/*
|
323
|
+
* MAXHOSTNAMELEN replacement
|
324
|
+
*/
|
325
|
+
static inline size_t get_hostname_max(void)
|
326
|
+
{
|
327
|
+
long len = sysconf(_SC_HOST_NAME_MAX);
|
328
|
+
|
329
|
+
if (0 < len)
|
330
|
+
return len;
|
331
|
+
|
332
|
+
#ifdef MAXHOSTNAMELEN
|
333
|
+
return MAXHOSTNAMELEN;
|
334
|
+
#elif HOST_NAME_MAX
|
335
|
+
return HOST_NAME_MAX;
|
336
|
+
#endif
|
337
|
+
return 64;
|
338
|
+
}
|
339
|
+
|
340
|
+
|
341
|
+
static inline int drop_permissions(void)
|
342
|
+
{
|
343
|
+
errno = 0;
|
344
|
+
|
345
|
+
/* drop GID */
|
346
|
+
if (setgid(getgid()) < 0)
|
347
|
+
goto fail;
|
348
|
+
|
349
|
+
/* drop UID */
|
350
|
+
if (setuid(getuid()) < 0)
|
351
|
+
goto fail;
|
352
|
+
|
353
|
+
return 0;
|
354
|
+
fail:
|
355
|
+
return errno ? -errno : -1;
|
356
|
+
}
|
357
|
+
|
358
|
+
/*
|
359
|
+
* The usleep function was marked obsolete in POSIX.1-2001 and was removed
|
360
|
+
* in POSIX.1-2008. It was replaced with nanosleep() that provides more
|
361
|
+
* advantages (like no interaction with signals and other timer functions).
|
362
|
+
*/
|
363
|
+
#include <time.h>
|
364
|
+
|
365
|
+
static inline int xusleep(useconds_t usec)
|
366
|
+
{
|
367
|
+
#ifdef HAVE_NANOSLEEP
|
368
|
+
struct timespec waittime = {
|
369
|
+
.tv_sec = usec / 1000000L,
|
370
|
+
.tv_nsec = (usec % 1000000L) * 1000
|
371
|
+
};
|
372
|
+
return nanosleep(&waittime, NULL);
|
373
|
+
#elif defined(HAVE_USLEEP)
|
374
|
+
return usleep(usec);
|
375
|
+
#else
|
376
|
+
# error "System with usleep() or nanosleep() required!"
|
377
|
+
#endif
|
378
|
+
}
|
379
|
+
|
380
|
+
/*
|
381
|
+
* Constant strings for usage() functions. For more info see
|
382
|
+
* Documentation/{howto-usage-function.txt,boilerplate.c}
|
383
|
+
*/
|
384
|
+
#define USAGE_HEADER _("\nUsage:\n")
|
385
|
+
#define USAGE_OPTIONS _("\nOptions:\n")
|
386
|
+
#define USAGE_FUNCTIONS _("\nFunctions:\n")
|
387
|
+
#define USAGE_COMMANDS _("\nCommands:\n")
|
388
|
+
#define USAGE_ARGUMENTS _("\nArguments:\n")
|
389
|
+
#define USAGE_COLUMNS _("\nAvailable output columns:\n")
|
390
|
+
#define USAGE_SEPARATOR "\n"
|
391
|
+
|
392
|
+
#define USAGE_OPTSTR_HELP _("display this help")
|
393
|
+
#define USAGE_OPTSTR_VERSION _("display version")
|
394
|
+
|
395
|
+
#define USAGE_HELP_OPTIONS(marg_dsc) \
|
396
|
+
"%-" #marg_dsc "s%s\n" \
|
397
|
+
"%-" #marg_dsc "s%s\n" \
|
398
|
+
, " -h, --help", USAGE_OPTSTR_HELP \
|
399
|
+
, " -V, --version", USAGE_OPTSTR_VERSION
|
400
|
+
|
401
|
+
#define USAGE_ARG_SEPARATOR "\n"
|
402
|
+
#define USAGE_ARG_SIZE(_name) \
|
403
|
+
_(" %s arguments may be followed by the suffixes for\n" \
|
404
|
+
" GiB, TiB, PiB, EiB, ZiB, and YiB (the \"iB\" is optional)\n"), _name
|
405
|
+
|
406
|
+
#define USAGE_MAN_TAIL(_man) _("\nFor more details see %s.\n"), _man
|
407
|
+
|
408
|
+
#define UTIL_LINUX_VERSION _("%s from %s\n"), program_invocation_short_name, PACKAGE_STRING
|
409
|
+
|
410
|
+
#define print_version(eval) __extension__ ({ \
|
411
|
+
printf(UTIL_LINUX_VERSION); \
|
412
|
+
exit(eval); \
|
413
|
+
})
|
414
|
+
|
415
|
+
/*
|
416
|
+
* seek stuff
|
417
|
+
*/
|
418
|
+
#ifndef SEEK_DATA
|
419
|
+
# define SEEK_DATA 3
|
420
|
+
#endif
|
421
|
+
#ifndef SEEK_HOLE
|
422
|
+
# define SEEK_HOLE 4
|
423
|
+
#endif
|
424
|
+
|
425
|
+
|
426
|
+
/*
|
427
|
+
* Macros to convert #define'itions to strings, for example
|
428
|
+
* #define XYXXY 42
|
429
|
+
* printf ("%s=%s\n", stringify(XYXXY), stringify_value(XYXXY));
|
430
|
+
*/
|
431
|
+
#define stringify_value(s) stringify(s)
|
432
|
+
#define stringify(s) #s
|
433
|
+
|
434
|
+
/* Detect if we're compiled with Address Sanitizer
|
435
|
+
* - gcc (__SANITIZE_ADDRESS__)
|
436
|
+
* - clang (__has_feature(address_sanitizer))
|
437
|
+
*/
|
438
|
+
#if !defined(HAS_FEATURE_ADDRESS_SANITIZER)
|
439
|
+
# ifdef __SANITIZE_ADDRESS__
|
440
|
+
# define HAS_FEATURE_ADDRESS_SANITIZER 1
|
441
|
+
# elif defined(__has_feature)
|
442
|
+
# if __has_feature(address_sanitizer)
|
443
|
+
# define HAS_FEATURE_ADDRESS_SANITIZER 1
|
444
|
+
# endif
|
445
|
+
# endif
|
446
|
+
# if !defined(HAS_FEATURE_ADDRESS_SANITIZER)
|
447
|
+
# define HAS_FEATURE_ADDRESS_SANITIZER 0
|
448
|
+
# endif
|
449
|
+
#endif
|
450
|
+
|
451
|
+
/*
|
452
|
+
* UL_ASAN_BLACKLIST is a macro to tell AddressSanitizer (a compile-time
|
453
|
+
* instrumentation shipped with Clang and GCC) to not instrument the
|
454
|
+
* annotated function. Furthermore, it will prevent the compiler from
|
455
|
+
* inlining the function because inlining currently breaks the blacklisting
|
456
|
+
* mechanism of AddressSanitizer.
|
457
|
+
*/
|
458
|
+
#if __has_feature(address_sanitizer) && __has_attribute(no_sanitize_memory) && __has_attribute(no_sanitize_address)
|
459
|
+
# define UL_ASAN_BLACKLIST __attribute__((noinline)) __attribute__((no_sanitize_memory)) __attribute__((no_sanitize_address))
|
460
|
+
#else
|
461
|
+
# define UL_ASAN_BLACKLIST /* nothing */
|
462
|
+
#endif
|
463
|
+
|
464
|
+
/*
|
465
|
+
* Note that sysconf(_SC_GETPW_R_SIZE_MAX) returns *initial* suggested size for
|
466
|
+
* pwd buffer and in some cases it is not large enough. See POSIX and
|
467
|
+
* getpwnam_r man page for more details.
|
468
|
+
*/
|
469
|
+
#define UL_GETPW_BUFSIZ (16 * 1024)
|
470
|
+
|
471
|
+
/*
|
472
|
+
* Darwin or other BSDs may only have MAP_ANON. To get it on Darwin we must
|
473
|
+
* define _DARWIN_C_SOURCE before including sys/mman.h. We do this in config.h.
|
474
|
+
*/
|
475
|
+
#if !defined MAP_ANONYMOUS && defined MAP_ANON
|
476
|
+
# define MAP_ANONYMOUS (MAP_ANON)
|
477
|
+
#endif
|
478
|
+
|
479
|
+
#endif /* UTIL_LINUX_C_H */
|
@@ -0,0 +1,34 @@
|
|
1
|
+
/*
|
2
|
+
* This program is free software; you can redistribute it and/or modify it
|
3
|
+
* under the terms of the GNU General Public License as published by the
|
4
|
+
* Free Software Foundation; either version 2, or (at your option) any
|
5
|
+
* later version.
|
6
|
+
*
|
7
|
+
* This program is distributed in the hope that it will be useful, but
|
8
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
9
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
10
|
+
* General Public License for more details.
|
11
|
+
*
|
12
|
+
* You should have received a copy of the GNU General Public License along
|
13
|
+
* with this program; if not, write to the Free Software Foundation, Inc.,
|
14
|
+
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
15
|
+
*/
|
16
|
+
|
17
|
+
#ifndef CAPUTILS_H
|
18
|
+
#define CAPUTILS_H
|
19
|
+
|
20
|
+
#include <linux/capability.h>
|
21
|
+
|
22
|
+
#ifndef PR_CAP_AMBIENT
|
23
|
+
# define PR_CAP_AMBIENT 47
|
24
|
+
# define PR_CAP_AMBIENT_IS_SET 1
|
25
|
+
# define PR_CAP_AMBIENT_RAISE 2
|
26
|
+
# define PR_CAP_AMBIENT_LOWER 3
|
27
|
+
#endif
|
28
|
+
|
29
|
+
extern int capset(cap_user_header_t header, cap_user_data_t data);
|
30
|
+
extern int capget(cap_user_header_t header, const cap_user_data_t data);
|
31
|
+
|
32
|
+
extern int cap_last_cap(void);
|
33
|
+
|
34
|
+
#endif /* CAPUTILS_H */
|
@@ -0,0 +1,56 @@
|
|
1
|
+
|
2
|
+
/*
|
3
|
+
* No copyright is claimed. This code is in the public domain; do with
|
4
|
+
* it what you wish.
|
5
|
+
*
|
6
|
+
* Compat code so unshare and setns can be used with older libcs
|
7
|
+
*/
|
8
|
+
#ifndef UTIL_LINUX_NAMESPACE_H
|
9
|
+
# define UTIL_LINUX_NAMESPACE_H
|
10
|
+
|
11
|
+
# include <sched.h>
|
12
|
+
|
13
|
+
# ifndef CLONE_NEWNS
|
14
|
+
# define CLONE_NEWNS 0x00020000
|
15
|
+
# endif
|
16
|
+
# ifndef CLONE_NEWCGROUP
|
17
|
+
# define CLONE_NEWCGROUP 0x02000000
|
18
|
+
# endif
|
19
|
+
# ifndef CLONE_NEWUTS
|
20
|
+
# define CLONE_NEWUTS 0x04000000
|
21
|
+
# endif
|
22
|
+
# ifndef CLONE_NEWIPC
|
23
|
+
# define CLONE_NEWIPC 0x08000000
|
24
|
+
# endif
|
25
|
+
# ifndef CLONE_NEWNET
|
26
|
+
# define CLONE_NEWNET 0x40000000
|
27
|
+
# endif
|
28
|
+
# ifndef CLONE_NEWUSER
|
29
|
+
# define CLONE_NEWUSER 0x10000000
|
30
|
+
# endif
|
31
|
+
# ifndef CLONE_NEWPID
|
32
|
+
# define CLONE_NEWPID 0x20000000
|
33
|
+
# endif
|
34
|
+
# ifndef CLONE_NEWTIME
|
35
|
+
# define CLONE_NEWTIME 0x00000080
|
36
|
+
# endif
|
37
|
+
|
38
|
+
# if !defined(HAVE_UNSHARE) || !defined(HAVE_SETNS)
|
39
|
+
# include <sys/syscall.h>
|
40
|
+
# endif
|
41
|
+
|
42
|
+
# if !defined(HAVE_UNSHARE) && defined(SYS_unshare)
|
43
|
+
static inline int unshare(int flags)
|
44
|
+
{
|
45
|
+
return syscall(SYS_unshare, flags);
|
46
|
+
}
|
47
|
+
# endif
|
48
|
+
|
49
|
+
# if !defined(HAVE_SETNS) && defined(SYS_setns)
|
50
|
+
static inline int setns(int fd, int nstype)
|
51
|
+
{
|
52
|
+
return syscall(SYS_setns, fd, nstype);
|
53
|
+
}
|
54
|
+
# endif
|
55
|
+
|
56
|
+
#endif /* UTIL_LINUX_NAMESPACE_H */
|