diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-07-21 16:59:00 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-07-21 16:59:00 +0000 |
commit | c9e7a85eafc8ea704f1818eb8993ec7b65349539 (patch) | |
tree | 832aaffc3276b8ebfc0960c3d4bc4138ad8a6490 | |
parent | dd66b18a9fab1707c59befaa544aaac713e4f5f8 (diff) | |
parent | 70e1cac63d9545c24b6667f99813e868f6c75c80 (diff) | |
download | minijail-android12-mainline-sdkext-release.tar.gz |
Snap for 7570015 from 70e1cac63d9545c24b6667f99813e868f6c75c80 to mainline-sdkext-releaseandroid-mainline-12.0.0_r81android-mainline-12.0.0_r37android-mainline-12.0.0_r17android-mainline-12.0.0_r109aml_sdk_311710000android12-mainline-sdkext-release
Change-Id: I9cd8b2c074e3ce65d0f7f60ef60aaed35d8f7d68
54 files changed, 8030 insertions, 888 deletions
@@ -39,6 +39,13 @@ googletest-release* # Cargo build targets. -/target -**/*.rs.bk -Cargo.lock +/rust/**/target +/rust/**/*.rs.bk +/rust/**/Cargo.lock + +# VSCode workspace. +minijail.code-workspace + +# IntelliJ projects. +.idea + @@ -14,6 +14,42 @@ // Common variables. // ========================================================= +package { + default_applicable_licenses: ["external_minijail_license"], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// +// large-scale-change included anything that looked like it might be a license +// text as a license_text. e.g. LICENSE, NOTICE, COPYING etc. +// +// Please consider removing redundant or irrelevant files from 'license_text:'. +// See: http://go/android-license-faq +license { + name: "external_minijail_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "SPDX-license-identifier-BSD", + ], + license_text: [ + "LICENSE", + "NOTICE", + ], +} + libminijailSrcFiles = [ "bpf.c", "libminijail.c", @@ -35,10 +71,12 @@ cc_defaults { cflags: [ "-D_FILE_OFFSET_BITS=64", "-DALLOW_DEBUG_LOGGING", + "-DALLOW_DUPLICATE_SYSCALLS", "-DDEFAULT_PIVOT_ROOT=\"/var/empty\"", "-Wall", "-Werror", ], + c_std: "gnu11", target: { darwin: { enabled: false, @@ -51,7 +89,9 @@ cc_defaults { cc_object { name: "libminijail_gen_syscall_obj", vendor_available: true, + product_available: true, recovery_available: true, + header_libs: ["libc_headers"], // TODO(b/153662223): Clean this up. srcs: ["gen_syscalls.c"], cflags: [ "-dD", @@ -63,6 +103,7 @@ cc_object { "//apex_available:platform", "com.android.adbd", "com.android.media.swcodec", + "com.android.virt", ], min_sdk_version: "29", } @@ -70,6 +111,7 @@ cc_object { cc_genrule { name: "libminijail_gen_syscall", vendor_available: true, + product_available: true, recovery_available: true, tool_files: ["gen_syscalls.sh"], cmd: "$(location gen_syscalls.sh) $(in) $(out)", @@ -79,13 +121,16 @@ cc_genrule { "//apex_available:platform", "com.android.adbd", "com.android.media.swcodec", + "com.android.virt", ], } cc_object { name: "libminijail_gen_constants_obj", vendor_available: true, + product_available: true, recovery_available: true, + header_libs: ["libc_headers"], // TODO(b/153662223): Clean this up. srcs: ["gen_constants.c"], cflags: [ "-dD", @@ -97,6 +142,7 @@ cc_object { "//apex_available:platform", "com.android.adbd", "com.android.media.swcodec", + "com.android.virt", ], min_sdk_version: "29", } @@ -104,6 +150,7 @@ cc_object { cc_genrule { name: "libminijail_gen_constants", vendor_available: true, + product_available: true, recovery_available: true, tool_files: ["gen_constants.sh"], cmd: "$(location gen_constants.sh) $(in) $(out)", @@ -113,12 +160,14 @@ cc_genrule { "//apex_available:platform", "com.android.adbd", "com.android.media.swcodec", + "com.android.virt", ], } cc_library_static { name: "libminijail_generated", vendor_available: true, + product_available: true, recovery_available: true, defaults: ["libminijail_flags"], host_supported: true, @@ -141,6 +190,7 @@ cc_library_static { "//apex_available:platform", "com.android.adbd", "com.android.media.swcodec", + "com.android.virt", ], min_sdk_version: "29", } @@ -148,8 +198,10 @@ cc_library_static { cc_object { name: "libminijail_gen_constants_llvmir", vendor_available: true, + product_available: true, recovery_available: true, host_supported: true, + header_libs: ["libc_headers"], // TODO(b/153662223): Clean this up. cflags: [ "-S", "-O0", @@ -169,8 +221,10 @@ cc_object { cc_object { name: "libminijail_gen_syscall_llvmir", vendor_available: true, + product_available: true, recovery_available: true, host_supported: true, + header_libs: ["libc_headers"], // TODO(b/153662223): Clean this up. cflags: [ "-S", "-O0", @@ -194,6 +248,7 @@ cc_library { host_supported: true, vendor_available: true, + product_available: true, recovery_available: true, vndk: { enabled: true, @@ -223,6 +278,7 @@ cc_library { "//apex_available:platform", "com.android.adbd", "com.android.media.swcodec", + "com.android.virt", ], min_sdk_version: "29", } @@ -291,6 +347,7 @@ cc_test { srcs: [ "bpf.c", "syscall_filter.c", + "syscall_wrapper.c", "util.c", "syscall_filter_unittest.cc", ] + unittestSrcFiles, @@ -303,6 +360,10 @@ cc_test { test_suites: ["device-tests"], }, }, + test_options: { + unit_test: true, + }, + data: ["test/*"], } // System functionality unit tests using gtest. @@ -319,6 +380,7 @@ cc_test { host_supported: true, srcs: [ + "syscall_wrapper.c", "system.c", "util.c", "system_unittest.cc", @@ -449,24 +511,52 @@ cc_binary { shared_libs: minijailCommonLibraries + ["libminijail"], } -// Generated by cargo2android. -rust_library_host_rlib { +rust_defaults { + name: "libminijail_rust_defaults", + target: { + darwin: { + enabled: false, + }, + }, +} + +// This target was generated by cargo2android.py --run --device, with some +// manual fixes. +rust_library { name: "libminijail_sys", + defaults: ["libminijail_rust_defaults"], + host_supported: true, crate_name: "minijail_sys", - srcs: ["lib.rs"], + srcs: ["rust/minijail-sys/lib.rs"], edition: "2018", - rlibs: [ + rustlibs: [ "liblibc", ], - static_libs: [ - "libminijail", - ], shared_libs: [ "libcap", + "libminijail", + ], + apex_available: [ + "//apex_available:platform", + "com.android.virt", + ], +} + +// This target was generated by cargo2android.py --run --device, with some +// manual fixes. +rust_library { + name: "libminijail_rust", + defaults: ["libminijail_rust_defaults"], + host_supported: true, + crate_name: "minijail", + srcs: ["rust/minijail/src/lib.rs"], + edition: "2018", + rustlibs: [ + "liblibc", + "libminijail_sys", + ], + apex_available: [ + "//apex_available:platform", + "com.android.virt", ], - target: { - darwin: { - enabled: false, - }, - }, } @@ -14,8 +14,7 @@ For local experimentation (using Minijail libraries from the source directory): ``` $ make LIBDIR=/lib64 -$ sudo ./minijail0 --preload-library=./libminijailpreload.so \ - -u ${USER} -g 5000 -- /usr/bin/id +$ sudo ./minijail0.sh -u ${USER} -g 5000 -- /usr/bin/id ``` For system-wide usage, install `libminijail.so` and `libminijailpreload.so` to @@ -36,6 +35,14 @@ $ make tests Building the tests will automatically execute them. +## Code Review + +We use [Android Review] for Minijail code review. The easiest way to submit +changes for review is using `repo upload` on a Chromium OS or Android checkout. +Go to [Android Review HTTP Credentials] to obtain credentials to push code. For +more detailed instructions see the [Android source documentation] or the +[Chromium OS documentation]. + ## Source Style * Minijail uses kernel coding style: @@ -71,5 +78,9 @@ Please keep it in sync with [minijail0_cli.c]. [minijail0.1]: ./minijail0.1 [minijail0.5]: ./minijail0.5 [minijail0_cli.c]: ./minijail0_cli.c +[Android Review]: https://android-review.googlesource.com/ +[Android Review HTTP Credentials]: https://android-review.googlesource.com/settings/#HTTPCredentials +[Android source documentation]: https://source.android.com/setup/start +[Chromium OS documentation]: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/developer_guide.md [Google Markdown style guide]: https://github.com/google/styleguide/blob/gh-pages/docguide/style.md [Google Test]: https://github.com/google/googletest diff --git a/METADATA b/METADATA new file mode 100644 index 0000000..d97975c --- /dev/null +++ b/METADATA @@ -0,0 +1,3 @@ +third_party { + license_type: NOTICE +} @@ -25,8 +25,8 @@ CPPFLAGS += -DALLOW_DEBUG_LOGGING endif ifeq ($(USE_ASAN),yes) -CPPFLAGS += -fsanitize=address -LDFLAGS += -fsanitize=address +CPPFLAGS += -fsanitize=address -fno-omit-frame-pointer +LDFLAGS += -fsanitize=address -fno-omit-frame-pointer USE_EXIT_ON_DIE = yes endif @@ -37,6 +37,11 @@ ifeq ($(USE_EXIT_ON_DIE),yes) CPPFLAGS += -DUSE_EXIT_ON_DIE endif +# Setting this flag allows duplicate syscalls definitions for seccomp filters. +ifeq ($(ALLOW_DUPLICATE_SYSCALLS),yes) +CPPFLAGS += -DALLOW_DUPLICATE_SYSCALLS +endif + MJ_COMMON_FLAGS = -Wunused-parameter -Wextra -Wno-missing-field-initializers CFLAGS += $(MJ_COMMON_FLAGS) CXXFLAGS += $(MJ_COMMON_FLAGS) @@ -194,7 +199,7 @@ $(eval $(call add_object_rules,libconstants.gen.o,CC,c,CFLAGS)) ifeq ($(USE_SYSTEM_GTEST),no) # Points to the root of Google Test, relative to where this file is. # Remember to tweak this if you move this file. -GTEST_DIR = googletest-release-1.8.0/googletest +GTEST_DIR = googletest-release-1.10.0/googletest # Flags passed to the preprocessor. # Set Google Test's header directory as a system directory, such that @@ -1,9 +1,5 @@ set noparent jorgelo@google.com -lhchavez@google.com drewry@google.com keescook@google.com vapier@google.com - -per-file Cargo.toml = file:/OWNERS.rust -per-file *.rs = file:/OWNERS.rust @@ -1,6 +1,9 @@ # Minijail -The Minijail homepage and main repo is +The Minijail homepage is +https://google.github.io/minijail/. + +The main source repo is https://android.googlesource.com/platform/external/minijail/. There might be other copies floating around, but this is the official one! @@ -60,7 +63,7 @@ We've got a couple of contact points. The following talk serves as a good introduction to Minijail and how it can be used. [Video](https://drive.google.com/file/d/0BwPS_JpKyELWZTFBcTVsa1hhYjA/preview), -[slides](https://docs.google.com/presentation/d/1r6LpvDZtYrsl7ryOV4HtpUR-phfCLRL6PA-chcL1Kno/present). +[slides](https://docs.google.com/presentation/d/e/2PACX-1vRBqpin5xR9sng6lIBPjG0XQtu-uWWgr0ds-M3zW13XpDO-bTcMERLwoHUEB9078p1yqr9L-su9n5dk/pub). ## Example usage @@ -90,3 +93,24 @@ CapPrm: 0000000000003000 CapEff: 0000000000003000 CapBnd: 0000000000003000 ``` + +## Historical notes + +Q. "Why is it called minijail0?" + +A. It is minijail0 because it was a rewrite of an earlier program named +minijail, which was considerably less mini, and in particular had a dependency +on libchrome (the Chrome OS packaged version of Chromium's //base). We needed a +new name to not collide with the deprecated one. + +We didn't want to call it minijail2 or something that would make people +start using it before we were ready, and it was also concretely _less_ since it +dropped libbase, etc. Technically, we needed to be able to fork/preload with +minimal extra syscall noise which was too hard with libbase at the time (onexit +handlers, etc that called syscalls we didn't want to allow). Also, Elly made a +strong case that C would be the right choice for this for linking and ease of +controlled surprise system call use. + +https://crrev.com/c/4585/ added the original implementation. + +Source: Conversations with original authors, ellyjones@ and wad@. @@ -236,6 +236,11 @@ size_t bpf_arg_comp(struct sock_filter **pfilter, int op, int argidx, unsigned char jt, unsigned char jf); int flip = 0; + if (!filter) { + *pfilter = NULL; + return 0; + } + /* Load arg */ curr_block += bpf_load_arg(curr_block, argidx); @@ -44,14 +44,18 @@ enum { /* * BPF return values and data structures, * since they're not yet in the kernel. + * TODO(crbug.com/1147037): Replace this with an #include. */ -#define SECCOMP_RET_KILL 0x00000000U /* kill the task immediately */ -#define SECCOMP_RET_TRAP 0x00030000U /* return SIGSYS */ -#define SECCOMP_RET_ERRNO 0x00050000U /* return -1 and set errno */ -#define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */ -#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */ -#define SECCOMP_RET_DATA 0x0000ffffU /* mask for return value */ +#define SECCOMP_RET_KILL_PROCESS 0x80000000U /* kill the entire process */ +#define SECCOMP_RET_KILL_THREAD 0x00000000U /* kill the thread */ +#define SECCOMP_RET_KILL SECCOMP_RET_KILL_THREAD +#define SECCOMP_RET_TRAP 0x00030000U /* return SIGSYS */ +#define SECCOMP_RET_ERRNO 0x00050000U /* return -1 and set errno */ +#define SECCOMP_RET_LOG 0x7ffc0000U /* allow after logging */ +#define SECCOMP_RET_ALLOW 0x7fff0000U /* allow */ + +#define SECCOMP_RET_DATA 0x0000ffffU /* mask for return value */ struct seccomp_data { int nr; @@ -166,6 +170,9 @@ static inline size_t set_bpf_instr(struct sock_filter *instr, #define set_bpf_ret_kill(_block) \ set_bpf_stmt((_block), BPF_RET+BPF_K, SECCOMP_RET_KILL) +#define set_bpf_ret_kill_process(_block) \ + set_bpf_stmt((_block), BPF_RET+BPF_K, SECCOMP_RET_KILL_PROCESS) + #define set_bpf_ret_trap(_block) \ set_bpf_stmt((_block), BPF_RET+BPF_K, SECCOMP_RET_TRAP) diff --git a/gen_constants-inl.h b/gen_constants-inl.h index 1248254..8a09adb 100644 --- a/gen_constants-inl.h +++ b/gen_constants-inl.h @@ -1,6 +1,11 @@ +/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + #if defined(__i386__) || defined(__x86_64__) #include <asm/prctl.h> -#endif // __i386__ || __x86_64__ +#endif /* __i386__ || __x86_64__ */ #include <errno.h> #include <fcntl.h> #include <linux/fd.h> @@ -23,8 +28,48 @@ #include "arch.h" -// These defines use C structures that are not defined in the same headers which -// cause our CPP logic to fail w/undefined identifiers. Remove them to avoid -// build errors on such broken systems. +/* These defines use C structures that are not defined in the same headers which + * cause our CPP logic to fail w/undefined identifiers. Remove them to avoid + * build errors on such broken systems. + */ #undef BLKTRACESETUP #undef FS_IOC_FIEMAP + +/* The old glibc bundled with the Android host toolchain is missing some ioctl + * definitions used by minijail policy in crosvm and other projects. Locally + * define them below. + * This UAPI is taken from sanitized bionic headers. + */ + +/* <linux/fs.h> */ +#if !defined(FS_IOC_FSGETXATTR) && !defined(FS_IOC_FSSETXATTR) +struct fsxattr { + __u32 fsx_xflags; + __u32 fsx_extsize; + __u32 fsx_nextents; + __u32 fsx_projid; + __u32 fsx_cowextsize; + unsigned char fsx_pad[8]; +}; +#define FS_IOC_FSGETXATTR _IOR('X', 31, struct fsxattr) +#define FS_IOC_FSSETXATTR _IOW('X', 32, struct fsxattr) +#endif /* !FS_IOC_FSGETXATTR && !FS_IOC_FSSETXATTR */ + +/* <linux/fscrypt.h> */ +#if !defined(FS_IOC_SET_ENCRYPTION_POLICY) && \ + !defined(FS_IOC_GET_ENCRYPTION_POLICY) +#define FSCRYPT_KEY_DESCRIPTOR_SIZE 8 +struct fscrypt_policy_v1 { + __u8 version; + __u8 contents_encryption_mode; + __u8 filenames_encryption_mode; + __u8 flags; + __u8 master_key_descriptor[FSCRYPT_KEY_DESCRIPTOR_SIZE]; +}; +#define fscrypt_policy fscrypt_policy_v1 +#define FS_IOC_SET_ENCRYPTION_POLICY _IOR('f', 19, struct fscrypt_policy) +#define FS_IOC_GET_ENCRYPTION_POLICY _IOW('f', 21, struct fscrypt_policy) +#endif /* !FS_IOC_SET_ENCRYPTION_POLICY && !FS_IOC_GET_ENCRYPTION_POLICY */ +#if !defined(FS_IOC_GET_ENCRYPTION_POLICY_EX) +#define FS_IOC_GET_ENCRYPTION_POLICY_EX _IOWR('f', 22, __u8[9]) +#endif diff --git a/gen_constants.sh b/gen_constants.sh index 4acf0bc..20f9f42 100755 --- a/gen_constants.sh +++ b/gen_constants.sh @@ -52,7 +52,7 @@ cat <<-EOF > "${OUTFILE}" #include "libconstants.h" const struct constant_entry constant_table[] = { $(${BUILD} | \ - grep -E '^#define [[:upper:]][[:upper:]0-9_]*(\s)+[[:alnum:]_]' | \ + grep -E '^#define [[:upper:]][[:upper:]0-9_]*[[:space:]]+[[:alnum:]_]' | \ grep -Ev '(SIGRTMAX|SIGRTMIN|SIG_|NULL)' | \ sort -u | \ sed -Ee "${SED_MULTILINE}") diff --git a/gen_syscalls-inl.h b/gen_syscalls-inl.h new file mode 100644 index 0000000..2004f7a --- /dev/null +++ b/gen_syscalls-inl.h @@ -0,0 +1,75 @@ +/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include <asm/unistd.h> + +/* Ideally minijail is compiled against a modern libc, which has modern copies + * of Linux uapi for ioctls, and unistd.h for syscalls. However, sometimes this + * isn't possible - such as when building with the Android host toolchain - so + * locally define the system calls in use in active seccomp policy files. + * This UAPI is taken from sanitized bionic headers. + */ + +#ifndef __NR_copy_file_range +#ifdef __x86_64__ +#define __NR_copy_file_range 326 +#elif __i386__ +#define __NR_copy_file_range 377 +#elif __arm64__ +#define __NR_copy_file_range 285 +#endif +#endif /* __NR_copy_file_range */ + +#ifndef __NR_getrandom +#ifdef __x86_64__ +#define __NR_getrandom 318 +#elif __i386__ +#define __NR_getrandom 355 +#elif __arm64__ +#define __NR_getrandom 278 +#endif +#endif /* __NR_getrandom */ + +#ifndef __NR_memfd_create +#ifdef __x86_64__ +#define __NR_memfd_create 319 +#elif __i386__ +#define __NR_memfd_create 356 +#elif __arm64__ +#define __NR_memfd_create 279 +#endif +#endif /* __NR_memfd_create */ + +#ifndef __NR_renameat2 +#ifdef __x86_64__ +#define __NR_renameat2 316 +#elif __i386__ +#define __NR_renameat2 353 +#elif __arm64__ +#define __NR_renameat2 276 +#endif +#endif /* __NR_renameat2 */ + +#ifndef __NR_statx +#ifdef __x86_64__ +#define __NR_statx 332 +#elif __i386__ +#define __NR_statx 383 +#elif __arm64__ +#define __NR_statx 291 +#endif +#endif /* __NR_statx */ + +#ifndef __NR_io_uring_enter +#define __NR_io_uring_enter 426 +#endif + +#ifndef __NR_io_uring_register +#define __NR_io_uring_register 427 +#endif + +#ifndef __NR_io_uring_setup +#define __NR_io_uring_setup 425 +#endif diff --git a/gen_syscalls.sh b/gen_syscalls.sh index 43e39b7..7e1707c 100755 --- a/gen_syscalls.sh +++ b/gen_syscalls.sh @@ -48,10 +48,13 @@ SED_MULTILINE='s/#define __(ARM_)?(NR_)([[:lower:]0-9_]*) (.*)$/#ifdef __\1\2\3\ cat <<-EOF > "${OUTFILE}" /* GENERATED BY MAKEFILE */ #include <stddef.h> -#include <asm/unistd.h> +#include "gen_syscalls-inl.h" #include "libsyscalls.h" const struct syscall_entry syscall_table[] = { $(${BUILD} | sed -Ene "${SED_MULTILINE}") { NULL, -1 }, }; + +const size_t syscall_table_size = + sizeof(syscall_table) / sizeof(syscall_table[0]); EOF diff --git a/get_googletest.sh b/get_googletest.sh index 1708dcb..b379441 100755 --- a/get_googletest.sh +++ b/get_googletest.sh @@ -1,6 +1,6 @@ #/bin/bash -PV="1.8.0" +PV="1.10.0" wget -q -nc --secure-protocol=TLSv1 "https://github.com/google/googletest/archive/release-${PV}.tar.gz" -O "googletest-release-${PV}.tar.gz" tar zxvf "googletest-release-${PV}.tar.gz" diff --git a/libminijail.c b/libminijail.c index 7a82ccc..0820dbb 100644 --- a/libminijail.c +++ b/libminijail.c @@ -8,6 +8,7 @@ #define _GNU_SOURCE #include <asm/unistd.h> +#include <assert.h> #include <dirent.h> #include <errno.h> #include <fcntl.h> @@ -26,6 +27,7 @@ #include <sys/param.h> #include <sys/prctl.h> #include <sys/resource.h> +#include <sys/select.h> #include <sys/stat.h> #include <sys/sysmacros.h> #include <sys/types.h> @@ -48,27 +50,6 @@ # define PR_ALT_SYSCALL 0x43724f53 #endif -/* Seccomp filter related flags. */ -#ifndef PR_SET_NO_NEW_PRIVS -# define PR_SET_NO_NEW_PRIVS 38 -#endif - -#ifndef SECCOMP_MODE_FILTER -#define SECCOMP_MODE_FILTER 2 /* Uses user-supplied filter. */ -#endif - -#ifndef SECCOMP_SET_MODE_STRICT -# define SECCOMP_SET_MODE_STRICT 0 -#endif -#ifndef SECCOMP_SET_MODE_FILTER -# define SECCOMP_SET_MODE_FILTER 1 -#endif - -#ifndef SECCOMP_FILTER_FLAG_TSYNC -# define SECCOMP_FILTER_FLAG_TSYNC 1 -#endif -/* End seccomp filter related flags. */ - /* New cgroup namespace might not be in linux-headers yet. */ #ifndef CLONE_NEWCGROUP # define CLONE_NEWCGROUP 0x02000000 @@ -107,6 +88,12 @@ struct mountpoint { struct mountpoint *next; }; +struct minijail_remount { + unsigned long remount_mode; + char *mount_name; + struct minijail_remount *next; +}; + struct hook { minijail_hook_t hook; void *payload; @@ -149,6 +136,7 @@ struct minijail { int seccomp_filter : 1; int seccomp_filter_tsync : 1; int seccomp_filter_logging : 1; + int seccomp_filter_allow_speculation : 1; int chroot : 1; int pivot_root : 1; int mount_dev : 1; @@ -189,6 +177,8 @@ struct minijail { struct mountpoint *mounts_tail; size_t mounts_count; unsigned long remount_mode; + struct minijail_remount *remounts_head; + struct minijail_remount *remounts_tail; size_t tmpfs_size; char *cgroups[MAX_CGROUPS]; size_t cgroup_count; @@ -219,6 +209,18 @@ static void free_mounts_list(struct minijail *j) j->mounts_tail = NULL; } +static void free_remounts_list(struct minijail *j) +{ + while (j->remounts_head) { + struct minijail_remount *m = j->remounts_head; + j->remounts_head = j->remounts_head->next; + free(m->mount_name); + free(m); + } + // No need to clear remounts_head as we know it's NULL after the loop. + j->remounts_tail = NULL; +} + /* * Writes exactly n bytes from buf to file descriptor fd. * Returns 0 on success or a negative error code on error. @@ -271,6 +273,7 @@ void minijail_preenter(struct minijail *j) j->flags.forward_signals = 0; j->flags.setsid = 0; j->remount_mode = 0; + free_remounts_list(j); } /* @@ -313,7 +316,9 @@ void minijail_preexec(struct minijail *j) struct minijail API *minijail_new(void) { struct minijail *j = calloc(1, sizeof(struct minijail)); - j->remount_mode = MS_PRIVATE; + if (j) { + j->remount_mode = MS_PRIVATE; + } return j; } @@ -427,6 +432,16 @@ void API minijail_set_seccomp_filter_tsync(struct minijail *j) j->flags.seccomp_filter_tsync = 1; } +void API minijail_set_seccomp_filter_allow_speculation(struct minijail *j) +{ + if (j->filter_len > 0 && j->filter_prog != NULL) { + die("minijail_set_seccomp_filter_allow_speculation() must be " + "called before minijail_parse_seccomp_filters()"); + } + + j->flags.seccomp_filter_allow_speculation = 1; +} + void API minijail_log_seccomp_filter_failures(struct minijail *j) { if (j->filter_len > 0 && j->filter_prog != NULL) { @@ -722,11 +737,6 @@ char API *minijail_get_original_path(struct minijail *j, return strdup(path_inside_chroot); } -size_t minijail_get_tmpfs_size(const struct minijail *j) -{ - return j->tmpfs_size; -} - void API minijail_mount_dev(struct minijail *j) { j->flags.mount_dev = 1; @@ -883,6 +893,33 @@ int API minijail_bind(struct minijail *j, const char *src, const char *dest, return minijail_mount(j, src, dest, "", flags); } +int API minijail_add_remount(struct minijail *j, const char *mount_name, + unsigned long remount_mode) +{ + struct minijail_remount *m; + + if (*mount_name != '/') + return -EINVAL; + m = calloc(1, sizeof(*m)); + if (!m) + return -ENOMEM; + m->mount_name = strdup(mount_name); + if (!m->mount_name) { + free(m); + return -ENOMEM; + } + + m->remount_mode = remount_mode; + + if (j->remounts_tail) + j->remounts_tail->next = m; + else + j->remounts_head = m; + j->remounts_tail = m; + + return 0; +} + int API minijail_add_hook(struct minijail *j, minijail_hook_t hook, void *payload, minijail_hook_event_t event) { @@ -936,6 +973,7 @@ static void clear_seccomp_options(struct minijail *j) j->flags.seccomp_filter = 0; j->flags.seccomp_filter_tsync = 0; j->flags.seccomp_filter_logging = 0; + j->flags.seccomp_filter_allow_speculation = 0; j->filter_len = 0; j->filter_prog = NULL; j->flags.no_new_privs = 0; @@ -986,6 +1024,15 @@ static int seccomp_should_use_filters(struct minijail *j) */ } } + if (j->flags.seccomp_filter_allow_speculation) { + /* Is the SPEC_ALLOW flag supported? */ + if (!seccomp_filter_flags_available( + SECCOMP_FILTER_FLAG_SPEC_ALLOW)) { + warn("allowing speculative execution on seccomp " + "processes not supported"); + j->flags.seccomp_filter_allow_speculation = 0; + } + } return 1; } @@ -1048,10 +1095,15 @@ static int parse_seccomp_filters(struct minijail *j, const char *filename, else filteropts.action = ACTION_RET_TRAP; } else { - if (j->flags.seccomp_filter_tsync) - filteropts.action = ACTION_RET_TRAP; - else + if (j->flags.seccomp_filter_tsync) { + if (seccomp_ret_kill_process_available()) { + filteropts.action = ACTION_RET_KILL_PROCESS; + } else { + filteropts.action = ACTION_RET_TRAP; + } + } else { filteropts.action = ACTION_RET_KILL; + } } /* @@ -1061,6 +1113,9 @@ static int parse_seccomp_filters(struct minijail *j, const char *filename, filteropts.allow_syscalls_for_logging = filteropts.allow_logging && !seccomp_ret_log_available(); + /* Whether to fail on duplicate syscalls. */ + filteropts.allow_duplicate_syscalls = allow_duplicate_syscalls(); + if (compile_filter(filename, policy_file, fprog, &filteropts)) { free(fprog); return -1; @@ -1150,15 +1205,16 @@ struct marshal_state { char *buf; }; -void marshal_state_init(struct marshal_state *state, char *buf, - size_t available) +static void marshal_state_init(struct marshal_state *state, char *buf, + size_t available) { state->available = available; state->buf = buf; state->total = 0; } -void marshal_append(struct marshal_state *state, void *src, size_t length) +static void marshal_append(struct marshal_state *state, const void *src, + size_t length) { size_t copy_len = MIN(state->available, length); @@ -1172,7 +1228,13 @@ void marshal_append(struct marshal_state *state, void *src, size_t length) state->total += length; } -void marshal_mount(struct marshal_state *state, const struct mountpoint *m) +static void marshal_append_string(struct marshal_state *state, const char *src) +{ + marshal_append(state, src, strlen(src) + 1); +} + +static void marshal_mount(struct marshal_state *state, + const struct mountpoint *m) { marshal_append(state, m->src, strlen(m->src) + 1); marshal_append(state, m->dest, strlen(m->dest) + 1); @@ -1183,23 +1245,23 @@ void marshal_mount(struct marshal_state *state, const struct mountpoint *m) marshal_append(state, (char *)&m->flags, sizeof(m->flags)); } -void minijail_marshal_helper(struct marshal_state *state, - const struct minijail *j) +static void minijail_marshal_helper(struct marshal_state *state, + const struct minijail *j) { struct mountpoint *m = NULL; size_t i; marshal_append(state, (char *)j, sizeof(*j)); if (j->user) - marshal_append(state, j->user, strlen(j->user) + 1); + marshal_append_string(state, j->user); if (j->suppl_gid_list) { marshal_append(state, j->suppl_gid_list, j->suppl_gid_count * sizeof(gid_t)); } if (j->chrootdir) - marshal_append(state, j->chrootdir, strlen(j->chrootdir) + 1); + marshal_append_string(state, j->chrootdir); if (j->hostname) - marshal_append(state, j->hostname, strlen(j->hostname) + 1); + marshal_append_string(state, j->hostname); if (j->alt_syscall_table) { marshal_append(state, j->alt_syscall_table, strlen(j->alt_syscall_table) + 1); @@ -1213,7 +1275,7 @@ void minijail_marshal_helper(struct marshal_state *state, marshal_mount(state, m); } for (i = 0; i < j->cgroup_count; ++i) - marshal_append(state, j->cgroups[i], strlen(j->cgroups[i]) + 1); + marshal_append_string(state, j->cgroups[i]); } size_t API minijail_size(const struct minijail *j) @@ -1251,6 +1313,8 @@ int minijail_unmarshal(struct minijail *j, char *serialized, size_t length) j->gidmap = NULL; j->mounts_head = NULL; j->mounts_tail = NULL; + j->remounts_head = NULL; + j->remounts_tail = NULL; j->filter_prog = NULL; j->hooks_head = NULL; j->hooks_tail = NULL; @@ -1380,6 +1444,7 @@ int minijail_unmarshal(struct minijail *j, char *serialized, size_t length) bad_cgroups: free_mounts_list(j); + free_remounts_list(j); for (i = 0; i < j->cgroup_count; ++i) free(j->cgroups[i]); bad_mounts: @@ -1521,6 +1586,11 @@ static int mount_dev(char **dev_path_ret) goto done; } + /* Create empty dir for glibc shared mem APIs. */ + ret = mkdirat(dev_fd, "shm", 01777); + if (ret) + goto done; + /* Restore old mask. */ done: close(dev_fd); @@ -1591,7 +1661,7 @@ static int mount_one(const struct minijail *j, struct mountpoint *m, setup_mount_destination(m->src, dest, j->uid, j->gid, (m->flags & MS_BIND), &original_mnt_flags); if (ret) { - warn("creating mount target '%s' failed", dest); + warn("cannot create mount target '%s'", dest); goto error; } @@ -1614,7 +1684,8 @@ static int mount_one(const struct minijail *j, struct mountpoint *m, ret = mount(m->src, dest, m->type, m->flags, m->data); if (ret) { - pwarn("bind: %s -> %s flags=%#lx", m->src, dest, m->flags); + pwarn("cannot bind-mount '%s' as '%s' with flags %#lx", m->src, + dest, m->flags); goto error; } @@ -1623,8 +1694,10 @@ static int mount_one(const struct minijail *j, struct mountpoint *m, mount(m->src, dest, NULL, m->flags | original_mnt_flags | MS_REMOUNT, m->data); if (ret) { - pwarn("bind remount: %s -> %s flags=%#lx", m->src, dest, - m->flags | original_mnt_flags | MS_REMOUNT); + pwarn( + "cannot bind-remount '%s' as '%s' with flags %#lx", + m->src, dest, + m->flags | original_mnt_flags | MS_REMOUNT); goto error; } } @@ -1650,12 +1723,10 @@ static void process_mounts_or_die(const struct minijail *j) pdie("mount_dev failed"); if (j->mounts_head && mount_one(j, j->mounts_head, dev_path)) { - if (dev_path) { - int saved_errno = errno; + if (dev_path) mount_dev_cleanup(dev_path); - errno = saved_errno; - } - pdie("mount_one failed"); + + _exit(MINIJAIL_ERR_MOUNT); } /* @@ -1771,19 +1842,37 @@ static int remount_proc_readonly(const struct minijail *j) * mutate our parent's mount as well, even though we're in a VFS * namespace (!). Instead, remove their mount from our namespace lazily * (MNT_DETACH) and make our own. + * + * However, we skip this in the user namespace case because it will + * invariably fail. Every mount namespace is "owned" by the + * user namespace of the process that creates it. Mount namespace A is + * "less privileged" than mount namespace B if A is created off of B, + * and B is owned by a different user namespace. + * When a less privileged mount namespace is created, the mounts used to + * initialize it (coming from the more privileged mount namespace) come + * as a unit, and are locked together. This means that code running in + * the new mount (and user) namespace cannot piecemeal unmount + * individual mounts inherited from a more privileged mount namespace. + * See https://man7.org/linux/man-pages/man7/mount_namespaces.7.html, + * "Restrictions on mount namespaces" for details. + * + * This happens in our use case because we first enter a new user + * namespace (on clone(2)) and then we unshare(2) a new mount namespace, + * which means the new mount namespace is less privileged than its + * parent mount namespace. This would also happen if we entered a new + * mount namespace on clone(2), since the user namespace is created + * first. + * In all other non-user-namespace cases the new mount namespace is + * similarly privileged as the parent mount namespace so unmounting a + * single mount is allowed. + * + * We still remount /proc as read-only in the user namespace case + * because while a process with CAP_SYS_ADMIN in the new user namespace + * can unmount the RO mount and get at the RW mount, an attacker with + * access only to a write primitive will not be able to modify /proc. */ - if (umount2(kProcPath, MNT_DETACH)) { - /* - * If we are in a new user namespace, umount(2) will fail. - * See http://man7.org/linux/man-pages/man7/user_namespaces.7.html - */ - if (j->flags.userns) { - info("umount(/proc, MNT_DETACH) failed, " - "this is expected when using user namespaces"); - } else { - return -errno; - } - } + if (!j->flags.userns && umount2(kProcPath, MNT_DETACH)) + return -errno; if (mount("proc", kProcPath, "proc", kSafeFlags | MS_RDONLY, "")) return -errno; return 0; @@ -2076,9 +2165,16 @@ static void set_seccomp_filter(const struct minijail *j) * Install the syscall filter. */ if (j->flags.seccomp_filter) { - if (j->flags.seccomp_filter_tsync) { - if (sys_seccomp(SECCOMP_SET_MODE_FILTER, - SECCOMP_FILTER_FLAG_TSYNC, + if (j->flags.seccomp_filter_tsync || + j->flags.seccomp_filter_allow_speculation) { + int filter_flags = + (j->flags.seccomp_filter_tsync + ? SECCOMP_FILTER_FLAG_TSYNC + : 0) | + (j->flags.seccomp_filter_allow_speculation + ? SECCOMP_FILTER_FLAG_SPEC_ALLOW + : 0); + if (sys_seccomp(SECCOMP_SET_MODE_FILTER, filter_flags, j->filter_prog)) { pdie("seccomp(tsync) failed"); } @@ -2208,9 +2304,24 @@ void API minijail_enter(const struct minijail *j) if (j->remount_mode) { if (mount(NULL, "/", NULL, MS_REC | j->remount_mode, NULL)) - pdie("mount(NULL, /, NULL, MS_REC | MS_PRIVATE," - " NULL) failed"); + pdie("mount(NULL, /, NULL, " + "MS_REC | j->remount_mode, NULL) failed"); + + struct minijail_remount *temp = j->remounts_head; + while (temp) { + if (temp->remount_mode < j->remount_mode) + die("cannot remount %s as stricter " + "than the root dir", + temp->mount_name); + if (mount(NULL, temp->mount_name, NULL, + MS_REC | temp->remount_mode, NULL)) + pdie("mount(NULL, %s, NULL, " + "MS_REC | temp->remount_mode, NULL) " + "failed", temp->mount_name); + temp = temp->next; + } } + } if (j->flags.ipc && unshare(CLONE_NEWIPC)) { @@ -2333,12 +2444,12 @@ void API minijail_enter(const struct minijail *j) /* TODO(wad): will visibility affect this variable? */ static int init_exitstatus = 0; -void init_term(int sig attribute_unused) +static void init_term(int sig attribute_unused) { _exit(init_exitstatus); } -void init(pid_t rootpid) +static void init(pid_t rootpid) { pid_t pid; int status; @@ -2407,6 +2518,26 @@ error: return err; } +int API minijail_copy_jail(const struct minijail *from, struct minijail *out) +{ + size_t sz = minijail_size(from); + if (!sz) + return -EINVAL; + + char *buf = malloc(sz); + if (!buf) + return -ENOMEM; + + int err = minijail_marshal(from, buf, sz); + if (err) + goto error; + + err = minijail_unmarshal(out, buf, sz); +error: + free(buf); + return err; +} + static int setup_preload(const struct minijail *j attribute_unused, char ***child_env attribute_unused) { @@ -2483,14 +2614,94 @@ static int close_open_fds(int *inheritable_fds, size_t size) return 0; } +/* Return true if the specified file descriptor is already open. */ +static int fd_is_open(int fd) +{ + return fcntl(fd, F_GETFD) != -1 || errno != EBADF; +} + +static_assert(FD_SETSIZE >= MAX_PRESERVED_FDS * 2 - 1, + "If true, ensure_no_fd_conflict will always find an unused fd."); + +/* If p->parent_fd will be used by a child_fd, move it to an unused fd. */ +static int ensure_no_fd_conflict(const fd_set* child_fds, + struct preserved_fd* p) +{ + if (!FD_ISSET(p->parent_fd, child_fds)){ + return 0; + } + + /* + * If no other parent_fd matches the child_fd then use it instead of a + * temporary. + */ + int fd = p->child_fd; + if (fd_is_open(fd)) { + fd = FD_SETSIZE - 1; + while (FD_ISSET(fd, child_fds) || fd_is_open(fd)) { + --fd; + if (fd < 0) { + die("failed to find an unused fd"); + } + } + } + + int ret = dup2(p->parent_fd, fd); + /* + * warn() opens a file descriptor so it needs to happen after dup2 to + * avoid unintended side effects. This can be avoided by reordering the + * mapping requests so that the source fds with overlap are mapped + * first (unless there are cycles). + */ + warn("mapped fd overlap: moving %d to %d", p->parent_fd, fd); + if (ret == -1) { + return -1; + } + + p->parent_fd = fd; + return 0; +} + static int redirect_fds(struct minijail *j) { + fd_set child_fds; + FD_ZERO(&child_fds); + + /* Relocate parent_fds that would be replaced by a child_fd. */ + for (size_t i = 0; i < j->preserved_fd_count; i++) { + int child_fd = j->preserved_fds[i].child_fd; + if (FD_ISSET(child_fd, &child_fds)) { + die("fd %d is mapped more than once", child_fd); + } + + if (ensure_no_fd_conflict(&child_fds, + &j->preserved_fds[i]) == -1) { + return -1; + } + + FD_SET(child_fd, &child_fds); + } + for (size_t i = 0; i < j->preserved_fd_count; i++) { + if (j->preserved_fds[i].parent_fd == + j->preserved_fds[i].child_fd) { + continue; + } if (dup2(j->preserved_fds[i].parent_fd, j->preserved_fds[i].child_fd) == -1) { return -1; } } + /* + * After all fds have been duped, we are now free to close all parent + * fds that are *not* child fds. + */ + for (size_t i = 0; i < j->preserved_fd_count; i++) { + int parent_fd = j->preserved_fds[i].parent_fd; + if (!FD_ISSET(parent_fd, &child_fds)) { + close(parent_fd); + } + } return 0; } @@ -2537,10 +2748,10 @@ static void setup_child_std_fds(struct minijail *j, }; for (size_t i = 0; i < ARRAY_SIZE(fd_map); ++i) { - if (fd_map[i].from != -1) { - if (dup2(fd_map[i].from, fd_map[i].to) == -1) - die("failed to set up %s pipe", fd_map[i].name); - } + if (fd_map[i].from == -1 || fd_map[i].from == fd_map[i].to) + continue; + if (dup2(fd_map[i].from, fd_map[i].to) == -1) + die("failed to set up %s pipe", fd_map[i].name); } /* Close temporary pipe file descriptors. */ @@ -3158,18 +3369,7 @@ minijail_run_config_internal(struct minijail *j, return ret; } -int API minijail_kill(struct minijail *j) -{ - if (j->initpid <= 0) - return -ECHILD; - - if (kill(j->initpid, SIGTERM)) - return -errno; - - return minijail_wait(j); -} - -int API minijail_wait(struct minijail *j) +static int minijail_wait_internal(struct minijail *j, int expected_signal) { if (j->initpid <= 0) return -ECHILD; @@ -3187,8 +3387,10 @@ int API minijail_wait(struct minijail *j) int error_status = st; if (WIFSIGNALED(st)) { int signum = WTERMSIG(st); - warn("child process %d received signal %d", - j->initpid, signum); + if (signum != expected_signal) { + warn("child process %d received signal %d", + j->initpid, signum); + } /* * We return MINIJAIL_ERR_JAIL if the process received * SIGSYS, which happens when a syscall is blocked by @@ -3213,6 +3415,22 @@ int API minijail_wait(struct minijail *j) return exit_status; } +int API minijail_kill(struct minijail *j) +{ + if (j->initpid <= 0) + return -ECHILD; + + if (kill(j->initpid, SIGTERM)) + return -errno; + + return minijail_wait_internal(j, SIGTERM); +} + +int API minijail_wait(struct minijail *j) +{ + return minijail_wait_internal(j, 0); +} + void API minijail_destroy(struct minijail *j) { size_t i; @@ -3222,6 +3440,7 @@ void API minijail_destroy(struct minijail *j) free(j->filter_prog); } free_mounts_list(j); + free_remounts_list(j); while (j->hooks_head) { struct hook *c = j->hooks_head; j->hooks_head = c->next; diff --git a/libminijail.h b/libminijail.h index 9eefe0a..cfd42d2 100644 --- a/libminijail.h +++ b/libminijail.h @@ -42,6 +42,9 @@ enum { /* (MINIJAIL_ERR_SIG_BASE + n) if process killed by signal n != SIGSYS */ MINIJAIL_ERR_SIG_BASE = 128, + /* Cannot mount a file or folder in mount namespace */ + MINIJAIL_ERR_MOUNT = 251, + MINIJAIL_ERR_PRELOAD = 252, /* Process killed by SIGSYS */ @@ -103,6 +106,15 @@ void minijail_use_seccomp(struct minijail *j); void minijail_no_new_privs(struct minijail *j); void minijail_use_seccomp_filter(struct minijail *j); void minijail_set_seccomp_filter_tsync(struct minijail *j); +/* + * Allow speculative execution features that may cause data leaks across + * processes, by setting the SECCOMP_FILTER_FLAG_SPEC_ALLOW seccomp flag. + * + * WARNING: Enabling this may make the process vulnerable to speculative + * execution attacks (Branch Target Injection, and Speculative Store Bypass). + * This is only safe to use for processes that do not execute untrusted code. + */ +void minijail_set_seccomp_filter_allow_speculation(struct minijail *j); /* Does not take ownership of |filter|. */ void minijail_set_seccomp_filters(struct minijail *j, const struct sock_fprog *filter); @@ -278,6 +290,18 @@ int minijail_bind(struct minijail *j, const char *src, const char *dest, int writeable); /* + * minijail_add_remount: when entering minijail @j, remounts @mount_name and all + * subdirectories as @remount_mode rather than the default MS_PRIVATE + * @j minijail to bind inside + * @mount_name mount to remount + * @remount_mode remount mode to use + * + * This may be called multiple times; this overrides |j->remount_mode| for the + * given mount. + */ +int minijail_add_remount(struct minijail *j, const char *mount_name, + unsigned long remount_mode); +/* * minijail_add_hook: adds @hook to the list of hooks that will be * invoked when @event is reached during minijail setup. The caller is * responsible for the lifetime of @payload. @@ -460,6 +484,16 @@ int minijail_wait(struct minijail *j); void minijail_destroy(struct minijail *j); /* + * Deep copies the minijail in |from| to |out| providing two identical jails + * that can be used to contain separate children created with minijail_fork(). + * + * Duplicating a jail is invalid after a jail has been passed to + * minijail_fork(). Many minijail_*() calls will yield undefined + * results when called on a jail duplicated post-fork. + */ +int minijail_copy_jail(const struct minijail *from, struct minijail *out); + +/* * minijail_log_to_fd: redirects the module-wide logging to an FD instead of * syslog. * @fd FD to log to. Caller must ensure this is available after @@ -470,7 +504,7 @@ void minijail_destroy(struct minijail *j); void minijail_log_to_fd(int fd, int min_priority); #ifdef __cplusplus -}; /* extern "C" */ +} /* extern "C" */ #endif #endif /* !_LIBMINIJAIL_H_ */ diff --git a/libminijail_unittest.cc b/libminijail_unittest.cc index 18d016d..78e3cfb 100644 --- a/libminijail_unittest.cc +++ b/libminijail_unittest.cc @@ -61,8 +61,15 @@ std::set<pid_t> GetProcessSubtreePids(pid_t root_pid) { std::string path = "/proc/" + std::to_string(pid) + "/stat"; FILE* f = fopen(path.c_str(), "re"); - if (!f) + if (!f) { + if (errno == ENOENT) { + // This loop is inherently racy, since PIDs can be reaped in the + // middle of this. Not being able to find one /proc/PID/stat file is + // completely normal. + continue; + } pdie("fopen(%s)", path.c_str()); + } pid_t ppid; int ret = fscanf(f, "%*d (%*[^)]) %*c %d", &ppid); fclose(f); @@ -95,9 +102,6 @@ std::map<std::string, std::string> GetNamespaces( } // namespace -/* Prototypes needed only by test. */ -size_t minijail_get_tmpfs_size(const struct minijail *); - /* Silence unused variable warnings. */ TEST(silence, silence_unused) { EXPECT_STREQ(kLdPreloadEnvVar, kLdPreloadEnvVar); @@ -217,6 +221,10 @@ TEST_F(MarshalTest, 0xff) { EXPECT_EQ(-EINVAL, minijail_unmarshal(j_, buf_, sizeof(buf_))); } +TEST_F(MarshalTest, copy_empty) { + ASSERT_EQ(0, minijail_copy_jail(m_, j_)); +} + TEST(KillTest, running_process) { const ScopedMinijail j(minijail_new()); char* const argv[] = {"sh", "-c", "sleep 1000", nullptr}; @@ -314,6 +322,88 @@ TEST(WaitTest, can_wait_only_once) { EXPECT_EQ(minijail_wait(j.get()), -ECHILD); } +TEST(Test, minijail_preserve_fd_no_leak) { + const ScopedMinijail j(minijail_new()); + char* const script = R"( + echo Hi >&1; + exec 1>&-; + read line1; + read line2; + echo "$line1$line2 and Goodbye" >&2; + exit 42; + )"; + char* const argv[] = {"sh", "-c", script, nullptr}; + + const int npipes = 3; + int fds[npipes][2]; + + // Create pipes. + for (int i = 0; i < npipes; ++i) { + ASSERT_EQ(pipe(fds[i]), 0); + } + + // All pipes are output pipes except for the first one which is used as + // input pipe. + std::swap(fds[0][0], fds[0][1]); + + for (int i = 0; i < npipes; ++i) { + const int fd = fds[i][1]; + minijail_preserve_fd(j.get(), fd, i); + } + + minijail_close_open_fds(j.get()); + + EXPECT_EQ(minijail_run_no_preload(j.get(), kShellPath, argv), 0); + + // Close unused end of pipes. + for (int i = 0; i < npipes; ++i) { + const int fd = fds[i][1]; + ASSERT_EQ(close(fd), 0); + } + + const int in = fds[0][0]; + const int out = fds[1][0]; + const int err = fds[2][0]; + + char buf[PIPE_BUF]; + ssize_t nbytes; + + // Check that stdout pipe works. + nbytes = read(out, buf, PIPE_BUF); + ASSERT_GT(nbytes, 0); + EXPECT_EQ(std::string(buf, nbytes), "Hi\n"); + + // Check that the write end of stdout pipe got closed by the child process. If + // the child process kept other file descriptors connected to stdout, then the + // parent process wouldn't be able to detect that all write ends of this pipe + // are closed and it would block here. + EXPECT_EQ(read(out, buf, PIPE_BUF), 0); + ASSERT_EQ(close(out), 0); + + // Check that stdin pipe works. + const std::string s = "Greetings\n"; + EXPECT_EQ(write(in, s.data(), s.size()), s.size()); + + // Close write end of pipe connected to child's stdin. If there was another + // file descriptor connected to this write end, then the child process + // wouldn't be able to detect that this write end is closed and it would + // block. + ASSERT_EQ(close(in), 0); + + // Check that child process continued and ended. + nbytes = read(err, buf, PIPE_BUF); + ASSERT_GT(nbytes, 0); + EXPECT_EQ(std::string(buf, nbytes), "Greetings and Goodbye\n"); + + // Check that the write end of the stderr pipe is closed when the child + // process finishes. + EXPECT_EQ(read(err, buf, PIPE_BUF), 0); + ASSERT_EQ(close(err), 0); + + // Check the child process termination status. + EXPECT_EQ(minijail_wait(j.get()), 42); +} + TEST(Test, close_original_pipes_after_dup2) { // Pipe used by child process to signal that it continued after reading from // stdin. @@ -363,7 +453,9 @@ TEST(Test, close_original_pipes_after_dup2) { // to stdout and stderr, then the parent process wouldn't be able to detect // that all write ends of these pipes are closed and it would block here. EXPECT_EQ(read(out, buf, PIPE_BUF), 0); + ASSERT_EQ(close(out), 0); EXPECT_EQ(read(err, buf, PIPE_BUF), 0); + ASSERT_EQ(close(err), 0); // Check that stdin pipe works. const std::string s = "Greetings\n"; @@ -384,10 +476,8 @@ TEST(Test, close_original_pipes_after_dup2) { TEST(Test, minijail_run_env_pid_pipes) { // TODO(crbug.com/895875): The preload library interferes with ASan since they // both need to use LD_PRELOAD. - if (running_with_asan()) { - SUCCEED(); - return; - } + if (running_with_asan()) + GTEST_SKIP(); ScopedMinijail j(minijail_new()); minijail_set_preload_path(j.get(), kPreloadPath); @@ -446,7 +536,12 @@ TEST(Test, minijail_run_env_pid_pipes) { EXPECT_EQ(WEXITSTATUS(status), 0); } -TEST(Test, minijail_run_env_pid_pipes_no_preload) { +TEST(Test, minijail_run_env_pid_pipes_with_local_preload) { + // TODO(crbug.com/895875): The preload library interferes with ASan since they + // both need to use LD_PRELOAD. + if (running_with_asan()) + GTEST_SKIP(); + ScopedMinijail j(minijail_new()); char *argv[4]; @@ -465,7 +560,7 @@ TEST(Test, minijail_run_env_pid_pipes_no_preload) { EXPECT_EQ(write_ret, static_cast<ssize_t>(teststr_len)); char buf[kBufferSize] = {}; - ssize_t read_ret = read(child_stdout, buf, 8); + ssize_t read_ret = read(child_stdout, buf, sizeof(buf) - 1); EXPECT_EQ(read_ret, static_cast<ssize_t>(teststr_len)); EXPECT_STREQ(buf, teststr); @@ -487,6 +582,9 @@ TEST(Test, minijail_run_env_pid_pipes_no_preload) { // Set a canary env var in the parent that should not be present in the child. ASSERT_EQ(setenv("TEST_PARENT", "test", 1 /*overwrite*/), 0); + // Use the preload library from this test build. + ASSERT_EQ(0, minijail_set_preload_path(j.get(), "./libminijailpreload.so")); + int child_stderr; mj_run_ret = minijail_run_env_pid_pipes(j.get(), argv[0], argv, envp, &pid, @@ -494,7 +592,7 @@ TEST(Test, minijail_run_env_pid_pipes_no_preload) { EXPECT_EQ(mj_run_ret, 0); memset(buf, 0, sizeof(buf)); - read_ret = read(child_stderr, buf, sizeof(buf)); + read_ret = read(child_stderr, buf, sizeof(buf) - 1); EXPECT_GE(read_ret, 0); EXPECT_STREQ(buf, "|test\n"); @@ -769,10 +867,8 @@ TEST_F(NamespaceTest, test_tmpfs_userns) { constexpr uid_t kTargetUid = 1000; // Any non-zero value will do. constexpr gid_t kTargetGid = 1000; - if (!userns_supported_) { - SUCCEED(); - return; - } + if (!userns_supported_) + GTEST_SKIP(); struct minijail *j = minijail_new(); @@ -809,10 +905,8 @@ TEST_F(NamespaceTest, test_namespaces) { // TODO(crbug.com/895875): The preload library interferes with ASan since they // both need to use LD_PRELOAD. - if (!userns_supported_ || running_with_asan()) { - SUCCEED(); - return; - } + if (!userns_supported_ || running_with_asan()) + GTEST_SKIP(); std::string uidmap = "0 " + std::to_string(getuid()) + " 1"; std::string gidmap = "0 " + std::to_string(getgid()) + " 1"; @@ -894,10 +988,8 @@ TEST_F(NamespaceTest, test_namespaces) { TEST_F(NamespaceTest, test_enter_ns) { char uidmap[kBufferSize], gidmap[kBufferSize]; - if (!userns_supported_) { - SUCCEED(); - return; - } + if (!userns_supported_) + GTEST_SKIP(); // We first create a child in a new userns so we have privs to run more tests. // We can't combine the steps as the kernel disallows many resource sharing @@ -963,56 +1055,156 @@ TEST_F(NamespaceTest, test_enter_ns) { } } -TEST(Test, parse_size) { - size_t size; - - ASSERT_EQ(0, parse_size(&size, "42")); - ASSERT_EQ(42U, size); - - ASSERT_EQ(0, parse_size(&size, "16K")); - ASSERT_EQ(16384U, size); - - ASSERT_EQ(0, parse_size(&size, "1M")); - ASSERT_EQ(1024U * 1024, size); - - uint64_t gigabyte = 1024ULL * 1024 * 1024; - ASSERT_EQ(0, parse_size(&size, "3G")); - ASSERT_EQ(3U, size / gigabyte); - ASSERT_EQ(0U, size % gigabyte); - - ASSERT_EQ(0, parse_size(&size, "4294967294")); - ASSERT_EQ(3U, size / gigabyte); - ASSERT_EQ(gigabyte - 2, size % gigabyte); - -#if __WORDSIZE == 64 - uint64_t exabyte = gigabyte * 1024 * 1024 * 1024; - ASSERT_EQ(0, parse_size(&size, "9E")); - ASSERT_EQ(9U, size / exabyte); - ASSERT_EQ(0U, size % exabyte); - - ASSERT_EQ(0, parse_size(&size, "15E")); - ASSERT_EQ(15U, size / exabyte); - ASSERT_EQ(0U, size % exabyte); - - ASSERT_EQ(0, parse_size(&size, "18446744073709551614")); - ASSERT_EQ(15U, size / exabyte); - ASSERT_EQ(exabyte - 2, size % exabyte); - - ASSERT_EQ(-ERANGE, parse_size(&size, "16E")); - ASSERT_EQ(-ERANGE, parse_size(&size, "19E")); - ASSERT_EQ(-EINVAL, parse_size(&size, "7GTPE")); -#elif __WORDSIZE == 32 - ASSERT_EQ(-ERANGE, parse_size(&size, "5G")); - ASSERT_EQ(-ERANGE, parse_size(&size, "9G")); - ASSERT_EQ(-ERANGE, parse_size(&size, "9E")); - ASSERT_EQ(-ERANGE, parse_size(&size, "7GTPE")); -#endif +TEST_F(NamespaceTest, test_remount_all_private) { + pid_t pid; + int child_stdout; + int mj_run_ret; + ssize_t read_ret; + char buf[kBufferSize]; + int status; + char *argv[4]; + char uidmap[kBufferSize], gidmap[kBufferSize]; + constexpr uid_t kTargetUid = 1000; // Any non-zero value will do. + constexpr gid_t kTargetGid = 1000; + + if (!userns_supported_) + GTEST_SKIP(); + + struct minijail *j = minijail_new(); + + minijail_namespace_pids(j); + minijail_namespace_vfs(j); + minijail_run_as_init(j); + + // Perform userns mapping. + minijail_namespace_user(j); + snprintf(uidmap, sizeof(uidmap), "%d %d 1", kTargetUid, getuid()); + snprintf(gidmap, sizeof(gidmap), "%d %d 1", kTargetGid, getgid()); + minijail_change_uid(j, kTargetUid); + minijail_change_gid(j, kTargetGid); + minijail_uidmap(j, uidmap); + minijail_gidmap(j, gidmap); + minijail_namespace_user_disable_setgroups(j); + + minijail_namespace_vfs(j); + minijail_remount_mode(j, MS_PRIVATE); + + argv[0] = const_cast<char*>(kShellPath); + argv[1] = "-c"; + argv[2] = "grep -E 'shared:|master:|propagate_from:|unbindable:' " + "/proc/self/mountinfo"; + argv[3] = NULL; + mj_run_ret = minijail_run_pid_pipes_no_preload( + j, argv[0], argv, &pid, NULL, &child_stdout, NULL); + EXPECT_EQ(mj_run_ret, 0); + + // There should be no output because all mounts should be remounted as + // private. + read_ret = read(child_stdout, buf, sizeof(buf)); + EXPECT_EQ(read_ret, 0); + + // grep will exit with 1 if it does not find anything which is what we + // expect. + status = minijail_wait(j); + EXPECT_EQ(status, 1); + + minijail_destroy(j); +} + +TEST_F(NamespaceTest, test_fail_to_remount_one_private) { + int status; + char uidmap[kBufferSize], gidmap[kBufferSize]; + constexpr uid_t kTargetUid = 1000; // Any non-zero value will do. + constexpr gid_t kTargetGid = 1000; + + if (!userns_supported_) + GTEST_SKIP(); + + struct minijail *j = minijail_new(); + + minijail_namespace_pids(j); + minijail_namespace_vfs(j); + minijail_mount_tmp(j); + minijail_run_as_init(j); + + // Perform userns mapping. + minijail_namespace_user(j); + snprintf(uidmap, sizeof(uidmap), "%d %d 1", kTargetUid, getuid()); + snprintf(gidmap, sizeof(gidmap), "%d %d 1", kTargetGid, getgid()); + minijail_change_uid(j, kTargetUid); + minijail_change_gid(j, kTargetGid); + minijail_uidmap(j, uidmap); + minijail_gidmap(j, gidmap); + minijail_namespace_user_disable_setgroups(j); + + minijail_namespace_vfs(j); + minijail_remount_mode(j, MS_SHARED); + minijail_add_remount(j, "/proc", MS_PRIVATE); + + char *argv[] = {"/bin/true", nullptr}; + minijail_run(j, argv[0], argv); + + status = minijail_wait(j); + EXPECT_GT(status, 0); + + minijail_destroy(j); +} + +TEST_F(NamespaceTest, test_remount_one_shared) { + pid_t pid; + int child_stdout; + int mj_run_ret; + ssize_t read_ret; + char buf[kBufferSize * 4]; + int status; + char *argv[4]; + char uidmap[kBufferSize], gidmap[kBufferSize]; + constexpr uid_t kTargetUid = 1000; // Any non-zero value will do. + constexpr gid_t kTargetGid = 1000; + + if (!userns_supported_) + GTEST_SKIP(); + + struct minijail *j = minijail_new(); - ASSERT_EQ(-EINVAL, parse_size(&size, "")); - ASSERT_EQ(-EINVAL, parse_size(&size, "14u")); - ASSERT_EQ(-EINVAL, parse_size(&size, "14.2G")); - ASSERT_EQ(-EINVAL, parse_size(&size, "-1G")); - ASSERT_EQ(-EINVAL, parse_size(&size, "; /bin/rm -- ")); + minijail_namespace_pids(j); + minijail_namespace_vfs(j); + minijail_mount_tmp(j); + minijail_run_as_init(j); + + // Perform userns mapping. + minijail_namespace_user(j); + snprintf(uidmap, sizeof(uidmap), "%d %d 1", kTargetUid, getuid()); + snprintf(gidmap, sizeof(gidmap), "%d %d 1", kTargetGid, getgid()); + minijail_change_uid(j, kTargetUid); + minijail_change_gid(j, kTargetGid); + minijail_uidmap(j, uidmap); + minijail_gidmap(j, gidmap); + minijail_namespace_user_disable_setgroups(j); + + minijail_namespace_vfs(j); + minijail_remount_mode(j, MS_PRIVATE); + minijail_add_remount(j, "/proc", MS_SHARED); + + argv[0] = const_cast<char*>(kShellPath); + argv[1] = "-c"; + argv[2] = "grep -E 'shared:' /proc/self/mountinfo"; + argv[3] = NULL; + mj_run_ret = minijail_run_pid_pipes_no_preload( + j, argv[0], argv, &pid, NULL, &child_stdout, NULL); + EXPECT_EQ(mj_run_ret, 0); + + // There should be no output because all mounts should be remounted as + // private. + read_ret = read(child_stdout, buf, sizeof(buf)); + EXPECT_GE(read_ret, 0); + buf[read_ret] = '\0'; + EXPECT_NE(std::string(buf).find("/proc"), std::string::npos); + + status = minijail_wait(j); + EXPECT_EQ(status, 0); + + minijail_destroy(j); } void TestCreateSession(bool create_session) { diff --git a/libminijailpreload.c b/libminijailpreload.c index a1e376e..a98b736 100644 --- a/libminijailpreload.c +++ b/libminijailpreload.c @@ -71,6 +71,7 @@ static int fake_main(int argc, char **argv, char **envp) die("preload: failed to parse minijail from parent"); close(fd); + unset_in_env(envp, kFdEnvVar); /* TODO(ellyjones): this trashes existing preloads, so one can't do: * LD_PRELOAD="/tmp/test.so libminijailpreload.so" prog; the * descendants of prog will have no LD_PRELOAD set at all. diff --git a/libsyscalls.h b/libsyscalls.h index f6c3212..29583ce 100644 --- a/libsyscalls.h +++ b/libsyscalls.h @@ -12,5 +12,6 @@ struct syscall_entry { }; extern const struct syscall_entry syscall_table[]; +extern const size_t syscall_table_size; -#endif /* MINIJAIL_LIBSYSCALLS_H_ */ +#endif /* MINIJAIL_LIBSYSCALLS_H_ */ diff --git a/linux-x86/libconstants.gen.c b/linux-x86/libconstants.gen.c index 157f622..26754ad 100644 --- a/linux-x86/libconstants.gen.c +++ b/linux-x86/libconstants.gen.c @@ -1,1253 +1,5597 @@ /* GENERATED BY MAKEFILE */ -#include <errno.h> -#include <fcntl.h> -#include <linux/prctl.h> -#include <linux/sched.h> -#include <stddef.h> -#include <signal.h> -#include <sys/stat.h> -#include <sys/types.h> -#include "arch.h" +#include "gen_constants-inl.h" #include "libconstants.h" - const struct constant_entry constant_table[] = { -#ifdef MINIJAIL_ARCH_NR - {"MINIJAIL_ARCH_NR", (unsigned long)MINIJAIL_ARCH_NR}, -#endif // MINIJAIL_ARCH_NR -#ifdef MINIJAIL_ARCH_BITS - {"MINIJAIL_ARCH_BITS", (unsigned long)MINIJAIL_ARCH_BITS}, -#endif // MINIJAIL_ARCH_BITS +#ifdef AF_ALG + { "AF_ALG", (unsigned long) AF_ALG }, +#endif // AF_ALG +#ifdef AF_APPLETALK + { "AF_APPLETALK", (unsigned long) AF_APPLETALK }, +#endif // AF_APPLETALK +#ifdef AF_ASH + { "AF_ASH", (unsigned long) AF_ASH }, +#endif // AF_ASH +#ifdef AF_ATMPVC + { "AF_ATMPVC", (unsigned long) AF_ATMPVC }, +#endif // AF_ATMPVC +#ifdef AF_ATMSVC + { "AF_ATMSVC", (unsigned long) AF_ATMSVC }, +#endif // AF_ATMSVC +#ifdef AF_AX25 + { "AF_AX25", (unsigned long) AF_AX25 }, +#endif // AF_AX25 +#ifdef AF_BLUETOOTH + { "AF_BLUETOOTH", (unsigned long) AF_BLUETOOTH }, +#endif // AF_BLUETOOTH +#ifdef AF_BRIDGE + { "AF_BRIDGE", (unsigned long) AF_BRIDGE }, +#endif // AF_BRIDGE +#ifdef AF_CAIF + { "AF_CAIF", (unsigned long) AF_CAIF }, +#endif // AF_CAIF +#ifdef AF_CAN + { "AF_CAN", (unsigned long) AF_CAN }, +#endif // AF_CAN +#ifdef AF_ECONET + { "AF_ECONET", (unsigned long) AF_ECONET }, +#endif // AF_ECONET +#ifdef AF_FILE + { "AF_FILE", (unsigned long) AF_FILE }, +#endif // AF_FILE +#ifdef AF_IB + { "AF_IB", (unsigned long) AF_IB }, +#endif // AF_IB +#ifdef AF_IEEE802154 + { "AF_IEEE802154", (unsigned long) AF_IEEE802154 }, +#endif // AF_IEEE802154 +#ifdef AF_INET6 + { "AF_INET6", (unsigned long) AF_INET6 }, +#endif // AF_INET6 +#ifdef AF_INET + { "AF_INET", (unsigned long) AF_INET }, +#endif // AF_INET +#ifdef AF_IPX + { "AF_IPX", (unsigned long) AF_IPX }, +#endif // AF_IPX +#ifdef AF_IRDA + { "AF_IRDA", (unsigned long) AF_IRDA }, +#endif // AF_IRDA +#ifdef AF_ISDN + { "AF_ISDN", (unsigned long) AF_ISDN }, +#endif // AF_ISDN +#ifdef AF_IUCV + { "AF_IUCV", (unsigned long) AF_IUCV }, +#endif // AF_IUCV +#ifdef AF_KCM + { "AF_KCM", (unsigned long) AF_KCM }, +#endif // AF_KCM +#ifdef AF_KEY + { "AF_KEY", (unsigned long) AF_KEY }, +#endif // AF_KEY +#ifdef AF_LLC + { "AF_LLC", (unsigned long) AF_LLC }, +#endif // AF_LLC +#ifdef AF_LOCAL + { "AF_LOCAL", (unsigned long) AF_LOCAL }, +#endif // AF_LOCAL +#ifdef AF_MAX + { "AF_MAX", (unsigned long) AF_MAX }, +#endif // AF_MAX +#ifdef AF_MPLS + { "AF_MPLS", (unsigned long) AF_MPLS }, +#endif // AF_MPLS +#ifdef AF_NETBEUI + { "AF_NETBEUI", (unsigned long) AF_NETBEUI }, +#endif // AF_NETBEUI +#ifdef AF_NETLINK + { "AF_NETLINK", (unsigned long) AF_NETLINK }, +#endif // AF_NETLINK +#ifdef AF_NETROM + { "AF_NETROM", (unsigned long) AF_NETROM }, +#endif // AF_NETROM +#ifdef AF_NFC + { "AF_NFC", (unsigned long) AF_NFC }, +#endif // AF_NFC +#ifdef AF_PACKET + { "AF_PACKET", (unsigned long) AF_PACKET }, +#endif // AF_PACKET +#ifdef AF_PHONET + { "AF_PHONET", (unsigned long) AF_PHONET }, +#endif // AF_PHONET +#ifdef AF_PPPOX + { "AF_PPPOX", (unsigned long) AF_PPPOX }, +#endif // AF_PPPOX +#ifdef AF_QIPCRTR + { "AF_QIPCRTR", (unsigned long) AF_QIPCRTR }, +#endif // AF_QIPCRTR +#ifdef AF_RDS + { "AF_RDS", (unsigned long) AF_RDS }, +#endif // AF_RDS +#ifdef AF_ROSE + { "AF_ROSE", (unsigned long) AF_ROSE }, +#endif // AF_ROSE +#ifdef AF_ROUTE + { "AF_ROUTE", (unsigned long) AF_ROUTE }, +#endif // AF_ROUTE +#ifdef AF_RXRPC + { "AF_RXRPC", (unsigned long) AF_RXRPC }, +#endif // AF_RXRPC +#ifdef AF_SECURITY + { "AF_SECURITY", (unsigned long) AF_SECURITY }, +#endif // AF_SECURITY +#ifdef AF_SMC + { "AF_SMC", (unsigned long) AF_SMC }, +#endif // AF_SMC +#ifdef AF_SNA + { "AF_SNA", (unsigned long) AF_SNA }, +#endif // AF_SNA +#ifdef AF_TIPC + { "AF_TIPC", (unsigned long) AF_TIPC }, +#endif // AF_TIPC +#ifdef AF_UNIX + { "AF_UNIX", (unsigned long) AF_UNIX }, +#endif // AF_UNIX +#ifdef AF_UNSPEC + { "AF_UNSPEC", (unsigned long) AF_UNSPEC }, +#endif // AF_UNSPEC +#ifdef AF_VSOCK + { "AF_VSOCK", (unsigned long) AF_VSOCK }, +#endif // AF_VSOCK +#ifdef AF_WANPIPE + { "AF_WANPIPE", (unsigned long) AF_WANPIPE }, +#endif // AF_WANPIPE +#ifdef AF_X25 + { "AF_X25", (unsigned long) AF_X25 }, +#endif // AF_X25 +#ifdef AF_XDP + { "AF_XDP", (unsigned long) AF_XDP }, +#endif // AF_XDP +#ifdef ARCH_GET_CPUID + { "ARCH_GET_CPUID", (unsigned long) ARCH_GET_CPUID }, +#endif // ARCH_GET_CPUID +#ifdef ARCH_GET_FS + { "ARCH_GET_FS", (unsigned long) ARCH_GET_FS }, +#endif // ARCH_GET_FS +#ifdef ARCH_GET_GS + { "ARCH_GET_GS", (unsigned long) ARCH_GET_GS }, +#endif // ARCH_GET_GS +#ifdef ARCH_MAP_VDSO_32 + { "ARCH_MAP_VDSO_32", (unsigned long) ARCH_MAP_VDSO_32 }, +#endif // ARCH_MAP_VDSO_32 +#ifdef ARCH_MAP_VDSO_64 + { "ARCH_MAP_VDSO_64", (unsigned long) ARCH_MAP_VDSO_64 }, +#endif // ARCH_MAP_VDSO_64 +#ifdef ARCH_MAP_VDSO_X32 + { "ARCH_MAP_VDSO_X32", (unsigned long) ARCH_MAP_VDSO_X32 }, +#endif // ARCH_MAP_VDSO_X32 +#ifdef ARCH_SET_CPUID + { "ARCH_SET_CPUID", (unsigned long) ARCH_SET_CPUID }, +#endif // ARCH_SET_CPUID +#ifdef ARCH_SET_FS + { "ARCH_SET_FS", (unsigned long) ARCH_SET_FS }, +#endif // ARCH_SET_FS +#ifdef ARCH_SET_GS + { "ARCH_SET_GS", (unsigned long) ARCH_SET_GS }, +#endif // ARCH_SET_GS +#ifdef ARG_MAX + { "ARG_MAX", (unsigned long) ARG_MAX }, +#endif // ARG_MAX +#ifdef ASYNCB_AUTO_IRQ + { "ASYNCB_AUTO_IRQ", (unsigned long) ASYNCB_AUTO_IRQ }, +#endif // ASYNCB_AUTO_IRQ +#ifdef ASYNCB_AUTOPROBE + { "ASYNCB_AUTOPROBE", (unsigned long) ASYNCB_AUTOPROBE }, +#endif // ASYNCB_AUTOPROBE +#ifdef ASYNCB_BOOT_AUTOCONF + { "ASYNCB_BOOT_AUTOCONF", (unsigned long) ASYNCB_BOOT_AUTOCONF }, +#endif // ASYNCB_BOOT_AUTOCONF +#ifdef ASYNCB_BUGGY_UART + { "ASYNCB_BUGGY_UART", (unsigned long) ASYNCB_BUGGY_UART }, +#endif // ASYNCB_BUGGY_UART +#ifdef ASYNCB_CALLOUT_NOHUP + { "ASYNCB_CALLOUT_NOHUP", (unsigned long) ASYNCB_CALLOUT_NOHUP }, +#endif // ASYNCB_CALLOUT_NOHUP +#ifdef ASYNCB_CHECK_CD + { "ASYNCB_CHECK_CD", (unsigned long) ASYNCB_CHECK_CD }, +#endif // ASYNCB_CHECK_CD +#ifdef ASYNCB_CLOSING + { "ASYNCB_CLOSING", (unsigned long) ASYNCB_CLOSING }, +#endif // ASYNCB_CLOSING +#ifdef ASYNCB_CONS_FLOW + { "ASYNCB_CONS_FLOW", (unsigned long) ASYNCB_CONS_FLOW }, +#endif // ASYNCB_CONS_FLOW +#ifdef ASYNCB_CTS_FLOW + { "ASYNCB_CTS_FLOW", (unsigned long) ASYNCB_CTS_FLOW }, +#endif // ASYNCB_CTS_FLOW +#ifdef ASYNCB_FIRST_KERNEL + { "ASYNCB_FIRST_KERNEL", (unsigned long) ASYNCB_FIRST_KERNEL }, +#endif // ASYNCB_FIRST_KERNEL +#ifdef ASYNCB_FOURPORT + { "ASYNCB_FOURPORT", (unsigned long) ASYNCB_FOURPORT }, +#endif // ASYNCB_FOURPORT +#ifdef ASYNCB_HARDPPS_CD + { "ASYNCB_HARDPPS_CD", (unsigned long) ASYNCB_HARDPPS_CD }, +#endif // ASYNCB_HARDPPS_CD +#ifdef ASYNCB_HUP_NOTIFY + { "ASYNCB_HUP_NOTIFY", (unsigned long) ASYNCB_HUP_NOTIFY }, +#endif // ASYNCB_HUP_NOTIFY +#ifdef ASYNCB_INITIALIZED + { "ASYNCB_INITIALIZED", (unsigned long) ASYNCB_INITIALIZED }, +#endif // ASYNCB_INITIALIZED +#ifdef ASYNCB_LAST_USER + { "ASYNCB_LAST_USER", (unsigned long) ASYNCB_LAST_USER }, +#endif // ASYNCB_LAST_USER +#ifdef ASYNCB_LOW_LATENCY + { "ASYNCB_LOW_LATENCY", (unsigned long) ASYNCB_LOW_LATENCY }, +#endif // ASYNCB_LOW_LATENCY +#ifdef ASYNCB_MAGIC_MULTIPLIER + { "ASYNCB_MAGIC_MULTIPLIER", (unsigned long) ASYNCB_MAGIC_MULTIPLIER }, +#endif // ASYNCB_MAGIC_MULTIPLIER +#ifdef ASYNCB_NORMAL_ACTIVE + { "ASYNCB_NORMAL_ACTIVE", (unsigned long) ASYNCB_NORMAL_ACTIVE }, +#endif // ASYNCB_NORMAL_ACTIVE +#ifdef ASYNCB_PGRP_LOCKOUT + { "ASYNCB_PGRP_LOCKOUT", (unsigned long) ASYNCB_PGRP_LOCKOUT }, +#endif // ASYNCB_PGRP_LOCKOUT +#ifdef ASYNCB_SAK + { "ASYNCB_SAK", (unsigned long) ASYNCB_SAK }, +#endif // ASYNCB_SAK +#ifdef ASYNCB_SESSION_LOCKOUT + { "ASYNCB_SESSION_LOCKOUT", (unsigned long) ASYNCB_SESSION_LOCKOUT }, +#endif // ASYNCB_SESSION_LOCKOUT +#ifdef ASYNCB_SHARE_IRQ + { "ASYNCB_SHARE_IRQ", (unsigned long) ASYNCB_SHARE_IRQ }, +#endif // ASYNCB_SHARE_IRQ +#ifdef ASYNCB_SKIP_TEST + { "ASYNCB_SKIP_TEST", (unsigned long) ASYNCB_SKIP_TEST }, +#endif // ASYNCB_SKIP_TEST +#ifdef ASYNCB_SPD_HI + { "ASYNCB_SPD_HI", (unsigned long) ASYNCB_SPD_HI }, +#endif // ASYNCB_SPD_HI +#ifdef ASYNCB_SPD_SHI + { "ASYNCB_SPD_SHI", (unsigned long) ASYNCB_SPD_SHI }, +#endif // ASYNCB_SPD_SHI +#ifdef ASYNCB_SPD_VHI + { "ASYNCB_SPD_VHI", (unsigned long) ASYNCB_SPD_VHI }, +#endif // ASYNCB_SPD_VHI +#ifdef ASYNCB_SPLIT_TERMIOS + { "ASYNCB_SPLIT_TERMIOS", (unsigned long) ASYNCB_SPLIT_TERMIOS }, +#endif // ASYNCB_SPLIT_TERMIOS +#ifdef ASYNCB_SUSPENDED + { "ASYNCB_SUSPENDED", (unsigned long) ASYNCB_SUSPENDED }, +#endif // ASYNCB_SUSPENDED +#ifdef ASYNC_CLOSING_WAIT_INF + { "ASYNC_CLOSING_WAIT_INF", (unsigned long) ASYNC_CLOSING_WAIT_INF }, +#endif // ASYNC_CLOSING_WAIT_INF +#ifdef ASYNC_CLOSING_WAIT_NONE + { "ASYNC_CLOSING_WAIT_NONE", (unsigned long) ASYNC_CLOSING_WAIT_NONE }, +#endif // ASYNC_CLOSING_WAIT_NONE #ifdef AT_EACCESS - {"AT_EACCESS", (unsigned long)AT_EACCESS}, + { "AT_EACCESS", (unsigned long) AT_EACCESS }, #endif // AT_EACCESS #ifdef AT_REMOVEDIR - {"AT_REMOVEDIR", (unsigned long)AT_REMOVEDIR}, + { "AT_REMOVEDIR", (unsigned long) AT_REMOVEDIR }, #endif // AT_REMOVEDIR #ifdef AT_SYMLINK_FOLLOW - {"AT_SYMLINK_FOLLOW", (unsigned long)AT_SYMLINK_FOLLOW}, + { "AT_SYMLINK_FOLLOW", (unsigned long) AT_SYMLINK_FOLLOW }, #endif // AT_SYMLINK_FOLLOW #ifdef AT_SYMLINK_NOFOLLOW - {"AT_SYMLINK_NOFOLLOW", (unsigned long)AT_SYMLINK_NOFOLLOW}, + { "AT_SYMLINK_NOFOLLOW", (unsigned long) AT_SYMLINK_NOFOLLOW }, #endif // AT_SYMLINK_NOFOLLOW +#ifdef AUDIT_ADD + { "AUDIT_ADD", (unsigned long) AUDIT_ADD }, +#endif // AUDIT_ADD +#ifdef AUDIT_ADD_RULE + { "AUDIT_ADD_RULE", (unsigned long) AUDIT_ADD_RULE }, +#endif // AUDIT_ADD_RULE +#ifdef AUDIT_ALWAYS + { "AUDIT_ALWAYS", (unsigned long) AUDIT_ALWAYS }, +#endif // AUDIT_ALWAYS +#ifdef AUDIT_ANOM_ABEND + { "AUDIT_ANOM_ABEND", (unsigned long) AUDIT_ANOM_ABEND }, +#endif // AUDIT_ANOM_ABEND +#ifdef AUDIT_ANOM_CREAT + { "AUDIT_ANOM_CREAT", (unsigned long) AUDIT_ANOM_CREAT }, +#endif // AUDIT_ANOM_CREAT +#ifdef AUDIT_ANOM_LINK + { "AUDIT_ANOM_LINK", (unsigned long) AUDIT_ANOM_LINK }, +#endif // AUDIT_ANOM_LINK +#ifdef AUDIT_ANOM_PROMISCUOUS + { "AUDIT_ANOM_PROMISCUOUS", (unsigned long) AUDIT_ANOM_PROMISCUOUS }, +#endif // AUDIT_ANOM_PROMISCUOUS +#ifdef AUDIT_ARCH + { "AUDIT_ARCH", (unsigned long) AUDIT_ARCH }, +#endif // AUDIT_ARCH +#ifdef AUDIT_ARG0 + { "AUDIT_ARG0", (unsigned long) AUDIT_ARG0 }, +#endif // AUDIT_ARG0 +#ifdef AUDIT_AVC + { "AUDIT_AVC", (unsigned long) AUDIT_AVC }, +#endif // AUDIT_AVC +#ifdef AUDIT_AVC_PATH + { "AUDIT_AVC_PATH", (unsigned long) AUDIT_AVC_PATH }, +#endif // AUDIT_AVC_PATH +#ifdef AUDIT_BIT_MASK + { "AUDIT_BIT_MASK", (unsigned long) AUDIT_BIT_MASK }, +#endif // AUDIT_BIT_MASK +#ifdef AUDIT_BITMASK_SIZE + { "AUDIT_BITMASK_SIZE", (unsigned long) AUDIT_BITMASK_SIZE }, +#endif // AUDIT_BITMASK_SIZE +#ifdef AUDIT_BPF + { "AUDIT_BPF", (unsigned long) AUDIT_BPF }, +#endif // AUDIT_BPF +#ifdef AUDIT_BPRM_FCAPS + { "AUDIT_BPRM_FCAPS", (unsigned long) AUDIT_BPRM_FCAPS }, +#endif // AUDIT_BPRM_FCAPS +#ifdef AUDIT_CAPSET + { "AUDIT_CAPSET", (unsigned long) AUDIT_CAPSET }, +#endif // AUDIT_CAPSET +#ifdef AUDIT_CLASS_CHATTR + { "AUDIT_CLASS_CHATTR", (unsigned long) AUDIT_CLASS_CHATTR }, +#endif // AUDIT_CLASS_CHATTR +#ifdef AUDIT_CLASS_CHATTR_32 + { "AUDIT_CLASS_CHATTR_32", (unsigned long) AUDIT_CLASS_CHATTR_32 }, +#endif // AUDIT_CLASS_CHATTR_32 +#ifdef AUDIT_CLASS_DIR_WRITE + { "AUDIT_CLASS_DIR_WRITE", (unsigned long) AUDIT_CLASS_DIR_WRITE }, +#endif // AUDIT_CLASS_DIR_WRITE +#ifdef AUDIT_CLASS_DIR_WRITE_32 + { "AUDIT_CLASS_DIR_WRITE_32", (unsigned long) AUDIT_CLASS_DIR_WRITE_32 }, +#endif // AUDIT_CLASS_DIR_WRITE_32 +#ifdef AUDIT_CLASS_READ_32 + { "AUDIT_CLASS_READ_32", (unsigned long) AUDIT_CLASS_READ_32 }, +#endif // AUDIT_CLASS_READ_32 +#ifdef AUDIT_CLASS_READ + { "AUDIT_CLASS_READ", (unsigned long) AUDIT_CLASS_READ }, +#endif // AUDIT_CLASS_READ +#ifdef AUDIT_CLASS_SIGNAL_32 + { "AUDIT_CLASS_SIGNAL_32", (unsigned long) AUDIT_CLASS_SIGNAL_32 }, +#endif // AUDIT_CLASS_SIGNAL_32 +#ifdef AUDIT_CLASS_SIGNAL + { "AUDIT_CLASS_SIGNAL", (unsigned long) AUDIT_CLASS_SIGNAL }, +#endif // AUDIT_CLASS_SIGNAL +#ifdef AUDIT_CLASS_WRITE_32 + { "AUDIT_CLASS_WRITE_32", (unsigned long) AUDIT_CLASS_WRITE_32 }, +#endif // AUDIT_CLASS_WRITE_32 +#ifdef AUDIT_CLASS_WRITE + { "AUDIT_CLASS_WRITE", (unsigned long) AUDIT_CLASS_WRITE }, +#endif // AUDIT_CLASS_WRITE +#ifdef AUDIT_COMPARE_AUID_TO_EUID + { "AUDIT_COMPARE_AUID_TO_EUID", (unsigned long) AUDIT_COMPARE_AUID_TO_EUID }, +#endif // AUDIT_COMPARE_AUID_TO_EUID +#ifdef AUDIT_COMPARE_AUID_TO_FSUID + { "AUDIT_COMPARE_AUID_TO_FSUID", (unsigned long) AUDIT_COMPARE_AUID_TO_FSUID }, +#endif // AUDIT_COMPARE_AUID_TO_FSUID +#ifdef AUDIT_COMPARE_AUID_TO_OBJ_UID + { "AUDIT_COMPARE_AUID_TO_OBJ_UID", (unsigned long) AUDIT_COMPARE_AUID_TO_OBJ_UID }, +#endif // AUDIT_COMPARE_AUID_TO_OBJ_UID +#ifdef AUDIT_COMPARE_AUID_TO_SUID + { "AUDIT_COMPARE_AUID_TO_SUID", (unsigned long) AUDIT_COMPARE_AUID_TO_SUID }, +#endif // AUDIT_COMPARE_AUID_TO_SUID +#ifdef AUDIT_COMPARE_EGID_TO_FSGID + { "AUDIT_COMPARE_EGID_TO_FSGID", (unsigned long) AUDIT_COMPARE_EGID_TO_FSGID }, +#endif // AUDIT_COMPARE_EGID_TO_FSGID +#ifdef AUDIT_COMPARE_EGID_TO_OBJ_GID + { "AUDIT_COMPARE_EGID_TO_OBJ_GID", (unsigned long) AUDIT_COMPARE_EGID_TO_OBJ_GID }, +#endif // AUDIT_COMPARE_EGID_TO_OBJ_GID +#ifdef AUDIT_COMPARE_EGID_TO_SGID + { "AUDIT_COMPARE_EGID_TO_SGID", (unsigned long) AUDIT_COMPARE_EGID_TO_SGID }, +#endif // AUDIT_COMPARE_EGID_TO_SGID +#ifdef AUDIT_COMPARE_EUID_TO_FSUID + { "AUDIT_COMPARE_EUID_TO_FSUID", (unsigned long) AUDIT_COMPARE_EUID_TO_FSUID }, +#endif // AUDIT_COMPARE_EUID_TO_FSUID +#ifdef AUDIT_COMPARE_EUID_TO_OBJ_UID + { "AUDIT_COMPARE_EUID_TO_OBJ_UID", (unsigned long) AUDIT_COMPARE_EUID_TO_OBJ_UID }, +#endif // AUDIT_COMPARE_EUID_TO_OBJ_UID +#ifdef AUDIT_COMPARE_EUID_TO_SUID + { "AUDIT_COMPARE_EUID_TO_SUID", (unsigned long) AUDIT_COMPARE_EUID_TO_SUID }, +#endif // AUDIT_COMPARE_EUID_TO_SUID +#ifdef AUDIT_COMPARE_FSGID_TO_OBJ_GID + { "AUDIT_COMPARE_FSGID_TO_OBJ_GID", (unsigned long) AUDIT_COMPARE_FSGID_TO_OBJ_GID }, +#endif // AUDIT_COMPARE_FSGID_TO_OBJ_GID +#ifdef AUDIT_COMPARE_FSUID_TO_OBJ_UID + { "AUDIT_COMPARE_FSUID_TO_OBJ_UID", (unsigned long) AUDIT_COMPARE_FSUID_TO_OBJ_UID }, +#endif // AUDIT_COMPARE_FSUID_TO_OBJ_UID +#ifdef AUDIT_COMPARE_GID_TO_EGID + { "AUDIT_COMPARE_GID_TO_EGID", (unsigned long) AUDIT_COMPARE_GID_TO_EGID }, +#endif // AUDIT_COMPARE_GID_TO_EGID +#ifdef AUDIT_COMPARE_GID_TO_FSGID + { "AUDIT_COMPARE_GID_TO_FSGID", (unsigned long) AUDIT_COMPARE_GID_TO_FSGID }, +#endif // AUDIT_COMPARE_GID_TO_FSGID +#ifdef AUDIT_COMPARE_GID_TO_OBJ_GID + { "AUDIT_COMPARE_GID_TO_OBJ_GID", (unsigned long) AUDIT_COMPARE_GID_TO_OBJ_GID }, +#endif // AUDIT_COMPARE_GID_TO_OBJ_GID +#ifdef AUDIT_COMPARE_GID_TO_SGID + { "AUDIT_COMPARE_GID_TO_SGID", (unsigned long) AUDIT_COMPARE_GID_TO_SGID }, +#endif // AUDIT_COMPARE_GID_TO_SGID +#ifdef AUDIT_COMPARE_SGID_TO_FSGID + { "AUDIT_COMPARE_SGID_TO_FSGID", (unsigned long) AUDIT_COMPARE_SGID_TO_FSGID }, +#endif // AUDIT_COMPARE_SGID_TO_FSGID +#ifdef AUDIT_COMPARE_SGID_TO_OBJ_GID + { "AUDIT_COMPARE_SGID_TO_OBJ_GID", (unsigned long) AUDIT_COMPARE_SGID_TO_OBJ_GID }, +#endif // AUDIT_COMPARE_SGID_TO_OBJ_GID +#ifdef AUDIT_COMPARE_SUID_TO_FSUID + { "AUDIT_COMPARE_SUID_TO_FSUID", (unsigned long) AUDIT_COMPARE_SUID_TO_FSUID }, +#endif // AUDIT_COMPARE_SUID_TO_FSUID +#ifdef AUDIT_COMPARE_SUID_TO_OBJ_UID + { "AUDIT_COMPARE_SUID_TO_OBJ_UID", (unsigned long) AUDIT_COMPARE_SUID_TO_OBJ_UID }, +#endif // AUDIT_COMPARE_SUID_TO_OBJ_UID +#ifdef AUDIT_COMPARE_UID_TO_AUID + { "AUDIT_COMPARE_UID_TO_AUID", (unsigned long) AUDIT_COMPARE_UID_TO_AUID }, +#endif // AUDIT_COMPARE_UID_TO_AUID +#ifdef AUDIT_COMPARE_UID_TO_EUID + { "AUDIT_COMPARE_UID_TO_EUID", (unsigned long) AUDIT_COMPARE_UID_TO_EUID }, +#endif // AUDIT_COMPARE_UID_TO_EUID +#ifdef AUDIT_COMPARE_UID_TO_FSUID + { "AUDIT_COMPARE_UID_TO_FSUID", (unsigned long) AUDIT_COMPARE_UID_TO_FSUID }, +#endif // AUDIT_COMPARE_UID_TO_FSUID +#ifdef AUDIT_COMPARE_UID_TO_OBJ_UID + { "AUDIT_COMPARE_UID_TO_OBJ_UID", (unsigned long) AUDIT_COMPARE_UID_TO_OBJ_UID }, +#endif // AUDIT_COMPARE_UID_TO_OBJ_UID +#ifdef AUDIT_COMPARE_UID_TO_SUID + { "AUDIT_COMPARE_UID_TO_SUID", (unsigned long) AUDIT_COMPARE_UID_TO_SUID }, +#endif // AUDIT_COMPARE_UID_TO_SUID +#ifdef AUDIT_CONFIG_CHANGE + { "AUDIT_CONFIG_CHANGE", (unsigned long) AUDIT_CONFIG_CHANGE }, +#endif // AUDIT_CONFIG_CHANGE +#ifdef AUDIT_CWD + { "AUDIT_CWD", (unsigned long) AUDIT_CWD }, +#endif // AUDIT_CWD +#ifdef AUDIT_DAEMON_ABORT + { "AUDIT_DAEMON_ABORT", (unsigned long) AUDIT_DAEMON_ABORT }, +#endif // AUDIT_DAEMON_ABORT +#ifdef AUDIT_DAEMON_CONFIG + { "AUDIT_DAEMON_CONFIG", (unsigned long) AUDIT_DAEMON_CONFIG }, +#endif // AUDIT_DAEMON_CONFIG +#ifdef AUDIT_DAEMON_END + { "AUDIT_DAEMON_END", (unsigned long) AUDIT_DAEMON_END }, +#endif // AUDIT_DAEMON_END +#ifdef AUDIT_DAEMON_START + { "AUDIT_DAEMON_START", (unsigned long) AUDIT_DAEMON_START }, +#endif // AUDIT_DAEMON_START +#ifdef AUDIT_DEL + { "AUDIT_DEL", (unsigned long) AUDIT_DEL }, +#endif // AUDIT_DEL +#ifdef AUDIT_DEL_RULE + { "AUDIT_DEL_RULE", (unsigned long) AUDIT_DEL_RULE }, +#endif // AUDIT_DEL_RULE +#ifdef AUDIT_DEVMAJOR + { "AUDIT_DEVMAJOR", (unsigned long) AUDIT_DEVMAJOR }, +#endif // AUDIT_DEVMAJOR +#ifdef AUDIT_DEVMINOR + { "AUDIT_DEVMINOR", (unsigned long) AUDIT_DEVMINOR }, +#endif // AUDIT_DEVMINOR +#ifdef AUDIT_DIR + { "AUDIT_DIR", (unsigned long) AUDIT_DIR }, +#endif // AUDIT_DIR +#ifdef AUDIT_EGID + { "AUDIT_EGID", (unsigned long) AUDIT_EGID }, +#endif // AUDIT_EGID +#ifdef AUDIT_EOE + { "AUDIT_EOE", (unsigned long) AUDIT_EOE }, +#endif // AUDIT_EOE +#ifdef AUDIT_EQUAL + { "AUDIT_EQUAL", (unsigned long) AUDIT_EQUAL }, +#endif // AUDIT_EQUAL +#ifdef AUDIT_EUID + { "AUDIT_EUID", (unsigned long) AUDIT_EUID }, +#endif // AUDIT_EUID +#ifdef AUDIT_EXE + { "AUDIT_EXE", (unsigned long) AUDIT_EXE }, +#endif // AUDIT_EXE +#ifdef AUDIT_EXECVE + { "AUDIT_EXECVE", (unsigned long) AUDIT_EXECVE }, +#endif // AUDIT_EXECVE +#ifdef AUDIT_EXIT + { "AUDIT_EXIT", (unsigned long) AUDIT_EXIT }, +#endif // AUDIT_EXIT +#ifdef AUDIT_FAIL_PANIC + { "AUDIT_FAIL_PANIC", (unsigned long) AUDIT_FAIL_PANIC }, +#endif // AUDIT_FAIL_PANIC +#ifdef AUDIT_FAIL_PRINTK + { "AUDIT_FAIL_PRINTK", (unsigned long) AUDIT_FAIL_PRINTK }, +#endif // AUDIT_FAIL_PRINTK +#ifdef AUDIT_FAIL_SILENT + { "AUDIT_FAIL_SILENT", (unsigned long) AUDIT_FAIL_SILENT }, +#endif // AUDIT_FAIL_SILENT +#ifdef AUDIT_FANOTIFY + { "AUDIT_FANOTIFY", (unsigned long) AUDIT_FANOTIFY }, +#endif // AUDIT_FANOTIFY +#ifdef AUDIT_FD_PAIR + { "AUDIT_FD_PAIR", (unsigned long) AUDIT_FD_PAIR }, +#endif // AUDIT_FD_PAIR +#ifdef AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT + { "AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT", (unsigned long) AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT }, +#endif // AUDIT_FEATURE_BITMAP_BACKLOG_LIMIT +#ifdef AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME + { "AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME", (unsigned long) AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME }, +#endif // AUDIT_FEATURE_BITMAP_BACKLOG_WAIT_TIME +#ifdef AUDIT_FEATURE_BITMAP_EXCLUDE_EXTEND + { "AUDIT_FEATURE_BITMAP_EXCLUDE_EXTEND", (unsigned long) AUDIT_FEATURE_BITMAP_EXCLUDE_EXTEND }, +#endif // AUDIT_FEATURE_BITMAP_EXCLUDE_EXTEND +#ifdef AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH + { "AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH", (unsigned long) AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH }, +#endif // AUDIT_FEATURE_BITMAP_EXECUTABLE_PATH +#ifdef AUDIT_FEATURE_BITMAP_FILTER_FS + { "AUDIT_FEATURE_BITMAP_FILTER_FS", (unsigned long) AUDIT_FEATURE_BITMAP_FILTER_FS }, +#endif // AUDIT_FEATURE_BITMAP_FILTER_FS +#ifdef AUDIT_FEATURE_BITMAP_LOST_RESET + { "AUDIT_FEATURE_BITMAP_LOST_RESET", (unsigned long) AUDIT_FEATURE_BITMAP_LOST_RESET }, +#endif // AUDIT_FEATURE_BITMAP_LOST_RESET +#ifdef AUDIT_FEATURE_BITMAP_SESSIONID_FILTER + { "AUDIT_FEATURE_BITMAP_SESSIONID_FILTER", (unsigned long) AUDIT_FEATURE_BITMAP_SESSIONID_FILTER }, +#endif // AUDIT_FEATURE_BITMAP_SESSIONID_FILTER +#ifdef AUDIT_FEATURE_CHANGE + { "AUDIT_FEATURE_CHANGE", (unsigned long) AUDIT_FEATURE_CHANGE }, +#endif // AUDIT_FEATURE_CHANGE +#ifdef AUDIT_FEATURE_LOGINUID_IMMUTABLE + { "AUDIT_FEATURE_LOGINUID_IMMUTABLE", (unsigned long) AUDIT_FEATURE_LOGINUID_IMMUTABLE }, +#endif // AUDIT_FEATURE_LOGINUID_IMMUTABLE +#ifdef AUDIT_FEATURE_ONLY_UNSET_LOGINUID + { "AUDIT_FEATURE_ONLY_UNSET_LOGINUID", (unsigned long) AUDIT_FEATURE_ONLY_UNSET_LOGINUID }, +#endif // AUDIT_FEATURE_ONLY_UNSET_LOGINUID +#ifdef AUDIT_FEATURE_VERSION + { "AUDIT_FEATURE_VERSION", (unsigned long) AUDIT_FEATURE_VERSION }, +#endif // AUDIT_FEATURE_VERSION +#ifdef AUDIT_FIELD_COMPARE + { "AUDIT_FIELD_COMPARE", (unsigned long) AUDIT_FIELD_COMPARE }, +#endif // AUDIT_FIELD_COMPARE +#ifdef AUDIT_FILETYPE + { "AUDIT_FILETYPE", (unsigned long) AUDIT_FILETYPE }, +#endif // AUDIT_FILETYPE +#ifdef AUDIT_FILTER_ENTRY + { "AUDIT_FILTER_ENTRY", (unsigned long) AUDIT_FILTER_ENTRY }, +#endif // AUDIT_FILTER_ENTRY +#ifdef AUDIT_FILTER_EXCLUDE + { "AUDIT_FILTER_EXCLUDE", (unsigned long) AUDIT_FILTER_EXCLUDE }, +#endif // AUDIT_FILTER_EXCLUDE +#ifdef AUDIT_FILTER_EXIT + { "AUDIT_FILTER_EXIT", (unsigned long) AUDIT_FILTER_EXIT }, +#endif // AUDIT_FILTER_EXIT +#ifdef AUDIT_FILTER_FS + { "AUDIT_FILTER_FS", (unsigned long) AUDIT_FILTER_FS }, +#endif // AUDIT_FILTER_FS +#ifdef AUDIT_FILTERKEY + { "AUDIT_FILTERKEY", (unsigned long) AUDIT_FILTERKEY }, +#endif // AUDIT_FILTERKEY +#ifdef AUDIT_FILTER_PREPEND + { "AUDIT_FILTER_PREPEND", (unsigned long) AUDIT_FILTER_PREPEND }, +#endif // AUDIT_FILTER_PREPEND +#ifdef AUDIT_FILTER_TASK + { "AUDIT_FILTER_TASK", (unsigned long) AUDIT_FILTER_TASK }, +#endif // AUDIT_FILTER_TASK +#ifdef AUDIT_FILTER_TYPE + { "AUDIT_FILTER_TYPE", (unsigned long) AUDIT_FILTER_TYPE }, +#endif // AUDIT_FILTER_TYPE +#ifdef AUDIT_FILTER_USER + { "AUDIT_FILTER_USER", (unsigned long) AUDIT_FILTER_USER }, +#endif // AUDIT_FILTER_USER +#ifdef AUDIT_FILTER_WATCH + { "AUDIT_FILTER_WATCH", (unsigned long) AUDIT_FILTER_WATCH }, +#endif // AUDIT_FILTER_WATCH +#ifdef AUDIT_FIRST_KERN_ANOM_MSG + { "AUDIT_FIRST_KERN_ANOM_MSG", (unsigned long) AUDIT_FIRST_KERN_ANOM_MSG }, +#endif // AUDIT_FIRST_KERN_ANOM_MSG +#ifdef AUDIT_FIRST_USER_MSG + { "AUDIT_FIRST_USER_MSG", (unsigned long) AUDIT_FIRST_USER_MSG }, +#endif // AUDIT_FIRST_USER_MSG +#ifdef AUDIT_FIRST_USER_MSG2 + { "AUDIT_FIRST_USER_MSG2", (unsigned long) AUDIT_FIRST_USER_MSG2 }, +#endif // AUDIT_FIRST_USER_MSG2 +#ifdef AUDIT_FSGID + { "AUDIT_FSGID", (unsigned long) AUDIT_FSGID }, +#endif // AUDIT_FSGID +#ifdef AUDIT_FSTYPE + { "AUDIT_FSTYPE", (unsigned long) AUDIT_FSTYPE }, +#endif // AUDIT_FSTYPE +#ifdef AUDIT_FSUID + { "AUDIT_FSUID", (unsigned long) AUDIT_FSUID }, +#endif // AUDIT_FSUID +#ifdef AUDIT_GET + { "AUDIT_GET", (unsigned long) AUDIT_GET }, +#endif // AUDIT_GET +#ifdef AUDIT_GET_FEATURE + { "AUDIT_GET_FEATURE", (unsigned long) AUDIT_GET_FEATURE }, +#endif // AUDIT_GET_FEATURE +#ifdef AUDIT_GID + { "AUDIT_GID", (unsigned long) AUDIT_GID }, +#endif // AUDIT_GID +#ifdef AUDIT_GREATER_THAN + { "AUDIT_GREATER_THAN", (unsigned long) AUDIT_GREATER_THAN }, +#endif // AUDIT_GREATER_THAN +#ifdef AUDIT_INODE + { "AUDIT_INODE", (unsigned long) AUDIT_INODE }, +#endif // AUDIT_INODE +#ifdef AUDIT_INTEGRITY_DATA + { "AUDIT_INTEGRITY_DATA", (unsigned long) AUDIT_INTEGRITY_DATA }, +#endif // AUDIT_INTEGRITY_DATA +#ifdef AUDIT_INTEGRITY_EVM_XATTR + { "AUDIT_INTEGRITY_EVM_XATTR", (unsigned long) AUDIT_INTEGRITY_EVM_XATTR }, +#endif // AUDIT_INTEGRITY_EVM_XATTR +#ifdef AUDIT_INTEGRITY_HASH + { "AUDIT_INTEGRITY_HASH", (unsigned long) AUDIT_INTEGRITY_HASH }, +#endif // AUDIT_INTEGRITY_HASH +#ifdef AUDIT_INTEGRITY_METADATA + { "AUDIT_INTEGRITY_METADATA", (unsigned long) AUDIT_INTEGRITY_METADATA }, +#endif // AUDIT_INTEGRITY_METADATA +#ifdef AUDIT_INTEGRITY_PCR + { "AUDIT_INTEGRITY_PCR", (unsigned long) AUDIT_INTEGRITY_PCR }, +#endif // AUDIT_INTEGRITY_PCR +#ifdef AUDIT_INTEGRITY_POLICY_RULE + { "AUDIT_INTEGRITY_POLICY_RULE", (unsigned long) AUDIT_INTEGRITY_POLICY_RULE }, +#endif // AUDIT_INTEGRITY_POLICY_RULE +#ifdef AUDIT_INTEGRITY_RULE + { "AUDIT_INTEGRITY_RULE", (unsigned long) AUDIT_INTEGRITY_RULE }, +#endif // AUDIT_INTEGRITY_RULE +#ifdef AUDIT_INTEGRITY_STATUS + { "AUDIT_INTEGRITY_STATUS", (unsigned long) AUDIT_INTEGRITY_STATUS }, +#endif // AUDIT_INTEGRITY_STATUS +#ifdef AUDIT_IPC + { "AUDIT_IPC", (unsigned long) AUDIT_IPC }, +#endif // AUDIT_IPC +#ifdef AUDIT_IPC_SET_PERM + { "AUDIT_IPC_SET_PERM", (unsigned long) AUDIT_IPC_SET_PERM }, +#endif // AUDIT_IPC_SET_PERM +#ifdef AUDIT_KERNEL + { "AUDIT_KERNEL", (unsigned long) AUDIT_KERNEL }, +#endif // AUDIT_KERNEL +#ifdef AUDIT_KERNEL_OTHER + { "AUDIT_KERNEL_OTHER", (unsigned long) AUDIT_KERNEL_OTHER }, +#endif // AUDIT_KERNEL_OTHER +#ifdef AUDIT_KERN_MODULE + { "AUDIT_KERN_MODULE", (unsigned long) AUDIT_KERN_MODULE }, +#endif // AUDIT_KERN_MODULE +#ifdef AUDIT_LAST_FEATURE + { "AUDIT_LAST_FEATURE", (unsigned long) AUDIT_LAST_FEATURE }, +#endif // AUDIT_LAST_FEATURE +#ifdef AUDIT_LAST_KERN_ANOM_MSG + { "AUDIT_LAST_KERN_ANOM_MSG", (unsigned long) AUDIT_LAST_KERN_ANOM_MSG }, +#endif // AUDIT_LAST_KERN_ANOM_MSG +#ifdef AUDIT_LAST_USER_MSG + { "AUDIT_LAST_USER_MSG", (unsigned long) AUDIT_LAST_USER_MSG }, +#endif // AUDIT_LAST_USER_MSG +#ifdef AUDIT_LAST_USER_MSG2 + { "AUDIT_LAST_USER_MSG2", (unsigned long) AUDIT_LAST_USER_MSG2 }, +#endif // AUDIT_LAST_USER_MSG2 +#ifdef AUDIT_LESS_THAN + { "AUDIT_LESS_THAN", (unsigned long) AUDIT_LESS_THAN }, +#endif // AUDIT_LESS_THAN +#ifdef AUDIT_LIST + { "AUDIT_LIST", (unsigned long) AUDIT_LIST }, +#endif // AUDIT_LIST +#ifdef AUDIT_LIST_RULES + { "AUDIT_LIST_RULES", (unsigned long) AUDIT_LIST_RULES }, +#endif // AUDIT_LIST_RULES +#ifdef AUDIT_LOGIN + { "AUDIT_LOGIN", (unsigned long) AUDIT_LOGIN }, +#endif // AUDIT_LOGIN +#ifdef AUDIT_LOGINUID + { "AUDIT_LOGINUID", (unsigned long) AUDIT_LOGINUID }, +#endif // AUDIT_LOGINUID +#ifdef AUDIT_LOGINUID_SET + { "AUDIT_LOGINUID_SET", (unsigned long) AUDIT_LOGINUID_SET }, +#endif // AUDIT_LOGINUID_SET +#ifdef AUDIT_MAC_CALIPSO_ADD + { "AUDIT_MAC_CALIPSO_ADD", (unsigned long) AUDIT_MAC_CALIPSO_ADD }, +#endif // AUDIT_MAC_CALIPSO_ADD +#ifdef AUDIT_MAC_CALIPSO_DEL + { "AUDIT_MAC_CALIPSO_DEL", (unsigned long) AUDIT_MAC_CALIPSO_DEL }, +#endif // AUDIT_MAC_CALIPSO_DEL +#ifdef AUDIT_MAC_CIPSOV4_ADD + { "AUDIT_MAC_CIPSOV4_ADD", (unsigned long) AUDIT_MAC_CIPSOV4_ADD }, +#endif // AUDIT_MAC_CIPSOV4_ADD +#ifdef AUDIT_MAC_CIPSOV4_DEL + { "AUDIT_MAC_CIPSOV4_DEL", (unsigned long) AUDIT_MAC_CIPSOV4_DEL }, +#endif // AUDIT_MAC_CIPSOV4_DEL +#ifdef AUDIT_MAC_CONFIG_CHANGE + { "AUDIT_MAC_CONFIG_CHANGE", (unsigned long) AUDIT_MAC_CONFIG_CHANGE }, +#endif // AUDIT_MAC_CONFIG_CHANGE +#ifdef AUDIT_MAC_IPSEC_ADDSA + { "AUDIT_MAC_IPSEC_ADDSA", (unsigned long) AUDIT_MAC_IPSEC_ADDSA }, +#endif // AUDIT_MAC_IPSEC_ADDSA +#ifdef AUDIT_MAC_IPSEC_ADDSPD + { "AUDIT_MAC_IPSEC_ADDSPD", (unsigned long) AUDIT_MAC_IPSEC_ADDSPD }, +#endif // AUDIT_MAC_IPSEC_ADDSPD +#ifdef AUDIT_MAC_IPSEC_DELSA + { "AUDIT_MAC_IPSEC_DELSA", (unsigned long) AUDIT_MAC_IPSEC_DELSA }, +#endif // AUDIT_MAC_IPSEC_DELSA +#ifdef AUDIT_MAC_IPSEC_DELSPD + { "AUDIT_MAC_IPSEC_DELSPD", (unsigned long) AUDIT_MAC_IPSEC_DELSPD }, +#endif // AUDIT_MAC_IPSEC_DELSPD +#ifdef AUDIT_MAC_IPSEC_EVENT + { "AUDIT_MAC_IPSEC_EVENT", (unsigned long) AUDIT_MAC_IPSEC_EVENT }, +#endif // AUDIT_MAC_IPSEC_EVENT +#ifdef AUDIT_MAC_MAP_ADD + { "AUDIT_MAC_MAP_ADD", (unsigned long) AUDIT_MAC_MAP_ADD }, +#endif // AUDIT_MAC_MAP_ADD +#ifdef AUDIT_MAC_MAP_DEL + { "AUDIT_MAC_MAP_DEL", (unsigned long) AUDIT_MAC_MAP_DEL }, +#endif // AUDIT_MAC_MAP_DEL +#ifdef AUDIT_MAC_POLICY_LOAD + { "AUDIT_MAC_POLICY_LOAD", (unsigned long) AUDIT_MAC_POLICY_LOAD }, +#endif // AUDIT_MAC_POLICY_LOAD +#ifdef AUDIT_MAC_STATUS + { "AUDIT_MAC_STATUS", (unsigned long) AUDIT_MAC_STATUS }, +#endif // AUDIT_MAC_STATUS +#ifdef AUDIT_MAC_UNLBL_ALLOW + { "AUDIT_MAC_UNLBL_ALLOW", (unsigned long) AUDIT_MAC_UNLBL_ALLOW }, +#endif // AUDIT_MAC_UNLBL_ALLOW +#ifdef AUDIT_MAC_UNLBL_STCADD + { "AUDIT_MAC_UNLBL_STCADD", (unsigned long) AUDIT_MAC_UNLBL_STCADD }, +#endif // AUDIT_MAC_UNLBL_STCADD +#ifdef AUDIT_MAC_UNLBL_STCDEL + { "AUDIT_MAC_UNLBL_STCDEL", (unsigned long) AUDIT_MAC_UNLBL_STCDEL }, +#endif // AUDIT_MAC_UNLBL_STCDEL +#ifdef AUDIT_MAKE_EQUIV + { "AUDIT_MAKE_EQUIV", (unsigned long) AUDIT_MAKE_EQUIV }, +#endif // AUDIT_MAKE_EQUIV +#ifdef AUDIT_MAX_FIELD_COMPARE + { "AUDIT_MAX_FIELD_COMPARE", (unsigned long) AUDIT_MAX_FIELD_COMPARE }, +#endif // AUDIT_MAX_FIELD_COMPARE +#ifdef AUDIT_MAX_FIELDS + { "AUDIT_MAX_FIELDS", (unsigned long) AUDIT_MAX_FIELDS }, +#endif // AUDIT_MAX_FIELDS +#ifdef AUDIT_MAX_KEY_LEN + { "AUDIT_MAX_KEY_LEN", (unsigned long) AUDIT_MAX_KEY_LEN }, +#endif // AUDIT_MAX_KEY_LEN +#ifdef AUDIT_MESSAGE_TEXT_MAX + { "AUDIT_MESSAGE_TEXT_MAX", (unsigned long) AUDIT_MESSAGE_TEXT_MAX }, +#endif // AUDIT_MESSAGE_TEXT_MAX +#ifdef AUDIT_MMAP + { "AUDIT_MMAP", (unsigned long) AUDIT_MMAP }, +#endif // AUDIT_MMAP +#ifdef AUDIT_MQ_GETSETATTR + { "AUDIT_MQ_GETSETATTR", (unsigned long) AUDIT_MQ_GETSETATTR }, +#endif // AUDIT_MQ_GETSETATTR +#ifdef AUDIT_MQ_NOTIFY + { "AUDIT_MQ_NOTIFY", (unsigned long) AUDIT_MQ_NOTIFY }, +#endif // AUDIT_MQ_NOTIFY +#ifdef AUDIT_MQ_OPEN + { "AUDIT_MQ_OPEN", (unsigned long) AUDIT_MQ_OPEN }, +#endif // AUDIT_MQ_OPEN +#ifdef AUDIT_MQ_SENDRECV + { "AUDIT_MQ_SENDRECV", (unsigned long) AUDIT_MQ_SENDRECV }, +#endif // AUDIT_MQ_SENDRECV +#ifdef AUDIT_MSGTYPE + { "AUDIT_MSGTYPE", (unsigned long) AUDIT_MSGTYPE }, +#endif // AUDIT_MSGTYPE +#ifdef AUDIT_NEGATE + { "AUDIT_NEGATE", (unsigned long) AUDIT_NEGATE }, +#endif // AUDIT_NEGATE +#ifdef AUDIT_NETFILTER_CFG + { "AUDIT_NETFILTER_CFG", (unsigned long) AUDIT_NETFILTER_CFG }, +#endif // AUDIT_NETFILTER_CFG +#ifdef AUDIT_NETFILTER_PKT + { "AUDIT_NETFILTER_PKT", (unsigned long) AUDIT_NETFILTER_PKT }, +#endif // AUDIT_NETFILTER_PKT +#ifdef AUDIT_NEVER + { "AUDIT_NEVER", (unsigned long) AUDIT_NEVER }, +#endif // AUDIT_NEVER +#ifdef AUDIT_NOT_EQUAL + { "AUDIT_NOT_EQUAL", (unsigned long) AUDIT_NOT_EQUAL }, +#endif // AUDIT_NOT_EQUAL +#ifdef AUDIT_NR_FILTERS + { "AUDIT_NR_FILTERS", (unsigned long) AUDIT_NR_FILTERS }, +#endif // AUDIT_NR_FILTERS +#ifdef AUDIT_OBJ_GID + { "AUDIT_OBJ_GID", (unsigned long) AUDIT_OBJ_GID }, +#endif // AUDIT_OBJ_GID +#ifdef AUDIT_OBJ_LEV_HIGH + { "AUDIT_OBJ_LEV_HIGH", (unsigned long) AUDIT_OBJ_LEV_HIGH }, +#endif // AUDIT_OBJ_LEV_HIGH +#ifdef AUDIT_OBJ_LEV_LOW + { "AUDIT_OBJ_LEV_LOW", (unsigned long) AUDIT_OBJ_LEV_LOW }, +#endif // AUDIT_OBJ_LEV_LOW +#ifdef AUDIT_OBJ_PID + { "AUDIT_OBJ_PID", (unsigned long) AUDIT_OBJ_PID }, +#endif // AUDIT_OBJ_PID +#ifdef AUDIT_OBJ_ROLE + { "AUDIT_OBJ_ROLE", (unsigned long) AUDIT_OBJ_ROLE }, +#endif // AUDIT_OBJ_ROLE +#ifdef AUDIT_OBJ_TYPE + { "AUDIT_OBJ_TYPE", (unsigned long) AUDIT_OBJ_TYPE }, +#endif // AUDIT_OBJ_TYPE +#ifdef AUDIT_OBJ_UID + { "AUDIT_OBJ_UID", (unsigned long) AUDIT_OBJ_UID }, +#endif // AUDIT_OBJ_UID +#ifdef AUDIT_OBJ_USER + { "AUDIT_OBJ_USER", (unsigned long) AUDIT_OBJ_USER }, +#endif // AUDIT_OBJ_USER +#ifdef AUDIT_PATH + { "AUDIT_PATH", (unsigned long) AUDIT_PATH }, +#endif // AUDIT_PATH +#ifdef AUDIT_PERM + { "AUDIT_PERM", (unsigned long) AUDIT_PERM }, +#endif // AUDIT_PERM +#ifdef AUDIT_PERM_ATTR + { "AUDIT_PERM_ATTR", (unsigned long) AUDIT_PERM_ATTR }, +#endif // AUDIT_PERM_ATTR +#ifdef AUDIT_PERM_EXEC + { "AUDIT_PERM_EXEC", (unsigned long) AUDIT_PERM_EXEC }, +#endif // AUDIT_PERM_EXEC +#ifdef AUDIT_PERM_READ + { "AUDIT_PERM_READ", (unsigned long) AUDIT_PERM_READ }, +#endif // AUDIT_PERM_READ +#ifdef AUDIT_PERM_WRITE + { "AUDIT_PERM_WRITE", (unsigned long) AUDIT_PERM_WRITE }, +#endif // AUDIT_PERM_WRITE +#ifdef AUDIT_PERS + { "AUDIT_PERS", (unsigned long) AUDIT_PERS }, +#endif // AUDIT_PERS +#ifdef AUDIT_PID + { "AUDIT_PID", (unsigned long) AUDIT_PID }, +#endif // AUDIT_PID +#ifdef AUDIT_POSSIBLE + { "AUDIT_POSSIBLE", (unsigned long) AUDIT_POSSIBLE }, +#endif // AUDIT_POSSIBLE +#ifdef AUDIT_PPID + { "AUDIT_PPID", (unsigned long) AUDIT_PPID }, +#endif // AUDIT_PPID +#ifdef AUDIT_PROCTITLE + { "AUDIT_PROCTITLE", (unsigned long) AUDIT_PROCTITLE }, +#endif // AUDIT_PROCTITLE +#ifdef AUDIT_REPLACE + { "AUDIT_REPLACE", (unsigned long) AUDIT_REPLACE }, +#endif // AUDIT_REPLACE +#ifdef AUDIT_SADDR_FAM + { "AUDIT_SADDR_FAM", (unsigned long) AUDIT_SADDR_FAM }, +#endif // AUDIT_SADDR_FAM +#ifdef AUDIT_SECCOMP + { "AUDIT_SECCOMP", (unsigned long) AUDIT_SECCOMP }, +#endif // AUDIT_SECCOMP +#ifdef AUDIT_SELINUX_ERR + { "AUDIT_SELINUX_ERR", (unsigned long) AUDIT_SELINUX_ERR }, +#endif // AUDIT_SELINUX_ERR +#ifdef AUDIT_SESSIONID + { "AUDIT_SESSIONID", (unsigned long) AUDIT_SESSIONID }, +#endif // AUDIT_SESSIONID +#ifdef AUDIT_SET + { "AUDIT_SET", (unsigned long) AUDIT_SET }, +#endif // AUDIT_SET +#ifdef AUDIT_SET_FEATURE + { "AUDIT_SET_FEATURE", (unsigned long) AUDIT_SET_FEATURE }, +#endif // AUDIT_SET_FEATURE +#ifdef AUDIT_SGID + { "AUDIT_SGID", (unsigned long) AUDIT_SGID }, +#endif // AUDIT_SGID +#ifdef AUDIT_SIGNAL_INFO + { "AUDIT_SIGNAL_INFO", (unsigned long) AUDIT_SIGNAL_INFO }, +#endif // AUDIT_SIGNAL_INFO +#ifdef AUDIT_SOCKADDR + { "AUDIT_SOCKADDR", (unsigned long) AUDIT_SOCKADDR }, +#endif // AUDIT_SOCKADDR +#ifdef AUDIT_SOCKETCALL + { "AUDIT_SOCKETCALL", (unsigned long) AUDIT_SOCKETCALL }, +#endif // AUDIT_SOCKETCALL +#ifdef AUDIT_STATUS_BACKLOG_LIMIT + { "AUDIT_STATUS_BACKLOG_LIMIT", (unsigned long) AUDIT_STATUS_BACKLOG_LIMIT }, +#endif // AUDIT_STATUS_BACKLOG_LIMIT +#ifdef AUDIT_STATUS_BACKLOG_WAIT_TIME + { "AUDIT_STATUS_BACKLOG_WAIT_TIME", (unsigned long) AUDIT_STATUS_BACKLOG_WAIT_TIME }, +#endif // AUDIT_STATUS_BACKLOG_WAIT_TIME +#ifdef AUDIT_STATUS_ENABLED + { "AUDIT_STATUS_ENABLED", (unsigned long) AUDIT_STATUS_ENABLED }, +#endif // AUDIT_STATUS_ENABLED +#ifdef AUDIT_STATUS_FAILURE + { "AUDIT_STATUS_FAILURE", (unsigned long) AUDIT_STATUS_FAILURE }, +#endif // AUDIT_STATUS_FAILURE +#ifdef AUDIT_STATUS_LOST + { "AUDIT_STATUS_LOST", (unsigned long) AUDIT_STATUS_LOST }, +#endif // AUDIT_STATUS_LOST +#ifdef AUDIT_STATUS_PID + { "AUDIT_STATUS_PID", (unsigned long) AUDIT_STATUS_PID }, +#endif // AUDIT_STATUS_PID +#ifdef AUDIT_STATUS_RATE_LIMIT + { "AUDIT_STATUS_RATE_LIMIT", (unsigned long) AUDIT_STATUS_RATE_LIMIT }, +#endif // AUDIT_STATUS_RATE_LIMIT +#ifdef AUDIT_SUBJ_CLR + { "AUDIT_SUBJ_CLR", (unsigned long) AUDIT_SUBJ_CLR }, +#endif // AUDIT_SUBJ_CLR +#ifdef AUDIT_SUBJ_ROLE + { "AUDIT_SUBJ_ROLE", (unsigned long) AUDIT_SUBJ_ROLE }, +#endif // AUDIT_SUBJ_ROLE +#ifdef AUDIT_SUBJ_SEN + { "AUDIT_SUBJ_SEN", (unsigned long) AUDIT_SUBJ_SEN }, +#endif // AUDIT_SUBJ_SEN +#ifdef AUDIT_SUBJ_TYPE + { "AUDIT_SUBJ_TYPE", (unsigned long) AUDIT_SUBJ_TYPE }, +#endif // AUDIT_SUBJ_TYPE +#ifdef AUDIT_SUBJ_USER + { "AUDIT_SUBJ_USER", (unsigned long) AUDIT_SUBJ_USER }, +#endif // AUDIT_SUBJ_USER +#ifdef AUDIT_SUCCESS + { "AUDIT_SUCCESS", (unsigned long) AUDIT_SUCCESS }, +#endif // AUDIT_SUCCESS +#ifdef AUDIT_SUID + { "AUDIT_SUID", (unsigned long) AUDIT_SUID }, +#endif // AUDIT_SUID +#ifdef AUDIT_SYSCALL + { "AUDIT_SYSCALL", (unsigned long) AUDIT_SYSCALL }, +#endif // AUDIT_SYSCALL +#ifdef AUDIT_SYSCALL_CLASSES + { "AUDIT_SYSCALL_CLASSES", (unsigned long) AUDIT_SYSCALL_CLASSES }, +#endif // AUDIT_SYSCALL_CLASSES +#ifdef AUDIT_TIME_ADJNTPVAL + { "AUDIT_TIME_ADJNTPVAL", (unsigned long) AUDIT_TIME_ADJNTPVAL }, +#endif // AUDIT_TIME_ADJNTPVAL +#ifdef AUDIT_TIME_INJOFFSET + { "AUDIT_TIME_INJOFFSET", (unsigned long) AUDIT_TIME_INJOFFSET }, +#endif // AUDIT_TIME_INJOFFSET +#ifdef AUDIT_TRIM + { "AUDIT_TRIM", (unsigned long) AUDIT_TRIM }, +#endif // AUDIT_TRIM +#ifdef AUDIT_TTY + { "AUDIT_TTY", (unsigned long) AUDIT_TTY }, +#endif // AUDIT_TTY +#ifdef AUDIT_TTY_GET + { "AUDIT_TTY_GET", (unsigned long) AUDIT_TTY_GET }, +#endif // AUDIT_TTY_GET +#ifdef AUDIT_TTY_SET + { "AUDIT_TTY_SET", (unsigned long) AUDIT_TTY_SET }, +#endif // AUDIT_TTY_SET +#ifdef AUDIT_UID + { "AUDIT_UID", (unsigned long) AUDIT_UID }, +#endif // AUDIT_UID +#ifdef AUDIT_UNUSED_BITS + { "AUDIT_UNUSED_BITS", (unsigned long) AUDIT_UNUSED_BITS }, +#endif // AUDIT_UNUSED_BITS +#ifdef AUDIT_USER + { "AUDIT_USER", (unsigned long) AUDIT_USER }, +#endif // AUDIT_USER +#ifdef AUDIT_USER_AVC + { "AUDIT_USER_AVC", (unsigned long) AUDIT_USER_AVC }, +#endif // AUDIT_USER_AVC +#ifdef AUDIT_USER_TTY + { "AUDIT_USER_TTY", (unsigned long) AUDIT_USER_TTY }, +#endif // AUDIT_USER_TTY +#ifdef AUDIT_VERSION_BACKLOG_LIMIT + { "AUDIT_VERSION_BACKLOG_LIMIT", (unsigned long) AUDIT_VERSION_BACKLOG_LIMIT }, +#endif // AUDIT_VERSION_BACKLOG_LIMIT +#ifdef AUDIT_VERSION_BACKLOG_WAIT_TIME + { "AUDIT_VERSION_BACKLOG_WAIT_TIME", (unsigned long) AUDIT_VERSION_BACKLOG_WAIT_TIME }, +#endif // AUDIT_VERSION_BACKLOG_WAIT_TIME +#ifdef AUDIT_VERSION_LATEST + { "AUDIT_VERSION_LATEST", (unsigned long) AUDIT_VERSION_LATEST }, +#endif // AUDIT_VERSION_LATEST +#ifdef AUDIT_WATCH + { "AUDIT_WATCH", (unsigned long) AUDIT_WATCH }, +#endif // AUDIT_WATCH +#ifdef AUDIT_WATCH_INS + { "AUDIT_WATCH_INS", (unsigned long) AUDIT_WATCH_INS }, +#endif // AUDIT_WATCH_INS +#ifdef AUDIT_WATCH_LIST + { "AUDIT_WATCH_LIST", (unsigned long) AUDIT_WATCH_LIST }, +#endif // AUDIT_WATCH_LIST +#ifdef AUDIT_WATCH_REM + { "AUDIT_WATCH_REM", (unsigned long) AUDIT_WATCH_REM }, +#endif // AUDIT_WATCH_REM +#ifdef B0 + { "B0", (unsigned long) B0 }, +#endif // B0 +#ifdef B1000000 + { "B1000000", (unsigned long) B1000000 }, +#endif // B1000000 +#ifdef B110 + { "B110", (unsigned long) B110 }, +#endif // B110 +#ifdef B1152000 + { "B1152000", (unsigned long) B1152000 }, +#endif // B1152000 +#ifdef B115200 + { "B115200", (unsigned long) B115200 }, +#endif // B115200 +#ifdef B1200 + { "B1200", (unsigned long) B1200 }, +#endif // B1200 +#ifdef B134 + { "B134", (unsigned long) B134 }, +#endif // B134 +#ifdef B1500000 + { "B1500000", (unsigned long) B1500000 }, +#endif // B1500000 +#ifdef B150 + { "B150", (unsigned long) B150 }, +#endif // B150 +#ifdef B1800 + { "B1800", (unsigned long) B1800 }, +#endif // B1800 +#ifdef B19200 + { "B19200", (unsigned long) B19200 }, +#endif // B19200 +#ifdef B2000000 + { "B2000000", (unsigned long) B2000000 }, +#endif // B2000000 +#ifdef B200 + { "B200", (unsigned long) B200 }, +#endif // B200 +#ifdef B230400 + { "B230400", (unsigned long) B230400 }, +#endif // B230400 +#ifdef B2400 + { "B2400", (unsigned long) B2400 }, +#endif // B2400 +#ifdef B2500000 + { "B2500000", (unsigned long) B2500000 }, +#endif // B2500000 +#ifdef B3000000 + { "B3000000", (unsigned long) B3000000 }, +#endif // B3000000 +#ifdef B300 + { "B300", (unsigned long) B300 }, +#endif // B300 +#ifdef B3500000 + { "B3500000", (unsigned long) B3500000 }, +#endif // B3500000 +#ifdef B38400 + { "B38400", (unsigned long) B38400 }, +#endif // B38400 +#ifdef B4000000 + { "B4000000", (unsigned long) B4000000 }, +#endif // B4000000 +#ifdef B460800 + { "B460800", (unsigned long) B460800 }, +#endif // B460800 +#ifdef B4800 + { "B4800", (unsigned long) B4800 }, +#endif // B4800 +#ifdef B50 + { "B50", (unsigned long) B50 }, +#endif // B50 +#ifdef B500000 + { "B500000", (unsigned long) B500000 }, +#endif // B500000 +#ifdef B576000 + { "B576000", (unsigned long) B576000 }, +#endif // B576000 +#ifdef B57600 + { "B57600", (unsigned long) B57600 }, +#endif // B57600 +#ifdef B600 + { "B600", (unsigned long) B600 }, +#endif // B600 +#ifdef B75 + { "B75", (unsigned long) B75 }, +#endif // B75 +#ifdef B921600 + { "B921600", (unsigned long) B921600 }, +#endif // B921600 +#ifdef B9600 + { "B9600", (unsigned long) B9600 }, +#endif // B9600 +#ifdef BIG_ENDIAN + { "BIG_ENDIAN", (unsigned long) BIG_ENDIAN }, +#endif // BIG_ENDIAN +#ifdef BLKALIGNOFF + { "BLKALIGNOFF", (unsigned long) BLKALIGNOFF }, +#endif // BLKALIGNOFF +#ifdef BLKBSZGET + { "BLKBSZGET", (unsigned long) BLKBSZGET }, +#endif // BLKBSZGET +#ifdef BLKBSZSET + { "BLKBSZSET", (unsigned long) BLKBSZSET }, +#endif // BLKBSZSET +#ifdef BLKDISCARD + { "BLKDISCARD", (unsigned long) BLKDISCARD }, +#endif // BLKDISCARD +#ifdef BLKDISCARDZEROES + { "BLKDISCARDZEROES", (unsigned long) BLKDISCARDZEROES }, +#endif // BLKDISCARDZEROES +#ifdef BLKFLSBUF + { "BLKFLSBUF", (unsigned long) BLKFLSBUF }, +#endif // BLKFLSBUF +#ifdef BLKFRAGET + { "BLKFRAGET", (unsigned long) BLKFRAGET }, +#endif // BLKFRAGET +#ifdef BLKFRASET + { "BLKFRASET", (unsigned long) BLKFRASET }, +#endif // BLKFRASET +#ifdef BLKGETSIZE64 + { "BLKGETSIZE64", (unsigned long) BLKGETSIZE64 }, +#endif // BLKGETSIZE64 +#ifdef BLKGETSIZE + { "BLKGETSIZE", (unsigned long) BLKGETSIZE }, +#endif // BLKGETSIZE +#ifdef BLKIOMIN + { "BLKIOMIN", (unsigned long) BLKIOMIN }, +#endif // BLKIOMIN +#ifdef BLKIOOPT + { "BLKIOOPT", (unsigned long) BLKIOOPT }, +#endif // BLKIOOPT +#ifdef BLKPBSZGET + { "BLKPBSZGET", (unsigned long) BLKPBSZGET }, +#endif // BLKPBSZGET +#ifdef BLKRAGET + { "BLKRAGET", (unsigned long) BLKRAGET }, +#endif // BLKRAGET +#ifdef BLKRASET + { "BLKRASET", (unsigned long) BLKRASET }, +#endif // BLKRASET +#ifdef BLKROGET + { "BLKROGET", (unsigned long) BLKROGET }, +#endif // BLKROGET +#ifdef BLKROSET + { "BLKROSET", (unsigned long) BLKROSET }, +#endif // BLKROSET +#ifdef BLKROTATIONAL + { "BLKROTATIONAL", (unsigned long) BLKROTATIONAL }, +#endif // BLKROTATIONAL +#ifdef BLKRRPART + { "BLKRRPART", (unsigned long) BLKRRPART }, +#endif // BLKRRPART +#ifdef BLKSECDISCARD + { "BLKSECDISCARD", (unsigned long) BLKSECDISCARD }, +#endif // BLKSECDISCARD +#ifdef BLKSECTGET + { "BLKSECTGET", (unsigned long) BLKSECTGET }, +#endif // BLKSECTGET +#ifdef BLKSECTSET + { "BLKSECTSET", (unsigned long) BLKSECTSET }, +#endif // BLKSECTSET +#ifdef BLKSSZGET + { "BLKSSZGET", (unsigned long) BLKSSZGET }, +#endif // BLKSSZGET +#ifdef BLKTRACESETUP + { "BLKTRACESETUP", (unsigned long) BLKTRACESETUP }, +#endif // BLKTRACESETUP +#ifdef BLKTRACESTART + { "BLKTRACESTART", (unsigned long) BLKTRACESTART }, +#endif // BLKTRACESTART +#ifdef BLKTRACESTOP + { "BLKTRACESTOP", (unsigned long) BLKTRACESTOP }, +#endif // BLKTRACESTOP +#ifdef BLKTRACETEARDOWN + { "BLKTRACETEARDOWN", (unsigned long) BLKTRACETEARDOWN }, +#endif // BLKTRACETEARDOWN +#ifdef BLKZEROOUT + { "BLKZEROOUT", (unsigned long) BLKZEROOUT }, +#endif // BLKZEROOUT +#ifdef BLOCK_SIZE_BITS + { "BLOCK_SIZE_BITS", (unsigned long) BLOCK_SIZE_BITS }, +#endif // BLOCK_SIZE_BITS +#ifdef BMAP_IOCTL + { "BMAP_IOCTL", (unsigned long) BMAP_IOCTL }, +#endif // BMAP_IOCTL +#ifdef BOTHER + { "BOTHER", (unsigned long) BOTHER }, +#endif // BOTHER +#ifdef BRKINT + { "BRKINT", (unsigned long) BRKINT }, +#endif // BRKINT +#ifdef BS0 + { "BS0", (unsigned long) BS0 }, +#endif // BS0 +#ifdef BS1 + { "BS1", (unsigned long) BS1 }, +#endif // BS1 +#ifdef BSDLY + { "BSDLY", (unsigned long) BSDLY }, +#endif // BSDLY #ifdef BUS_ADRALN - {"BUS_ADRALN", (unsigned long)BUS_ADRALN}, + { "BUS_ADRALN", (unsigned long) BUS_ADRALN }, #endif // BUS_ADRALN #ifdef BUS_ADRERR - {"BUS_ADRERR", (unsigned long)BUS_ADRERR}, + { "BUS_ADRERR", (unsigned long) BUS_ADRERR }, #endif // BUS_ADRERR #ifdef BUS_MCEERR_AO - {"BUS_MCEERR_AO", (unsigned long)BUS_MCEERR_AO}, + { "BUS_MCEERR_AO", (unsigned long) BUS_MCEERR_AO }, #endif // BUS_MCEERR_AO #ifdef BUS_MCEERR_AR - {"BUS_MCEERR_AR", (unsigned long)BUS_MCEERR_AR}, + { "BUS_MCEERR_AR", (unsigned long) BUS_MCEERR_AR }, #endif // BUS_MCEERR_AR #ifdef BUS_OBJERR - {"BUS_OBJERR", (unsigned long)BUS_OBJERR}, + { "BUS_OBJERR", (unsigned long) BUS_OBJERR }, #endif // BUS_OBJERR +#ifdef BYTE_ORDER + { "BYTE_ORDER", (unsigned long) BYTE_ORDER }, +#endif // BYTE_ORDER +#ifdef CBAUD + { "CBAUD", (unsigned long) CBAUD }, +#endif // CBAUD +#ifdef CBAUDEX + { "CBAUDEX", (unsigned long) CBAUDEX }, +#endif // CBAUDEX +#ifdef CIBAUD + { "CIBAUD", (unsigned long) CIBAUD }, +#endif // CIBAUD #ifdef CLD_CONTINUED - {"CLD_CONTINUED", (unsigned long)CLD_CONTINUED}, + { "CLD_CONTINUED", (unsigned long) CLD_CONTINUED }, #endif // CLD_CONTINUED #ifdef CLD_DUMPED - {"CLD_DUMPED", (unsigned long)CLD_DUMPED}, + { "CLD_DUMPED", (unsigned long) CLD_DUMPED }, #endif // CLD_DUMPED #ifdef CLD_EXITED - {"CLD_EXITED", (unsigned long)CLD_EXITED}, + { "CLD_EXITED", (unsigned long) CLD_EXITED }, #endif // CLD_EXITED #ifdef CLD_KILLED - {"CLD_KILLED", (unsigned long)CLD_KILLED}, + { "CLD_KILLED", (unsigned long) CLD_KILLED }, #endif // CLD_KILLED #ifdef CLD_STOPPED - {"CLD_STOPPED", (unsigned long)CLD_STOPPED}, + { "CLD_STOPPED", (unsigned long) CLD_STOPPED }, #endif // CLD_STOPPED #ifdef CLD_TRAPPED - {"CLD_TRAPPED", (unsigned long)CLD_TRAPPED}, + { "CLD_TRAPPED", (unsigned long) CLD_TRAPPED }, #endif // CLD_TRAPPED +#ifdef CLOCAL + { "CLOCAL", (unsigned long) CLOCAL }, +#endif // CLOCAL +#ifdef CLONE_ARGS_SIZE_VER0 + { "CLONE_ARGS_SIZE_VER0", (unsigned long) CLONE_ARGS_SIZE_VER0 }, +#endif // CLONE_ARGS_SIZE_VER0 +#ifdef CLONE_ARGS_SIZE_VER1 + { "CLONE_ARGS_SIZE_VER1", (unsigned long) CLONE_ARGS_SIZE_VER1 }, +#endif // CLONE_ARGS_SIZE_VER1 +#ifdef CLONE_ARGS_SIZE_VER2 + { "CLONE_ARGS_SIZE_VER2", (unsigned long) CLONE_ARGS_SIZE_VER2 }, +#endif // CLONE_ARGS_SIZE_VER2 #ifdef CLONE_CHILD_CLEARTID - {"CLONE_CHILD_CLEARTID", (unsigned long)CLONE_CHILD_CLEARTID}, + { "CLONE_CHILD_CLEARTID", (unsigned long) CLONE_CHILD_CLEARTID }, #endif // CLONE_CHILD_CLEARTID #ifdef CLONE_CHILD_SETTID - {"CLONE_CHILD_SETTID", (unsigned long)CLONE_CHILD_SETTID}, + { "CLONE_CHILD_SETTID", (unsigned long) CLONE_CHILD_SETTID }, #endif // CLONE_CHILD_SETTID +#ifdef CLONE_CLEAR_SIGHAND + { "CLONE_CLEAR_SIGHAND", (unsigned long) CLONE_CLEAR_SIGHAND }, +#endif // CLONE_CLEAR_SIGHAND #ifdef CLONE_DETACHED - {"CLONE_DETACHED", (unsigned long)CLONE_DETACHED}, + { "CLONE_DETACHED", (unsigned long) CLONE_DETACHED }, #endif // CLONE_DETACHED #ifdef CLONE_FILES - {"CLONE_FILES", (unsigned long)CLONE_FILES}, + { "CLONE_FILES", (unsigned long) CLONE_FILES }, #endif // CLONE_FILES #ifdef CLONE_FS - {"CLONE_FS", (unsigned long)CLONE_FS}, + { "CLONE_FS", (unsigned long) CLONE_FS }, #endif // CLONE_FS +#ifdef CLONE_INTO_CGROUP + { "CLONE_INTO_CGROUP", (unsigned long) CLONE_INTO_CGROUP }, +#endif // CLONE_INTO_CGROUP #ifdef CLONE_IO - {"CLONE_IO", (unsigned long)CLONE_IO}, + { "CLONE_IO", (unsigned long) CLONE_IO }, #endif // CLONE_IO +#ifdef CLONE_NEWCGROUP + { "CLONE_NEWCGROUP", (unsigned long) CLONE_NEWCGROUP }, +#endif // CLONE_NEWCGROUP #ifdef CLONE_NEWIPC - {"CLONE_NEWIPC", (unsigned long)CLONE_NEWIPC}, + { "CLONE_NEWIPC", (unsigned long) CLONE_NEWIPC }, #endif // CLONE_NEWIPC #ifdef CLONE_NEWNET - {"CLONE_NEWNET", (unsigned long)CLONE_NEWNET}, + { "CLONE_NEWNET", (unsigned long) CLONE_NEWNET }, #endif // CLONE_NEWNET #ifdef CLONE_NEWNS - {"CLONE_NEWNS", (unsigned long)CLONE_NEWNS}, + { "CLONE_NEWNS", (unsigned long) CLONE_NEWNS }, #endif // CLONE_NEWNS #ifdef CLONE_NEWPID - {"CLONE_NEWPID", (unsigned long)CLONE_NEWPID}, + { "CLONE_NEWPID", (unsigned long) CLONE_NEWPID }, #endif // CLONE_NEWPID +#ifdef CLONE_NEWTIME + { "CLONE_NEWTIME", (unsigned long) CLONE_NEWTIME }, +#endif // CLONE_NEWTIME #ifdef CLONE_NEWUSER - {"CLONE_NEWUSER", (unsigned long)CLONE_NEWUSER}, + { "CLONE_NEWUSER", (unsigned long) CLONE_NEWUSER }, #endif // CLONE_NEWUSER #ifdef CLONE_NEWUTS - {"CLONE_NEWUTS", (unsigned long)CLONE_NEWUTS}, + { "CLONE_NEWUTS", (unsigned long) CLONE_NEWUTS }, #endif // CLONE_NEWUTS #ifdef CLONE_PARENT - {"CLONE_PARENT", (unsigned long)CLONE_PARENT}, + { "CLONE_PARENT", (unsigned long) CLONE_PARENT }, #endif // CLONE_PARENT #ifdef CLONE_PARENT_SETTID - {"CLONE_PARENT_SETTID", (unsigned long)CLONE_PARENT_SETTID}, + { "CLONE_PARENT_SETTID", (unsigned long) CLONE_PARENT_SETTID }, #endif // CLONE_PARENT_SETTID +#ifdef CLONE_PIDFD + { "CLONE_PIDFD", (unsigned long) CLONE_PIDFD }, +#endif // CLONE_PIDFD #ifdef CLONE_PTRACE - {"CLONE_PTRACE", (unsigned long)CLONE_PTRACE}, + { "CLONE_PTRACE", (unsigned long) CLONE_PTRACE }, #endif // CLONE_PTRACE #ifdef CLONE_SETTLS - {"CLONE_SETTLS", (unsigned long)CLONE_SETTLS}, + { "CLONE_SETTLS", (unsigned long) CLONE_SETTLS }, #endif // CLONE_SETTLS #ifdef CLONE_SIGHAND - {"CLONE_SIGHAND", (unsigned long)CLONE_SIGHAND}, + { "CLONE_SIGHAND", (unsigned long) CLONE_SIGHAND }, #endif // CLONE_SIGHAND #ifdef CLONE_SYSVSEM - {"CLONE_SYSVSEM", (unsigned long)CLONE_SYSVSEM}, + { "CLONE_SYSVSEM", (unsigned long) CLONE_SYSVSEM }, #endif // CLONE_SYSVSEM #ifdef CLONE_THREAD - {"CLONE_THREAD", (unsigned long)CLONE_THREAD}, + { "CLONE_THREAD", (unsigned long) CLONE_THREAD }, #endif // CLONE_THREAD #ifdef CLONE_UNTRACED - {"CLONE_UNTRACED", (unsigned long)CLONE_UNTRACED}, + { "CLONE_UNTRACED", (unsigned long) CLONE_UNTRACED }, #endif // CLONE_UNTRACED #ifdef CLONE_VFORK - {"CLONE_VFORK", (unsigned long)CLONE_VFORK}, + { "CLONE_VFORK", (unsigned long) CLONE_VFORK }, #endif // CLONE_VFORK #ifdef CLONE_VM - {"CLONE_VM", (unsigned long)CLONE_VM}, + { "CLONE_VM", (unsigned long) CLONE_VM }, #endif // CLONE_VM +#ifdef CMSPAR + { "CMSPAR", (unsigned long) CMSPAR }, +#endif // CMSPAR +#ifdef CR0 + { "CR0", (unsigned long) CR0 }, +#endif // CR0 +#ifdef CR1 + { "CR1", (unsigned long) CR1 }, +#endif // CR1 +#ifdef CR2 + { "CR2", (unsigned long) CR2 }, +#endif // CR2 +#ifdef CR3 + { "CR3", (unsigned long) CR3 }, +#endif // CR3 +#ifdef CRDLY + { "CRDLY", (unsigned long) CRDLY }, +#endif // CRDLY +#ifdef CREAD + { "CREAD", (unsigned long) CREAD }, +#endif // CREAD +#ifdef CRTSCTS + { "CRTSCTS", (unsigned long) CRTSCTS }, +#endif // CRTSCTS +#ifdef CS5 + { "CS5", (unsigned long) CS5 }, +#endif // CS5 +#ifdef CS6 + { "CS6", (unsigned long) CS6 }, +#endif // CS6 +#ifdef CS7 + { "CS7", (unsigned long) CS7 }, +#endif // CS7 +#ifdef CS8 + { "CS8", (unsigned long) CS8 }, +#endif // CS8 #ifdef CSIGNAL - {"CSIGNAL", (unsigned long)CSIGNAL}, + { "CSIGNAL", (unsigned long) CSIGNAL }, #endif // CSIGNAL +#ifdef CSIZE + { "CSIZE", (unsigned long) CSIZE }, +#endif // CSIZE +#ifdef CSTOPB + { "CSTOPB", (unsigned long) CSTOPB }, +#endif // CSTOPB +#ifdef CTSXON + { "CTSXON", (unsigned long) CTSXON }, +#endif // CTSXON +#ifdef DSRXON + { "DSRXON", (unsigned long) DSRXON }, +#endif // DSRXON +#ifdef DTRXOFF + { "DTRXOFF", (unsigned long) DTRXOFF }, +#endif // DTRXOFF #ifdef E2BIG - {"E2BIG", (unsigned long)E2BIG}, + { "E2BIG", (unsigned long) E2BIG }, #endif // E2BIG #ifdef EACCES - {"EACCES", (unsigned long)EACCES}, + { "EACCES", (unsigned long) EACCES }, #endif // EACCES #ifdef EADDRINUSE - {"EADDRINUSE", (unsigned long)EADDRINUSE}, + { "EADDRINUSE", (unsigned long) EADDRINUSE }, #endif // EADDRINUSE #ifdef EADDRNOTAVAIL - {"EADDRNOTAVAIL", (unsigned long)EADDRNOTAVAIL}, + { "EADDRNOTAVAIL", (unsigned long) EADDRNOTAVAIL }, #endif // EADDRNOTAVAIL #ifdef EADV - {"EADV", (unsigned long)EADV}, + { "EADV", (unsigned long) EADV }, #endif // EADV #ifdef EAFNOSUPPORT - {"EAFNOSUPPORT", (unsigned long)EAFNOSUPPORT}, + { "EAFNOSUPPORT", (unsigned long) EAFNOSUPPORT }, #endif // EAFNOSUPPORT #ifdef EAGAIN - {"EAGAIN", (unsigned long)EAGAIN}, + { "EAGAIN", (unsigned long) EAGAIN }, #endif // EAGAIN #ifdef EALREADY - {"EALREADY", (unsigned long)EALREADY}, + { "EALREADY", (unsigned long) EALREADY }, #endif // EALREADY #ifdef EBADE - {"EBADE", (unsigned long)EBADE}, + { "EBADE", (unsigned long) EBADE }, #endif // EBADE #ifdef EBADF - {"EBADF", (unsigned long)EBADF}, + { "EBADF", (unsigned long) EBADF }, #endif // EBADF #ifdef EBADFD - {"EBADFD", (unsigned long)EBADFD}, + { "EBADFD", (unsigned long) EBADFD }, #endif // EBADFD #ifdef EBADMSG - {"EBADMSG", (unsigned long)EBADMSG}, + { "EBADMSG", (unsigned long) EBADMSG }, #endif // EBADMSG #ifdef EBADR - {"EBADR", (unsigned long)EBADR}, + { "EBADR", (unsigned long) EBADR }, #endif // EBADR #ifdef EBADRQC - {"EBADRQC", (unsigned long)EBADRQC}, + { "EBADRQC", (unsigned long) EBADRQC }, #endif // EBADRQC #ifdef EBADSLT - {"EBADSLT", (unsigned long)EBADSLT}, + { "EBADSLT", (unsigned long) EBADSLT }, #endif // EBADSLT #ifdef EBFONT - {"EBFONT", (unsigned long)EBFONT}, + { "EBFONT", (unsigned long) EBFONT }, #endif // EBFONT #ifdef EBUSY - {"EBUSY", (unsigned long)EBUSY}, + { "EBUSY", (unsigned long) EBUSY }, #endif // EBUSY #ifdef ECANCELED - {"ECANCELED", (unsigned long)ECANCELED}, + { "ECANCELED", (unsigned long) ECANCELED }, #endif // ECANCELED #ifdef ECHILD - {"ECHILD", (unsigned long)ECHILD}, + { "ECHILD", (unsigned long) ECHILD }, #endif // ECHILD +#ifdef ECHO + { "ECHO", (unsigned long) ECHO }, +#endif // ECHO +#ifdef ECHOCTL + { "ECHOCTL", (unsigned long) ECHOCTL }, +#endif // ECHOCTL +#ifdef ECHOE + { "ECHOE", (unsigned long) ECHOE }, +#endif // ECHOE +#ifdef ECHOK + { "ECHOK", (unsigned long) ECHOK }, +#endif // ECHOK +#ifdef ECHOKE + { "ECHOKE", (unsigned long) ECHOKE }, +#endif // ECHOKE +#ifdef ECHONL + { "ECHONL", (unsigned long) ECHONL }, +#endif // ECHONL +#ifdef ECHOPRT + { "ECHOPRT", (unsigned long) ECHOPRT }, +#endif // ECHOPRT #ifdef ECHRNG - {"ECHRNG", (unsigned long)ECHRNG}, + { "ECHRNG", (unsigned long) ECHRNG }, #endif // ECHRNG #ifdef ECOMM - {"ECOMM", (unsigned long)ECOMM}, + { "ECOMM", (unsigned long) ECOMM }, #endif // ECOMM #ifdef ECONNABORTED - {"ECONNABORTED", (unsigned long)ECONNABORTED}, + { "ECONNABORTED", (unsigned long) ECONNABORTED }, #endif // ECONNABORTED #ifdef ECONNREFUSED - {"ECONNREFUSED", (unsigned long)ECONNREFUSED}, + { "ECONNREFUSED", (unsigned long) ECONNREFUSED }, #endif // ECONNREFUSED #ifdef ECONNRESET - {"ECONNRESET", (unsigned long)ECONNRESET}, + { "ECONNRESET", (unsigned long) ECONNRESET }, #endif // ECONNRESET #ifdef EDEADLK - {"EDEADLK", (unsigned long)EDEADLK}, + { "EDEADLK", (unsigned long) EDEADLK }, #endif // EDEADLK #ifdef EDEADLOCK - {"EDEADLOCK", (unsigned long)EDEADLOCK}, + { "EDEADLOCK", (unsigned long) EDEADLOCK }, #endif // EDEADLOCK #ifdef EDESTADDRREQ - {"EDESTADDRREQ", (unsigned long)EDESTADDRREQ}, + { "EDESTADDRREQ", (unsigned long) EDESTADDRREQ }, #endif // EDESTADDRREQ #ifdef EDOM - {"EDOM", (unsigned long)EDOM}, + { "EDOM", (unsigned long) EDOM }, #endif // EDOM #ifdef EDOTDOT - {"EDOTDOT", (unsigned long)EDOTDOT}, + { "EDOTDOT", (unsigned long) EDOTDOT }, #endif // EDOTDOT #ifdef EDQUOT - {"EDQUOT", (unsigned long)EDQUOT}, + { "EDQUOT", (unsigned long) EDQUOT }, #endif // EDQUOT #ifdef EEXIST - {"EEXIST", (unsigned long)EEXIST}, + { "EEXIST", (unsigned long) EEXIST }, #endif // EEXIST #ifdef EFAULT - {"EFAULT", (unsigned long)EFAULT}, + { "EFAULT", (unsigned long) EFAULT }, #endif // EFAULT #ifdef EFBIG - {"EFBIG", (unsigned long)EFBIG}, + { "EFBIG", (unsigned long) EFBIG }, #endif // EFBIG #ifdef EHOSTDOWN - {"EHOSTDOWN", (unsigned long)EHOSTDOWN}, + { "EHOSTDOWN", (unsigned long) EHOSTDOWN }, #endif // EHOSTDOWN #ifdef EHOSTUNREACH - {"EHOSTUNREACH", (unsigned long)EHOSTUNREACH}, + { "EHOSTUNREACH", (unsigned long) EHOSTUNREACH }, #endif // EHOSTUNREACH #ifdef EHWPOISON - {"EHWPOISON", (unsigned long)EHWPOISON}, + { "EHWPOISON", (unsigned long) EHWPOISON }, #endif // EHWPOISON #ifdef EIDRM - {"EIDRM", (unsigned long)EIDRM}, + { "EIDRM", (unsigned long) EIDRM }, #endif // EIDRM #ifdef EILSEQ - {"EILSEQ", (unsigned long)EILSEQ}, + { "EILSEQ", (unsigned long) EILSEQ }, #endif // EILSEQ #ifdef EINPROGRESS - {"EINPROGRESS", (unsigned long)EINPROGRESS}, + { "EINPROGRESS", (unsigned long) EINPROGRESS }, #endif // EINPROGRESS #ifdef EINTR - {"EINTR", (unsigned long)EINTR}, + { "EINTR", (unsigned long) EINTR }, #endif // EINTR #ifdef EINVAL - {"EINVAL", (unsigned long)EINVAL}, + { "EINVAL", (unsigned long) EINVAL }, #endif // EINVAL #ifdef EIO - {"EIO", (unsigned long)EIO}, + { "EIO", (unsigned long) EIO }, #endif // EIO #ifdef EISCONN - {"EISCONN", (unsigned long)EISCONN}, + { "EISCONN", (unsigned long) EISCONN }, #endif // EISCONN #ifdef EISDIR - {"EISDIR", (unsigned long)EISDIR}, + { "EISDIR", (unsigned long) EISDIR }, #endif // EISDIR #ifdef EISNAM - {"EISNAM", (unsigned long)EISNAM}, + { "EISNAM", (unsigned long) EISNAM }, #endif // EISNAM #ifdef EKEYEXPIRED - {"EKEYEXPIRED", (unsigned long)EKEYEXPIRED}, + { "EKEYEXPIRED", (unsigned long) EKEYEXPIRED }, #endif // EKEYEXPIRED #ifdef EKEYREJECTED - {"EKEYREJECTED", (unsigned long)EKEYREJECTED}, + { "EKEYREJECTED", (unsigned long) EKEYREJECTED }, #endif // EKEYREJECTED #ifdef EKEYREVOKED - {"EKEYREVOKED", (unsigned long)EKEYREVOKED}, + { "EKEYREVOKED", (unsigned long) EKEYREVOKED }, #endif // EKEYREVOKED #ifdef EL2HLT - {"EL2HLT", (unsigned long)EL2HLT}, + { "EL2HLT", (unsigned long) EL2HLT }, #endif // EL2HLT #ifdef EL2NSYNC - {"EL2NSYNC", (unsigned long)EL2NSYNC}, + { "EL2NSYNC", (unsigned long) EL2NSYNC }, #endif // EL2NSYNC #ifdef EL3HLT - {"EL3HLT", (unsigned long)EL3HLT}, + { "EL3HLT", (unsigned long) EL3HLT }, #endif // EL3HLT #ifdef EL3RST - {"EL3RST", (unsigned long)EL3RST}, + { "EL3RST", (unsigned long) EL3RST }, #endif // EL3RST #ifdef ELIBACC - {"ELIBACC", (unsigned long)ELIBACC}, + { "ELIBACC", (unsigned long) ELIBACC }, #endif // ELIBACC #ifdef ELIBBAD - {"ELIBBAD", (unsigned long)ELIBBAD}, + { "ELIBBAD", (unsigned long) ELIBBAD }, #endif // ELIBBAD #ifdef ELIBEXEC - {"ELIBEXEC", (unsigned long)ELIBEXEC}, + { "ELIBEXEC", (unsigned long) ELIBEXEC }, #endif // ELIBEXEC #ifdef ELIBMAX - {"ELIBMAX", (unsigned long)ELIBMAX}, + { "ELIBMAX", (unsigned long) ELIBMAX }, #endif // ELIBMAX #ifdef ELIBSCN - {"ELIBSCN", (unsigned long)ELIBSCN}, + { "ELIBSCN", (unsigned long) ELIBSCN }, #endif // ELIBSCN #ifdef ELNRNG - {"ELNRNG", (unsigned long)ELNRNG}, + { "ELNRNG", (unsigned long) ELNRNG }, #endif // ELNRNG #ifdef ELOOP - {"ELOOP", (unsigned long)ELOOP}, + { "ELOOP", (unsigned long) ELOOP }, #endif // ELOOP +#ifdef EM_386 + { "EM_386", (unsigned long) EM_386 }, +#endif // EM_386 +#ifdef EM_486 + { "EM_486", (unsigned long) EM_486 }, +#endif // EM_486 +#ifdef EM_68K + { "EM_68K", (unsigned long) EM_68K }, +#endif // EM_68K +#ifdef EM_860 + { "EM_860", (unsigned long) EM_860 }, +#endif // EM_860 +#ifdef EM_88K + { "EM_88K", (unsigned long) EM_88K }, +#endif // EM_88K +#ifdef EM_AARCH64 + { "EM_AARCH64", (unsigned long) EM_AARCH64 }, +#endif // EM_AARCH64 +#ifdef EM_ALPHA + { "EM_ALPHA", (unsigned long) EM_ALPHA }, +#endif // EM_ALPHA +#ifdef EM_ALTERA_NIOS2 + { "EM_ALTERA_NIOS2", (unsigned long) EM_ALTERA_NIOS2 }, +#endif // EM_ALTERA_NIOS2 +#ifdef EM_ARCOMPACT + { "EM_ARCOMPACT", (unsigned long) EM_ARCOMPACT }, +#endif // EM_ARCOMPACT +#ifdef EM_ARCV2 + { "EM_ARCV2", (unsigned long) EM_ARCV2 }, +#endif // EM_ARCV2 +#ifdef EM_ARM + { "EM_ARM", (unsigned long) EM_ARM }, +#endif // EM_ARM +#ifdef EM_BLACKFIN + { "EM_BLACKFIN", (unsigned long) EM_BLACKFIN }, +#endif // EM_BLACKFIN +#ifdef EM_BPF + { "EM_BPF", (unsigned long) EM_BPF }, +#endif // EM_BPF +#ifdef EM_CRIS + { "EM_CRIS", (unsigned long) EM_CRIS }, +#endif // EM_CRIS +#ifdef EM_CSKY + { "EM_CSKY", (unsigned long) EM_CSKY }, +#endif // EM_CSKY +#ifdef EM_CYGNUS_M32R + { "EM_CYGNUS_M32R", (unsigned long) EM_CYGNUS_M32R }, +#endif // EM_CYGNUS_M32R +#ifdef EM_CYGNUS_MN10300 + { "EM_CYGNUS_MN10300", (unsigned long) EM_CYGNUS_MN10300 }, +#endif // EM_CYGNUS_MN10300 #ifdef EMEDIUMTYPE - {"EMEDIUMTYPE", (unsigned long)EMEDIUMTYPE}, + { "EMEDIUMTYPE", (unsigned long) EMEDIUMTYPE }, #endif // EMEDIUMTYPE #ifdef EMFILE - {"EMFILE", (unsigned long)EMFILE}, + { "EMFILE", (unsigned long) EMFILE }, #endif // EMFILE +#ifdef EM_FRV + { "EM_FRV", (unsigned long) EM_FRV }, +#endif // EM_FRV +#ifdef EM_H8_300 + { "EM_H8_300", (unsigned long) EM_H8_300 }, +#endif // EM_H8_300 +#ifdef EM_HEXAGON + { "EM_HEXAGON", (unsigned long) EM_HEXAGON }, +#endif // EM_HEXAGON +#ifdef EM_IA_64 + { "EM_IA_64", (unsigned long) EM_IA_64 }, +#endif // EM_IA_64 #ifdef EMLINK - {"EMLINK", (unsigned long)EMLINK}, + { "EMLINK", (unsigned long) EMLINK }, #endif // EMLINK +#ifdef EM_M32 + { "EM_M32", (unsigned long) EM_M32 }, +#endif // EM_M32 +#ifdef EM_M32R + { "EM_M32R", (unsigned long) EM_M32R }, +#endif // EM_M32R +#ifdef EM_MICROBLAZE + { "EM_MICROBLAZE", (unsigned long) EM_MICROBLAZE }, +#endif // EM_MICROBLAZE +#ifdef EM_MIPS + { "EM_MIPS", (unsigned long) EM_MIPS }, +#endif // EM_MIPS +#ifdef EM_MIPS_RS3_LE + { "EM_MIPS_RS3_LE", (unsigned long) EM_MIPS_RS3_LE }, +#endif // EM_MIPS_RS3_LE +#ifdef EM_MIPS_RS4_BE + { "EM_MIPS_RS4_BE", (unsigned long) EM_MIPS_RS4_BE }, +#endif // EM_MIPS_RS4_BE +#ifdef EM_MN10300 + { "EM_MN10300", (unsigned long) EM_MN10300 }, +#endif // EM_MN10300 +#ifdef EM_NDS32 + { "EM_NDS32", (unsigned long) EM_NDS32 }, +#endif // EM_NDS32 +#ifdef EM_NONE + { "EM_NONE", (unsigned long) EM_NONE }, +#endif // EM_NONE +#ifdef EM_OPENRISC + { "EM_OPENRISC", (unsigned long) EM_OPENRISC }, +#endif // EM_OPENRISC +#ifdef EM_PARISC + { "EM_PARISC", (unsigned long) EM_PARISC }, +#endif // EM_PARISC +#ifdef EM_PPC + { "EM_PPC", (unsigned long) EM_PPC }, +#endif // EM_PPC +#ifdef EM_PPC64 + { "EM_PPC64", (unsigned long) EM_PPC64 }, +#endif // EM_PPC64 +#ifdef EM_RISCV + { "EM_RISCV", (unsigned long) EM_RISCV }, +#endif // EM_RISCV +#ifdef EM_S390 + { "EM_S390", (unsigned long) EM_S390 }, +#endif // EM_S390 +#ifdef EM_S390_OLD + { "EM_S390_OLD", (unsigned long) EM_S390_OLD }, +#endif // EM_S390_OLD #ifdef EMSGSIZE - {"EMSGSIZE", (unsigned long)EMSGSIZE}, + { "EMSGSIZE", (unsigned long) EMSGSIZE }, #endif // EMSGSIZE +#ifdef EM_SH + { "EM_SH", (unsigned long) EM_SH }, +#endif // EM_SH +#ifdef EM_SPARC + { "EM_SPARC", (unsigned long) EM_SPARC }, +#endif // EM_SPARC +#ifdef EM_SPARC32PLUS + { "EM_SPARC32PLUS", (unsigned long) EM_SPARC32PLUS }, +#endif // EM_SPARC32PLUS +#ifdef EM_SPARCV9 + { "EM_SPARCV9", (unsigned long) EM_SPARCV9 }, +#endif // EM_SPARCV9 +#ifdef EM_SPU + { "EM_SPU", (unsigned long) EM_SPU }, +#endif // EM_SPU +#ifdef EM_TI_C6000 + { "EM_TI_C6000", (unsigned long) EM_TI_C6000 }, +#endif // EM_TI_C6000 +#ifdef EM_TILEGX + { "EM_TILEGX", (unsigned long) EM_TILEGX }, +#endif // EM_TILEGX +#ifdef EM_TILEPRO + { "EM_TILEPRO", (unsigned long) EM_TILEPRO }, +#endif // EM_TILEPRO #ifdef EMULTIHOP - {"EMULTIHOP", (unsigned long)EMULTIHOP}, + { "EMULTIHOP", (unsigned long) EMULTIHOP }, #endif // EMULTIHOP +#ifdef EM_UNICORE + { "EM_UNICORE", (unsigned long) EM_UNICORE }, +#endif // EM_UNICORE +#ifdef EM_X86_64 + { "EM_X86_64", (unsigned long) EM_X86_64 }, +#endif // EM_X86_64 +#ifdef EM_XTENSA + { "EM_XTENSA", (unsigned long) EM_XTENSA }, +#endif // EM_XTENSA #ifdef ENAMETOOLONG - {"ENAMETOOLONG", (unsigned long)ENAMETOOLONG}, + { "ENAMETOOLONG", (unsigned long) ENAMETOOLONG }, #endif // ENAMETOOLONG #ifdef ENAVAIL - {"ENAVAIL", (unsigned long)ENAVAIL}, + { "ENAVAIL", (unsigned long) ENAVAIL }, #endif // ENAVAIL #ifdef ENETDOWN - {"ENETDOWN", (unsigned long)ENETDOWN}, + { "ENETDOWN", (unsigned long) ENETDOWN }, #endif // ENETDOWN #ifdef ENETRESET - {"ENETRESET", (unsigned long)ENETRESET}, + { "ENETRESET", (unsigned long) ENETRESET }, #endif // ENETRESET #ifdef ENETUNREACH - {"ENETUNREACH", (unsigned long)ENETUNREACH}, + { "ENETUNREACH", (unsigned long) ENETUNREACH }, #endif // ENETUNREACH #ifdef ENFILE - {"ENFILE", (unsigned long)ENFILE}, + { "ENFILE", (unsigned long) ENFILE }, #endif // ENFILE #ifdef ENOANO - {"ENOANO", (unsigned long)ENOANO}, + { "ENOANO", (unsigned long) ENOANO }, #endif // ENOANO #ifdef ENOBUFS - {"ENOBUFS", (unsigned long)ENOBUFS}, + { "ENOBUFS", (unsigned long) ENOBUFS }, #endif // ENOBUFS #ifdef ENOCSI - {"ENOCSI", (unsigned long)ENOCSI}, + { "ENOCSI", (unsigned long) ENOCSI }, #endif // ENOCSI #ifdef ENODATA - {"ENODATA", (unsigned long)ENODATA}, + { "ENODATA", (unsigned long) ENODATA }, #endif // ENODATA #ifdef ENODEV - {"ENODEV", (unsigned long)ENODEV}, + { "ENODEV", (unsigned long) ENODEV }, #endif // ENODEV #ifdef ENOENT - {"ENOENT", (unsigned long)ENOENT}, + { "ENOENT", (unsigned long) ENOENT }, #endif // ENOENT #ifdef ENOEXEC - {"ENOEXEC", (unsigned long)ENOEXEC}, + { "ENOEXEC", (unsigned long) ENOEXEC }, #endif // ENOEXEC #ifdef ENOKEY - {"ENOKEY", (unsigned long)ENOKEY}, + { "ENOKEY", (unsigned long) ENOKEY }, #endif // ENOKEY #ifdef ENOLCK - {"ENOLCK", (unsigned long)ENOLCK}, + { "ENOLCK", (unsigned long) ENOLCK }, #endif // ENOLCK #ifdef ENOLINK - {"ENOLINK", (unsigned long)ENOLINK}, + { "ENOLINK", (unsigned long) ENOLINK }, #endif // ENOLINK #ifdef ENOMEDIUM - {"ENOMEDIUM", (unsigned long)ENOMEDIUM}, + { "ENOMEDIUM", (unsigned long) ENOMEDIUM }, #endif // ENOMEDIUM #ifdef ENOMEM - {"ENOMEM", (unsigned long)ENOMEM}, + { "ENOMEM", (unsigned long) ENOMEM }, #endif // ENOMEM #ifdef ENOMSG - {"ENOMSG", (unsigned long)ENOMSG}, + { "ENOMSG", (unsigned long) ENOMSG }, #endif // ENOMSG #ifdef ENONET - {"ENONET", (unsigned long)ENONET}, + { "ENONET", (unsigned long) ENONET }, #endif // ENONET #ifdef ENOPKG - {"ENOPKG", (unsigned long)ENOPKG}, + { "ENOPKG", (unsigned long) ENOPKG }, #endif // ENOPKG #ifdef ENOPROTOOPT - {"ENOPROTOOPT", (unsigned long)ENOPROTOOPT}, + { "ENOPROTOOPT", (unsigned long) ENOPROTOOPT }, #endif // ENOPROTOOPT #ifdef ENOSPC - {"ENOSPC", (unsigned long)ENOSPC}, + { "ENOSPC", (unsigned long) ENOSPC }, #endif // ENOSPC #ifdef ENOSR - {"ENOSR", (unsigned long)ENOSR}, + { "ENOSR", (unsigned long) ENOSR }, #endif // ENOSR #ifdef ENOSTR - {"ENOSTR", (unsigned long)ENOSTR}, + { "ENOSTR", (unsigned long) ENOSTR }, #endif // ENOSTR #ifdef ENOSYS - {"ENOSYS", (unsigned long)ENOSYS}, + { "ENOSYS", (unsigned long) ENOSYS }, #endif // ENOSYS #ifdef ENOTBLK - {"ENOTBLK", (unsigned long)ENOTBLK}, + { "ENOTBLK", (unsigned long) ENOTBLK }, #endif // ENOTBLK #ifdef ENOTCONN - {"ENOTCONN", (unsigned long)ENOTCONN}, + { "ENOTCONN", (unsigned long) ENOTCONN }, #endif // ENOTCONN #ifdef ENOTDIR - {"ENOTDIR", (unsigned long)ENOTDIR}, + { "ENOTDIR", (unsigned long) ENOTDIR }, #endif // ENOTDIR #ifdef ENOTEMPTY - {"ENOTEMPTY", (unsigned long)ENOTEMPTY}, + { "ENOTEMPTY", (unsigned long) ENOTEMPTY }, #endif // ENOTEMPTY #ifdef ENOTNAM - {"ENOTNAM", (unsigned long)ENOTNAM}, + { "ENOTNAM", (unsigned long) ENOTNAM }, #endif // ENOTNAM #ifdef ENOTRECOVERABLE - {"ENOTRECOVERABLE", (unsigned long)ENOTRECOVERABLE}, + { "ENOTRECOVERABLE", (unsigned long) ENOTRECOVERABLE }, #endif // ENOTRECOVERABLE #ifdef ENOTSOCK - {"ENOTSOCK", (unsigned long)ENOTSOCK}, + { "ENOTSOCK", (unsigned long) ENOTSOCK }, #endif // ENOTSOCK #ifdef ENOTSUP - {"ENOTSUP", (unsigned long)ENOTSUP}, + { "ENOTSUP", (unsigned long) ENOTSUP }, #endif // ENOTSUP #ifdef ENOTTY - {"ENOTTY", (unsigned long)ENOTTY}, + { "ENOTTY", (unsigned long) ENOTTY }, #endif // ENOTTY #ifdef ENOTUNIQ - {"ENOTUNIQ", (unsigned long)ENOTUNIQ}, + { "ENOTUNIQ", (unsigned long) ENOTUNIQ }, #endif // ENOTUNIQ #ifdef ENXIO - {"ENXIO", (unsigned long)ENXIO}, + { "ENXIO", (unsigned long) ENXIO }, #endif // ENXIO #ifdef EOPNOTSUPP - {"EOPNOTSUPP", (unsigned long)EOPNOTSUPP}, + { "EOPNOTSUPP", (unsigned long) EOPNOTSUPP }, #endif // EOPNOTSUPP #ifdef EOVERFLOW - {"EOVERFLOW", (unsigned long)EOVERFLOW}, + { "EOVERFLOW", (unsigned long) EOVERFLOW }, #endif // EOVERFLOW #ifdef EOWNERDEAD - {"EOWNERDEAD", (unsigned long)EOWNERDEAD}, + { "EOWNERDEAD", (unsigned long) EOWNERDEAD }, #endif // EOWNERDEAD #ifdef EPERM - {"EPERM", (unsigned long)EPERM}, + { "EPERM", (unsigned long) EPERM }, #endif // EPERM #ifdef EPFNOSUPPORT - {"EPFNOSUPPORT", (unsigned long)EPFNOSUPPORT}, + { "EPFNOSUPPORT", (unsigned long) EPFNOSUPPORT }, #endif // EPFNOSUPPORT #ifdef EPIPE - {"EPIPE", (unsigned long)EPIPE}, + { "EPIPE", (unsigned long) EPIPE }, #endif // EPIPE #ifdef EPROTO - {"EPROTO", (unsigned long)EPROTO}, + { "EPROTO", (unsigned long) EPROTO }, #endif // EPROTO #ifdef EPROTONOSUPPORT - {"EPROTONOSUPPORT", (unsigned long)EPROTONOSUPPORT}, + { "EPROTONOSUPPORT", (unsigned long) EPROTONOSUPPORT }, #endif // EPROTONOSUPPORT #ifdef EPROTOTYPE - {"EPROTOTYPE", (unsigned long)EPROTOTYPE}, + { "EPROTOTYPE", (unsigned long) EPROTOTYPE }, #endif // EPROTOTYPE #ifdef ERANGE - {"ERANGE", (unsigned long)ERANGE}, + { "ERANGE", (unsigned long) ERANGE }, #endif // ERANGE #ifdef EREMCHG - {"EREMCHG", (unsigned long)EREMCHG}, + { "EREMCHG", (unsigned long) EREMCHG }, #endif // EREMCHG #ifdef EREMOTE - {"EREMOTE", (unsigned long)EREMOTE}, + { "EREMOTE", (unsigned long) EREMOTE }, #endif // EREMOTE #ifdef EREMOTEIO - {"EREMOTEIO", (unsigned long)EREMOTEIO}, + { "EREMOTEIO", (unsigned long) EREMOTEIO }, #endif // EREMOTEIO #ifdef ERESTART - {"ERESTART", (unsigned long)ERESTART}, + { "ERESTART", (unsigned long) ERESTART }, #endif // ERESTART #ifdef ERFKILL - {"ERFKILL", (unsigned long)ERFKILL}, + { "ERFKILL", (unsigned long) ERFKILL }, #endif // ERFKILL #ifdef EROFS - {"EROFS", (unsigned long)EROFS}, + { "EROFS", (unsigned long) EROFS }, #endif // EROFS #ifdef ESHUTDOWN - {"ESHUTDOWN", (unsigned long)ESHUTDOWN}, + { "ESHUTDOWN", (unsigned long) ESHUTDOWN }, #endif // ESHUTDOWN #ifdef ESOCKTNOSUPPORT - {"ESOCKTNOSUPPORT", (unsigned long)ESOCKTNOSUPPORT}, + { "ESOCKTNOSUPPORT", (unsigned long) ESOCKTNOSUPPORT }, #endif // ESOCKTNOSUPPORT #ifdef ESPIPE - {"ESPIPE", (unsigned long)ESPIPE}, + { "ESPIPE", (unsigned long) ESPIPE }, #endif // ESPIPE #ifdef ESRCH - {"ESRCH", (unsigned long)ESRCH}, + { "ESRCH", (unsigned long) ESRCH }, #endif // ESRCH #ifdef ESRMNT - {"ESRMNT", (unsigned long)ESRMNT}, + { "ESRMNT", (unsigned long) ESRMNT }, #endif // ESRMNT #ifdef ESTALE - {"ESTALE", (unsigned long)ESTALE}, + { "ESTALE", (unsigned long) ESTALE }, #endif // ESTALE #ifdef ESTRPIPE - {"ESTRPIPE", (unsigned long)ESTRPIPE}, + { "ESTRPIPE", (unsigned long) ESTRPIPE }, #endif // ESTRPIPE #ifdef ETIME - {"ETIME", (unsigned long)ETIME}, + { "ETIME", (unsigned long) ETIME }, #endif // ETIME #ifdef ETIMEDOUT - {"ETIMEDOUT", (unsigned long)ETIMEDOUT}, + { "ETIMEDOUT", (unsigned long) ETIMEDOUT }, #endif // ETIMEDOUT #ifdef ETOOMANYREFS - {"ETOOMANYREFS", (unsigned long)ETOOMANYREFS}, + { "ETOOMANYREFS", (unsigned long) ETOOMANYREFS }, #endif // ETOOMANYREFS #ifdef ETXTBSY - {"ETXTBSY", (unsigned long)ETXTBSY}, + { "ETXTBSY", (unsigned long) ETXTBSY }, #endif // ETXTBSY #ifdef EUCLEAN - {"EUCLEAN", (unsigned long)EUCLEAN}, + { "EUCLEAN", (unsigned long) EUCLEAN }, #endif // EUCLEAN #ifdef EUNATCH - {"EUNATCH", (unsigned long)EUNATCH}, + { "EUNATCH", (unsigned long) EUNATCH }, #endif // EUNATCH #ifdef EUSERS - {"EUSERS", (unsigned long)EUSERS}, + { "EUSERS", (unsigned long) EUSERS }, #endif // EUSERS #ifdef EWOULDBLOCK - {"EWOULDBLOCK", (unsigned long)EWOULDBLOCK}, + { "EWOULDBLOCK", (unsigned long) EWOULDBLOCK }, #endif // EWOULDBLOCK #ifdef EXDEV - {"EXDEV", (unsigned long)EXDEV}, + { "EXDEV", (unsigned long) EXDEV }, #endif // EXDEV #ifdef EXFULL - {"EXFULL", (unsigned long)EXFULL}, + { "EXFULL", (unsigned long) EXFULL }, #endif // EXFULL +#ifdef EXTA + { "EXTA", (unsigned long) EXTA }, +#endif // EXTA +#ifdef EXTB + { "EXTB", (unsigned long) EXTB }, +#endif // EXTB +#ifdef EXTPROC + { "EXTPROC", (unsigned long) EXTPROC }, +#endif // EXTPROC #ifdef FAPPEND - {"FAPPEND", (unsigned long)FAPPEND}, + { "FAPPEND", (unsigned long) FAPPEND }, #endif // FAPPEND #ifdef FASYNC - {"FASYNC", (unsigned long)FASYNC}, + { "FASYNC", (unsigned long) FASYNC }, #endif // FASYNC +#ifdef FD_2M + { "FD_2M", (unsigned long) FD_2M }, +#endif // FD_2M +#ifdef FD_BROKEN_DCL + { "FD_BROKEN_DCL", (unsigned long) FD_BROKEN_DCL }, +#endif // FD_BROKEN_DCL #ifdef FD_CLOEXEC - {"FD_CLOEXEC", (unsigned long)FD_CLOEXEC}, + { "FD_CLOEXEC", (unsigned long) FD_CLOEXEC }, #endif // FD_CLOEXEC +#ifdef FDCLRPRM + { "FDCLRPRM", (unsigned long) FDCLRPRM }, +#endif // FDCLRPRM +#ifdef FD_DEBUG + { "FD_DEBUG", (unsigned long) FD_DEBUG }, +#endif // FD_DEBUG +#ifdef FDDEFMEDIAPRM + { "FDDEFMEDIAPRM", (unsigned long) FDDEFMEDIAPRM }, +#endif // FDDEFMEDIAPRM +#ifdef FDDEFPRM + { "FDDEFPRM", (unsigned long) FDDEFPRM }, +#endif // FDDEFPRM +#ifdef FD_DRIVER_VERSION + { "FD_DRIVER_VERSION", (unsigned long) FD_DRIVER_VERSION }, +#endif // FD_DRIVER_VERSION +#ifdef FDEJECT + { "FDEJECT", (unsigned long) FDEJECT }, +#endif // FDEJECT +#ifdef FD_FILL_BYTE + { "FD_FILL_BYTE", (unsigned long) FD_FILL_BYTE }, +#endif // FD_FILL_BYTE +#ifdef FDFLUSH + { "FDFLUSH", (unsigned long) FDFLUSH }, +#endif // FDFLUSH +#ifdef FDFMTBEG + { "FDFMTBEG", (unsigned long) FDFMTBEG }, +#endif // FDFMTBEG +#ifdef FDFMTEND + { "FDFMTEND", (unsigned long) FDFMTEND }, +#endif // FDFMTEND +#ifdef FDFMTTRK + { "FDFMTTRK", (unsigned long) FDFMTTRK }, +#endif // FDFMTTRK +#ifdef FDGETDRVPRM + { "FDGETDRVPRM", (unsigned long) FDGETDRVPRM }, +#endif // FDGETDRVPRM +#ifdef FDGETDRVSTAT + { "FDGETDRVSTAT", (unsigned long) FDGETDRVSTAT }, +#endif // FDGETDRVSTAT +#ifdef FDGETDRVTYP + { "FDGETDRVTYP", (unsigned long) FDGETDRVTYP }, +#endif // FDGETDRVTYP +#ifdef FDGETFDCSTAT + { "FDGETFDCSTAT", (unsigned long) FDGETFDCSTAT }, +#endif // FDGETFDCSTAT +#ifdef FDGETMAXERRS + { "FDGETMAXERRS", (unsigned long) FDGETMAXERRS }, +#endif // FDGETMAXERRS +#ifdef FDGETMEDIAPRM + { "FDGETMEDIAPRM", (unsigned long) FDGETMEDIAPRM }, +#endif // FDGETMEDIAPRM +#ifdef FDGETPRM + { "FDGETPRM", (unsigned long) FDGETPRM }, +#endif // FDGETPRM +#ifdef FD_INVERTED_DCL + { "FD_INVERTED_DCL", (unsigned long) FD_INVERTED_DCL }, +#endif // FD_INVERTED_DCL +#ifdef FDMSGOFF + { "FDMSGOFF", (unsigned long) FDMSGOFF }, +#endif // FDMSGOFF +#ifdef FDMSGON + { "FDMSGON", (unsigned long) FDMSGON }, +#endif // FDMSGON +#ifdef FD_PERP + { "FD_PERP", (unsigned long) FD_PERP }, +#endif // FD_PERP +#ifdef FDPOLLDRVSTAT + { "FDPOLLDRVSTAT", (unsigned long) FDPOLLDRVSTAT }, +#endif // FDPOLLDRVSTAT +#ifdef FDRAWCMD + { "FDRAWCMD", (unsigned long) FDRAWCMD }, +#endif // FDRAWCMD +#ifdef FD_RAW_DISK_CHANGE + { "FD_RAW_DISK_CHANGE", (unsigned long) FD_RAW_DISK_CHANGE }, +#endif // FD_RAW_DISK_CHANGE +#ifdef FD_RAW_FAILURE + { "FD_RAW_FAILURE", (unsigned long) FD_RAW_FAILURE }, +#endif // FD_RAW_FAILURE +#ifdef FD_RAW_HARDFAILURE + { "FD_RAW_HARDFAILURE", (unsigned long) FD_RAW_HARDFAILURE }, +#endif // FD_RAW_HARDFAILURE +#ifdef FD_RAW_INTR + { "FD_RAW_INTR", (unsigned long) FD_RAW_INTR }, +#endif // FD_RAW_INTR +#ifdef FD_RAW_MORE + { "FD_RAW_MORE", (unsigned long) FD_RAW_MORE }, +#endif // FD_RAW_MORE +#ifdef FD_RAW_NEED_DISK + { "FD_RAW_NEED_DISK", (unsigned long) FD_RAW_NEED_DISK }, +#endif // FD_RAW_NEED_DISK +#ifdef FD_RAW_NEED_SEEK + { "FD_RAW_NEED_SEEK", (unsigned long) FD_RAW_NEED_SEEK }, +#endif // FD_RAW_NEED_SEEK +#ifdef FD_RAW_NO_MOTOR + { "FD_RAW_NO_MOTOR", (unsigned long) FD_RAW_NO_MOTOR }, +#endif // FD_RAW_NO_MOTOR +#ifdef FD_RAW_NO_MOTOR_AFTER + { "FD_RAW_NO_MOTOR_AFTER", (unsigned long) FD_RAW_NO_MOTOR_AFTER }, +#endif // FD_RAW_NO_MOTOR_AFTER +#ifdef FD_RAW_READ + { "FD_RAW_READ", (unsigned long) FD_RAW_READ }, +#endif // FD_RAW_READ +#ifdef FD_RAW_SOFTFAILURE + { "FD_RAW_SOFTFAILURE", (unsigned long) FD_RAW_SOFTFAILURE }, +#endif // FD_RAW_SOFTFAILURE +#ifdef FD_RAW_SPIN + { "FD_RAW_SPIN", (unsigned long) FD_RAW_SPIN }, +#endif // FD_RAW_SPIN +#ifdef FD_RAW_STOP_IF_FAILURE + { "FD_RAW_STOP_IF_FAILURE", (unsigned long) FD_RAW_STOP_IF_FAILURE }, +#endif // FD_RAW_STOP_IF_FAILURE +#ifdef FD_RAW_STOP_IF_SUCCESS + { "FD_RAW_STOP_IF_SUCCESS", (unsigned long) FD_RAW_STOP_IF_SUCCESS }, +#endif // FD_RAW_STOP_IF_SUCCESS +#ifdef FD_RAW_WRITE + { "FD_RAW_WRITE", (unsigned long) FD_RAW_WRITE }, +#endif // FD_RAW_WRITE +#ifdef FDRESET + { "FDRESET", (unsigned long) FDRESET }, +#endif // FDRESET +#ifdef FD_SECTBASEMASK + { "FD_SECTBASEMASK", (unsigned long) FD_SECTBASEMASK }, +#endif // FD_SECTBASEMASK +#ifdef FDSETDRVPRM + { "FDSETDRVPRM", (unsigned long) FDSETDRVPRM }, +#endif // FDSETDRVPRM +#ifdef FDSETEMSGTRESH + { "FDSETEMSGTRESH", (unsigned long) FDSETEMSGTRESH }, +#endif // FDSETEMSGTRESH +#ifdef FDSETMAXERRS + { "FDSETMAXERRS", (unsigned long) FDSETMAXERRS }, +#endif // FDSETMAXERRS +#ifdef FDSETMEDIAPRM + { "FDSETMEDIAPRM", (unsigned long) FDSETMEDIAPRM }, +#endif // FDSETMEDIAPRM +#ifdef FDSETPRM + { "FDSETPRM", (unsigned long) FDSETPRM }, +#endif // FDSETPRM +#ifdef FD_SETSIZE + { "FD_SETSIZE", (unsigned long) FD_SETSIZE }, +#endif // FD_SETSIZE +#ifdef FD_SILENT_DCL_CLEAR + { "FD_SILENT_DCL_CLEAR", (unsigned long) FD_SILENT_DCL_CLEAR }, +#endif // FD_SILENT_DCL_CLEAR +#ifdef FD_SIZECODEMASK + { "FD_SIZECODEMASK", (unsigned long) FD_SIZECODEMASK }, +#endif // FD_SIZECODEMASK +#ifdef FD_STRETCH + { "FD_STRETCH", (unsigned long) FD_STRETCH }, +#endif // FD_STRETCH +#ifdef FD_SWAPSIDES + { "FD_SWAPSIDES", (unsigned long) FD_SWAPSIDES }, +#endif // FD_SWAPSIDES +#ifdef FDTWADDLE + { "FDTWADDLE", (unsigned long) FDTWADDLE }, +#endif // FDTWADDLE #ifdef F_DUPFD - {"F_DUPFD", (unsigned long)F_DUPFD}, + { "F_DUPFD", (unsigned long) F_DUPFD }, #endif // F_DUPFD #ifdef F_DUPFD_CLOEXEC - {"F_DUPFD_CLOEXEC", (unsigned long)F_DUPFD_CLOEXEC}, + { "F_DUPFD_CLOEXEC", (unsigned long) F_DUPFD_CLOEXEC }, #endif // F_DUPFD_CLOEXEC +#ifdef FDWERRORCLR + { "FDWERRORCLR", (unsigned long) FDWERRORCLR }, +#endif // FDWERRORCLR +#ifdef FDWERRORGET + { "FDWERRORGET", (unsigned long) FDWERRORGET }, +#endif // FDWERRORGET +#ifdef FD_ZEROBASED + { "FD_ZEROBASED", (unsigned long) FD_ZEROBASED }, +#endif // FD_ZEROBASED #ifdef F_EXLCK - {"F_EXLCK", (unsigned long)F_EXLCK}, + { "F_EXLCK", (unsigned long) F_EXLCK }, #endif // F_EXLCK +#ifdef FF0 + { "FF0", (unsigned long) FF0 }, +#endif // FF0 +#ifdef FF1 + { "FF1", (unsigned long) FF1 }, +#endif // FF1 +#ifdef FFDLY + { "FFDLY", (unsigned long) FFDLY }, +#endif // FFDLY #ifdef FFSYNC - {"FFSYNC", (unsigned long)FFSYNC}, + { "FFSYNC", (unsigned long) FFSYNC }, #endif // FFSYNC #ifdef F_GETFD - {"F_GETFD", (unsigned long)F_GETFD}, + { "F_GETFD", (unsigned long) F_GETFD }, #endif // F_GETFD #ifdef F_GETFL - {"F_GETFL", (unsigned long)F_GETFL}, + { "F_GETFL", (unsigned long) F_GETFL }, #endif // F_GETFL #ifdef F_GETLK - {"F_GETLK", (unsigned long)F_GETLK}, + { "F_GETLK", (unsigned long) F_GETLK }, #endif // F_GETLK #ifdef F_GETLK64 - {"F_GETLK64", (unsigned long)F_GETLK64}, + { "F_GETLK64", (unsigned long) F_GETLK64 }, #endif // F_GETLK64 +#ifdef F_GETOWN + { "F_GETOWN", (unsigned long) F_GETOWN }, +#endif // F_GETOWN +#ifdef FIBMAP + { "FIBMAP", (unsigned long) FIBMAP }, +#endif // FIBMAP +#ifdef FICLONE + { "FICLONE", (unsigned long) FICLONE }, +#endif // FICLONE +#ifdef FICLONERANGE + { "FICLONERANGE", (unsigned long) FICLONERANGE }, +#endif // FICLONERANGE +#ifdef FIDEDUPERANGE + { "FIDEDUPERANGE", (unsigned long) FIDEDUPERANGE }, +#endif // FIDEDUPERANGE +#ifdef FIFREEZE + { "FIFREEZE", (unsigned long) FIFREEZE }, +#endif // FIFREEZE +#ifdef FIGETBSZ + { "FIGETBSZ", (unsigned long) FIGETBSZ }, +#endif // FIGETBSZ +#ifdef FILE_DEDUPE_RANGE_DIFFERS + { "FILE_DEDUPE_RANGE_DIFFERS", (unsigned long) FILE_DEDUPE_RANGE_DIFFERS }, +#endif // FILE_DEDUPE_RANGE_DIFFERS +#ifdef FILE_DEDUPE_RANGE_SAME + { "FILE_DEDUPE_RANGE_SAME", (unsigned long) FILE_DEDUPE_RANGE_SAME }, +#endif // FILE_DEDUPE_RANGE_SAME +#ifdef FIOASYNC + { "FIOASYNC", (unsigned long) FIOASYNC }, +#endif // FIOASYNC +#ifdef FIOCLEX + { "FIOCLEX", (unsigned long) FIOCLEX }, +#endif // FIOCLEX +#ifdef FIOGETOWN + { "FIOGETOWN", (unsigned long) FIOGETOWN }, +#endif // FIOGETOWN +#ifdef FIONBIO + { "FIONBIO", (unsigned long) FIONBIO }, +#endif // FIONBIO +#ifdef FIONCLEX + { "FIONCLEX", (unsigned long) FIONCLEX }, +#endif // FIONCLEX +#ifdef FIONREAD + { "FIONREAD", (unsigned long) FIONREAD }, +#endif // FIONREAD +#ifdef FIOQSIZE + { "FIOQSIZE", (unsigned long) FIOQSIZE }, +#endif // FIOQSIZE +#ifdef FIOSETOWN + { "FIOSETOWN", (unsigned long) FIOSETOWN }, +#endif // FIOSETOWN +#ifdef FITHAW + { "FITHAW", (unsigned long) FITHAW }, +#endif // FITHAW +#ifdef FITRIM + { "FITRIM", (unsigned long) FITRIM }, +#endif // FITRIM #ifdef F_LOCK - {"F_LOCK", (unsigned long)F_LOCK}, + { "F_LOCK", (unsigned long) F_LOCK }, #endif // F_LOCK +#ifdef FLUSHO + { "FLUSHO", (unsigned long) FLUSHO }, +#endif // FLUSHO #ifdef FNDELAY - {"FNDELAY", (unsigned long)FNDELAY}, + { "FNDELAY", (unsigned long) FNDELAY }, #endif // FNDELAY #ifdef FNONBLOCK - {"FNONBLOCK", (unsigned long)FNONBLOCK}, + { "FNONBLOCK", (unsigned long) FNONBLOCK }, #endif // FNONBLOCK #ifdef F_OK - {"F_OK", (unsigned long)F_OK}, + { "F_OK", (unsigned long) F_OK }, #endif // F_OK +#ifdef FPE_CONDTRAP + { "FPE_CONDTRAP", (unsigned long) FPE_CONDTRAP }, +#endif // FPE_CONDTRAP #ifdef FPE_FLTDIV - {"FPE_FLTDIV", (unsigned long)FPE_FLTDIV}, + { "FPE_FLTDIV", (unsigned long) FPE_FLTDIV }, #endif // FPE_FLTDIV #ifdef FPE_FLTINV - {"FPE_FLTINV", (unsigned long)FPE_FLTINV}, + { "FPE_FLTINV", (unsigned long) FPE_FLTINV }, #endif // FPE_FLTINV #ifdef FPE_FLTOVF - {"FPE_FLTOVF", (unsigned long)FPE_FLTOVF}, + { "FPE_FLTOVF", (unsigned long) FPE_FLTOVF }, #endif // FPE_FLTOVF #ifdef FPE_FLTRES - {"FPE_FLTRES", (unsigned long)FPE_FLTRES}, + { "FPE_FLTRES", (unsigned long) FPE_FLTRES }, #endif // FPE_FLTRES #ifdef FPE_FLTSUB - {"FPE_FLTSUB", (unsigned long)FPE_FLTSUB}, + { "FPE_FLTSUB", (unsigned long) FPE_FLTSUB }, #endif // FPE_FLTSUB #ifdef FPE_FLTUND - {"FPE_FLTUND", (unsigned long)FPE_FLTUND}, + { "FPE_FLTUND", (unsigned long) FPE_FLTUND }, #endif // FPE_FLTUND +#ifdef FPE_FLTUNK + { "FPE_FLTUNK", (unsigned long) FPE_FLTUNK }, +#endif // FPE_FLTUNK #ifdef FPE_INTDIV - {"FPE_INTDIV", (unsigned long)FPE_INTDIV}, + { "FPE_INTDIV", (unsigned long) FPE_INTDIV }, #endif // FPE_INTDIV #ifdef FPE_INTOVF - {"FPE_INTOVF", (unsigned long)FPE_INTOVF}, + { "FPE_INTOVF", (unsigned long) FPE_INTOVF }, #endif // FPE_INTOVF #ifdef FP_XSTATE_MAGIC1 - {"FP_XSTATE_MAGIC1", (unsigned long)FP_XSTATE_MAGIC1}, + { "FP_XSTATE_MAGIC1", (unsigned long) FP_XSTATE_MAGIC1 }, #endif // FP_XSTATE_MAGIC1 #ifdef FP_XSTATE_MAGIC2 - {"FP_XSTATE_MAGIC2", (unsigned long)FP_XSTATE_MAGIC2}, + { "FP_XSTATE_MAGIC2", (unsigned long) FP_XSTATE_MAGIC2 }, #endif // FP_XSTATE_MAGIC2 #ifdef FP_XSTATE_MAGIC2_SIZE - {"FP_XSTATE_MAGIC2_SIZE", (unsigned long)FP_XSTATE_MAGIC2_SIZE}, + { "FP_XSTATE_MAGIC2_SIZE", (unsigned long) FP_XSTATE_MAGIC2_SIZE }, #endif // FP_XSTATE_MAGIC2_SIZE #ifdef F_RDLCK - {"F_RDLCK", (unsigned long)F_RDLCK}, + { "F_RDLCK", (unsigned long) F_RDLCK }, #endif // F_RDLCK +#ifdef FS_APPEND_FL + { "FS_APPEND_FL", (unsigned long) FS_APPEND_FL }, +#endif // FS_APPEND_FL +#ifdef FS_BTREE_FL + { "FS_BTREE_FL", (unsigned long) FS_BTREE_FL }, +#endif // FS_BTREE_FL +#ifdef FS_CASEFOLD_FL + { "FS_CASEFOLD_FL", (unsigned long) FS_CASEFOLD_FL }, +#endif // FS_CASEFOLD_FL +#ifdef FS_COMPRBLK_FL + { "FS_COMPRBLK_FL", (unsigned long) FS_COMPRBLK_FL }, +#endif // FS_COMPRBLK_FL +#ifdef FS_COMPR_FL + { "FS_COMPR_FL", (unsigned long) FS_COMPR_FL }, +#endif // FS_COMPR_FL +#ifdef FSCRYPT_KEY_DESC_PREFIX_SIZE + { "FSCRYPT_KEY_DESC_PREFIX_SIZE", (unsigned long) FSCRYPT_KEY_DESC_PREFIX_SIZE }, +#endif // FSCRYPT_KEY_DESC_PREFIX_SIZE +#ifdef FSCRYPT_KEY_DESCRIPTOR_SIZE + { "FSCRYPT_KEY_DESCRIPTOR_SIZE", (unsigned long) FSCRYPT_KEY_DESCRIPTOR_SIZE }, +#endif // FSCRYPT_KEY_DESCRIPTOR_SIZE +#ifdef FSCRYPT_KEY_IDENTIFIER_SIZE + { "FSCRYPT_KEY_IDENTIFIER_SIZE", (unsigned long) FSCRYPT_KEY_IDENTIFIER_SIZE }, +#endif // FSCRYPT_KEY_IDENTIFIER_SIZE +#ifdef FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY + { "FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY", (unsigned long) FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY }, +#endif // FSCRYPT_KEY_REMOVAL_STATUS_FLAG_FILES_BUSY +#ifdef FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS + { "FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS", (unsigned long) FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS }, +#endif // FSCRYPT_KEY_REMOVAL_STATUS_FLAG_OTHER_USERS +#ifdef FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR + { "FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR", (unsigned long) FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR }, +#endif // FSCRYPT_KEY_SPEC_TYPE_DESCRIPTOR +#ifdef FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER + { "FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER", (unsigned long) FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER }, +#endif // FSCRYPT_KEY_SPEC_TYPE_IDENTIFIER +#ifdef FSCRYPT_KEY_STATUS_ABSENT + { "FSCRYPT_KEY_STATUS_ABSENT", (unsigned long) FSCRYPT_KEY_STATUS_ABSENT }, +#endif // FSCRYPT_KEY_STATUS_ABSENT +#ifdef FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF + { "FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF", (unsigned long) FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF }, +#endif // FSCRYPT_KEY_STATUS_FLAG_ADDED_BY_SELF +#ifdef FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED + { "FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED", (unsigned long) FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED }, +#endif // FSCRYPT_KEY_STATUS_INCOMPLETELY_REMOVED +#ifdef FSCRYPT_KEY_STATUS_PRESENT + { "FSCRYPT_KEY_STATUS_PRESENT", (unsigned long) FSCRYPT_KEY_STATUS_PRESENT }, +#endif // FSCRYPT_KEY_STATUS_PRESENT +#ifdef FSCRYPT_MAX_KEY_SIZE + { "FSCRYPT_MAX_KEY_SIZE", (unsigned long) FSCRYPT_MAX_KEY_SIZE }, +#endif // FSCRYPT_MAX_KEY_SIZE +#ifdef FSCRYPT_MODE_ADIANTUM + { "FSCRYPT_MODE_ADIANTUM", (unsigned long) FSCRYPT_MODE_ADIANTUM }, +#endif // FSCRYPT_MODE_ADIANTUM +#ifdef FSCRYPT_MODE_AES_128_CBC + { "FSCRYPT_MODE_AES_128_CBC", (unsigned long) FSCRYPT_MODE_AES_128_CBC }, +#endif // FSCRYPT_MODE_AES_128_CBC +#ifdef FSCRYPT_MODE_AES_128_CTS + { "FSCRYPT_MODE_AES_128_CTS", (unsigned long) FSCRYPT_MODE_AES_128_CTS }, +#endif // FSCRYPT_MODE_AES_128_CTS +#ifdef FSCRYPT_MODE_AES_256_CTS + { "FSCRYPT_MODE_AES_256_CTS", (unsigned long) FSCRYPT_MODE_AES_256_CTS }, +#endif // FSCRYPT_MODE_AES_256_CTS +#ifdef FSCRYPT_MODE_AES_256_XTS + { "FSCRYPT_MODE_AES_256_XTS", (unsigned long) FSCRYPT_MODE_AES_256_XTS }, +#endif // FSCRYPT_MODE_AES_256_XTS +#ifdef FSCRYPT_POLICY_FLAG_DIRECT_KEY + { "FSCRYPT_POLICY_FLAG_DIRECT_KEY", (unsigned long) FSCRYPT_POLICY_FLAG_DIRECT_KEY }, +#endif // FSCRYPT_POLICY_FLAG_DIRECT_KEY +#ifdef FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 + { "FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64", (unsigned long) FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 }, +#endif // FSCRYPT_POLICY_FLAG_IV_INO_LBLK_64 +#ifdef FSCRYPT_POLICY_FLAGS_PAD_16 + { "FSCRYPT_POLICY_FLAGS_PAD_16", (unsigned long) FSCRYPT_POLICY_FLAGS_PAD_16 }, +#endif // FSCRYPT_POLICY_FLAGS_PAD_16 +#ifdef FSCRYPT_POLICY_FLAGS_PAD_32 + { "FSCRYPT_POLICY_FLAGS_PAD_32", (unsigned long) FSCRYPT_POLICY_FLAGS_PAD_32 }, +#endif // FSCRYPT_POLICY_FLAGS_PAD_32 +#ifdef FSCRYPT_POLICY_FLAGS_PAD_4 + { "FSCRYPT_POLICY_FLAGS_PAD_4", (unsigned long) FSCRYPT_POLICY_FLAGS_PAD_4 }, +#endif // FSCRYPT_POLICY_FLAGS_PAD_4 +#ifdef FSCRYPT_POLICY_FLAGS_PAD_8 + { "FSCRYPT_POLICY_FLAGS_PAD_8", (unsigned long) FSCRYPT_POLICY_FLAGS_PAD_8 }, +#endif // FSCRYPT_POLICY_FLAGS_PAD_8 +#ifdef FSCRYPT_POLICY_FLAGS_PAD_MASK + { "FSCRYPT_POLICY_FLAGS_PAD_MASK", (unsigned long) FSCRYPT_POLICY_FLAGS_PAD_MASK }, +#endif // FSCRYPT_POLICY_FLAGS_PAD_MASK +#ifdef FSCRYPT_POLICY_FLAGS_VALID + { "FSCRYPT_POLICY_FLAGS_VALID", (unsigned long) FSCRYPT_POLICY_FLAGS_VALID }, +#endif // FSCRYPT_POLICY_FLAGS_VALID +#ifdef FSCRYPT_POLICY_V1 + { "FSCRYPT_POLICY_V1", (unsigned long) FSCRYPT_POLICY_V1 }, +#endif // FSCRYPT_POLICY_V1 +#ifdef FSCRYPT_POLICY_V2 + { "FSCRYPT_POLICY_V2", (unsigned long) FSCRYPT_POLICY_V2 }, +#endif // FSCRYPT_POLICY_V2 +#ifdef FS_DIRSYNC_FL + { "FS_DIRSYNC_FL", (unsigned long) FS_DIRSYNC_FL }, +#endif // FS_DIRSYNC_FL +#ifdef FS_DIRTY_FL + { "FS_DIRTY_FL", (unsigned long) FS_DIRTY_FL }, +#endif // FS_DIRTY_FL +#ifdef FS_EA_INODE_FL + { "FS_EA_INODE_FL", (unsigned long) FS_EA_INODE_FL }, +#endif // FS_EA_INODE_FL +#ifdef FS_ENCRYPT_FL + { "FS_ENCRYPT_FL", (unsigned long) FS_ENCRYPT_FL }, +#endif // FS_ENCRYPT_FL +#ifdef FS_ENCRYPTION_MODE_ADIANTUM + { "FS_ENCRYPTION_MODE_ADIANTUM", (unsigned long) FS_ENCRYPTION_MODE_ADIANTUM }, +#endif // FS_ENCRYPTION_MODE_ADIANTUM +#ifdef FS_ENCRYPTION_MODE_AES_128_CBC + { "FS_ENCRYPTION_MODE_AES_128_CBC", (unsigned long) FS_ENCRYPTION_MODE_AES_128_CBC }, +#endif // FS_ENCRYPTION_MODE_AES_128_CBC +#ifdef FS_ENCRYPTION_MODE_AES_128_CTS + { "FS_ENCRYPTION_MODE_AES_128_CTS", (unsigned long) FS_ENCRYPTION_MODE_AES_128_CTS }, +#endif // FS_ENCRYPTION_MODE_AES_128_CTS +#ifdef FS_ENCRYPTION_MODE_AES_256_CBC + { "FS_ENCRYPTION_MODE_AES_256_CBC", (unsigned long) FS_ENCRYPTION_MODE_AES_256_CBC }, +#endif // FS_ENCRYPTION_MODE_AES_256_CBC +#ifdef FS_ENCRYPTION_MODE_AES_256_CTS + { "FS_ENCRYPTION_MODE_AES_256_CTS", (unsigned long) FS_ENCRYPTION_MODE_AES_256_CTS }, +#endif // FS_ENCRYPTION_MODE_AES_256_CTS +#ifdef FS_ENCRYPTION_MODE_AES_256_GCM + { "FS_ENCRYPTION_MODE_AES_256_GCM", (unsigned long) FS_ENCRYPTION_MODE_AES_256_GCM }, +#endif // FS_ENCRYPTION_MODE_AES_256_GCM +#ifdef FS_ENCRYPTION_MODE_AES_256_XTS + { "FS_ENCRYPTION_MODE_AES_256_XTS", (unsigned long) FS_ENCRYPTION_MODE_AES_256_XTS }, +#endif // FS_ENCRYPTION_MODE_AES_256_XTS +#ifdef FS_ENCRYPTION_MODE_INVALID + { "FS_ENCRYPTION_MODE_INVALID", (unsigned long) FS_ENCRYPTION_MODE_INVALID }, +#endif // FS_ENCRYPTION_MODE_INVALID +#ifdef FS_ENCRYPTION_MODE_SPECK128_256_CTS + { "FS_ENCRYPTION_MODE_SPECK128_256_CTS", (unsigned long) FS_ENCRYPTION_MODE_SPECK128_256_CTS }, +#endif // FS_ENCRYPTION_MODE_SPECK128_256_CTS +#ifdef FS_ENCRYPTION_MODE_SPECK128_256_XTS + { "FS_ENCRYPTION_MODE_SPECK128_256_XTS", (unsigned long) FS_ENCRYPTION_MODE_SPECK128_256_XTS }, +#endif // FS_ENCRYPTION_MODE_SPECK128_256_XTS +#ifdef FS_EOFBLOCKS_FL + { "FS_EOFBLOCKS_FL", (unsigned long) FS_EOFBLOCKS_FL }, +#endif // FS_EOFBLOCKS_FL #ifdef F_SETFD - {"F_SETFD", (unsigned long)F_SETFD}, + { "F_SETFD", (unsigned long) F_SETFD }, #endif // F_SETFD #ifdef F_SETFL - {"F_SETFL", (unsigned long)F_SETFL}, + { "F_SETFL", (unsigned long) F_SETFL }, #endif // F_SETFL #ifdef F_SETLK - {"F_SETLK", (unsigned long)F_SETLK}, + { "F_SETLK", (unsigned long) F_SETLK }, #endif // F_SETLK #ifdef F_SETLK64 - {"F_SETLK64", (unsigned long)F_SETLK64}, + { "F_SETLK64", (unsigned long) F_SETLK64 }, #endif // F_SETLK64 #ifdef F_SETLKW64 - {"F_SETLKW64", (unsigned long)F_SETLKW64}, + { "F_SETLKW64", (unsigned long) F_SETLKW64 }, #endif // F_SETLKW64 #ifdef F_SETLKW - {"F_SETLKW", (unsigned long)F_SETLKW}, + { "F_SETLKW", (unsigned long) F_SETLKW }, #endif // F_SETLKW +#ifdef F_SETOWN + { "F_SETOWN", (unsigned long) F_SETOWN }, +#endif // F_SETOWN +#ifdef FS_EXTENT_FL + { "FS_EXTENT_FL", (unsigned long) FS_EXTENT_FL }, +#endif // FS_EXTENT_FL +#ifdef FS_FL_USER_MODIFIABLE + { "FS_FL_USER_MODIFIABLE", (unsigned long) FS_FL_USER_MODIFIABLE }, +#endif // FS_FL_USER_MODIFIABLE +#ifdef FS_FL_USER_VISIBLE + { "FS_FL_USER_VISIBLE", (unsigned long) FS_FL_USER_VISIBLE }, +#endif // FS_FL_USER_VISIBLE #ifdef F_SHLCK - {"F_SHLCK", (unsigned long)F_SHLCK}, + { "F_SHLCK", (unsigned long) F_SHLCK }, #endif // F_SHLCK +#ifdef FS_HUGE_FILE_FL + { "FS_HUGE_FILE_FL", (unsigned long) FS_HUGE_FILE_FL }, +#endif // FS_HUGE_FILE_FL +#ifdef FS_IMAGIC_FL + { "FS_IMAGIC_FL", (unsigned long) FS_IMAGIC_FL }, +#endif // FS_IMAGIC_FL +#ifdef FS_IMMUTABLE_FL + { "FS_IMMUTABLE_FL", (unsigned long) FS_IMMUTABLE_FL }, +#endif // FS_IMMUTABLE_FL +#ifdef FS_INDEX_FL + { "FS_INDEX_FL", (unsigned long) FS_INDEX_FL }, +#endif // FS_INDEX_FL +#ifdef FS_INLINE_DATA_FL + { "FS_INLINE_DATA_FL", (unsigned long) FS_INLINE_DATA_FL }, +#endif // FS_INLINE_DATA_FL +#ifdef FS_IOC32_GETFLAGS + { "FS_IOC32_GETFLAGS", (unsigned long) FS_IOC32_GETFLAGS }, +#endif // FS_IOC32_GETFLAGS +#ifdef FS_IOC32_GETVERSION + { "FS_IOC32_GETVERSION", (unsigned long) FS_IOC32_GETVERSION }, +#endif // FS_IOC32_GETVERSION +#ifdef FS_IOC32_SETFLAGS + { "FS_IOC32_SETFLAGS", (unsigned long) FS_IOC32_SETFLAGS }, +#endif // FS_IOC32_SETFLAGS +#ifdef FS_IOC32_SETVERSION + { "FS_IOC32_SETVERSION", (unsigned long) FS_IOC32_SETVERSION }, +#endif // FS_IOC32_SETVERSION +#ifdef FS_IOC_ADD_ENCRYPTION_KEY + { "FS_IOC_ADD_ENCRYPTION_KEY", (unsigned long) FS_IOC_ADD_ENCRYPTION_KEY }, +#endif // FS_IOC_ADD_ENCRYPTION_KEY +#ifdef FS_IOC_FIEMAP + { "FS_IOC_FIEMAP", (unsigned long) FS_IOC_FIEMAP }, +#endif // FS_IOC_FIEMAP +#ifdef FS_IOC_FSGETXATTR + { "FS_IOC_FSGETXATTR", (unsigned long) FS_IOC_FSGETXATTR }, +#endif // FS_IOC_FSGETXATTR +#ifdef FS_IOC_FSSETXATTR + { "FS_IOC_FSSETXATTR", (unsigned long) FS_IOC_FSSETXATTR }, +#endif // FS_IOC_FSSETXATTR +#ifdef FS_IOC_GET_ENCRYPTION_KEY_STATUS + { "FS_IOC_GET_ENCRYPTION_KEY_STATUS", (unsigned long) FS_IOC_GET_ENCRYPTION_KEY_STATUS }, +#endif // FS_IOC_GET_ENCRYPTION_KEY_STATUS +#ifdef FS_IOC_GET_ENCRYPTION_NONCE + { "FS_IOC_GET_ENCRYPTION_NONCE", (unsigned long) FS_IOC_GET_ENCRYPTION_NONCE }, +#endif // FS_IOC_GET_ENCRYPTION_NONCE +#ifdef FS_IOC_GET_ENCRYPTION_POLICY_EX + { "FS_IOC_GET_ENCRYPTION_POLICY_EX", (unsigned long) FS_IOC_GET_ENCRYPTION_POLICY_EX }, +#endif // FS_IOC_GET_ENCRYPTION_POLICY_EX +#ifdef FS_IOC_GET_ENCRYPTION_POLICY + { "FS_IOC_GET_ENCRYPTION_POLICY", (unsigned long) FS_IOC_GET_ENCRYPTION_POLICY }, +#endif // FS_IOC_GET_ENCRYPTION_POLICY +#ifdef FS_IOC_GET_ENCRYPTION_PWSALT + { "FS_IOC_GET_ENCRYPTION_PWSALT", (unsigned long) FS_IOC_GET_ENCRYPTION_PWSALT }, +#endif // FS_IOC_GET_ENCRYPTION_PWSALT +#ifdef FS_IOC_GETFLAGS + { "FS_IOC_GETFLAGS", (unsigned long) FS_IOC_GETFLAGS }, +#endif // FS_IOC_GETFLAGS +#ifdef FS_IOC_GETFSLABEL + { "FS_IOC_GETFSLABEL", (unsigned long) FS_IOC_GETFSLABEL }, +#endif // FS_IOC_GETFSLABEL +#ifdef FS_IOC_GETVERSION + { "FS_IOC_GETVERSION", (unsigned long) FS_IOC_GETVERSION }, +#endif // FS_IOC_GETVERSION +#ifdef FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS + { "FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS", (unsigned long) FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS }, +#endif // FS_IOC_REMOVE_ENCRYPTION_KEY_ALL_USERS +#ifdef FS_IOC_REMOVE_ENCRYPTION_KEY + { "FS_IOC_REMOVE_ENCRYPTION_KEY", (unsigned long) FS_IOC_REMOVE_ENCRYPTION_KEY }, +#endif // FS_IOC_REMOVE_ENCRYPTION_KEY +#ifdef FS_IOC_SET_ENCRYPTION_POLICY + { "FS_IOC_SET_ENCRYPTION_POLICY", (unsigned long) FS_IOC_SET_ENCRYPTION_POLICY }, +#endif // FS_IOC_SET_ENCRYPTION_POLICY +#ifdef FS_IOC_SETFLAGS + { "FS_IOC_SETFLAGS", (unsigned long) FS_IOC_SETFLAGS }, +#endif // FS_IOC_SETFLAGS +#ifdef FS_IOC_SETFSLABEL + { "FS_IOC_SETFSLABEL", (unsigned long) FS_IOC_SETFSLABEL }, +#endif // FS_IOC_SETFSLABEL +#ifdef FS_IOC_SETVERSION + { "FS_IOC_SETVERSION", (unsigned long) FS_IOC_SETVERSION }, +#endif // FS_IOC_SETVERSION +#ifdef FS_JOURNAL_DATA_FL + { "FS_JOURNAL_DATA_FL", (unsigned long) FS_JOURNAL_DATA_FL }, +#endif // FS_JOURNAL_DATA_FL +#ifdef FS_KEY_DESC_PREFIX + { "FS_KEY_DESC_PREFIX", (unsigned long) FS_KEY_DESC_PREFIX }, +#endif // FS_KEY_DESC_PREFIX +#ifdef FS_KEY_DESC_PREFIX_SIZE + { "FS_KEY_DESC_PREFIX_SIZE", (unsigned long) FS_KEY_DESC_PREFIX_SIZE }, +#endif // FS_KEY_DESC_PREFIX_SIZE +#ifdef FS_KEY_DESCRIPTOR_SIZE + { "FS_KEY_DESCRIPTOR_SIZE", (unsigned long) FS_KEY_DESCRIPTOR_SIZE }, +#endif // FS_KEY_DESCRIPTOR_SIZE +#ifdef FSLABEL_MAX + { "FSLABEL_MAX", (unsigned long) FSLABEL_MAX }, +#endif // FSLABEL_MAX +#ifdef FS_MAX_KEY_SIZE + { "FS_MAX_KEY_SIZE", (unsigned long) FS_MAX_KEY_SIZE }, +#endif // FS_MAX_KEY_SIZE +#ifdef FSMOUNT_CLOEXEC + { "FSMOUNT_CLOEXEC", (unsigned long) FSMOUNT_CLOEXEC }, +#endif // FSMOUNT_CLOEXEC +#ifdef FS_NOATIME_FL + { "FS_NOATIME_FL", (unsigned long) FS_NOATIME_FL }, +#endif // FS_NOATIME_FL +#ifdef FS_NOCOMP_FL + { "FS_NOCOMP_FL", (unsigned long) FS_NOCOMP_FL }, +#endif // FS_NOCOMP_FL +#ifdef FS_NOCOW_FL + { "FS_NOCOW_FL", (unsigned long) FS_NOCOW_FL }, +#endif // FS_NOCOW_FL +#ifdef FS_NODUMP_FL + { "FS_NODUMP_FL", (unsigned long) FS_NODUMP_FL }, +#endif // FS_NODUMP_FL +#ifdef FS_NOTAIL_FL + { "FS_NOTAIL_FL", (unsigned long) FS_NOTAIL_FL }, +#endif // FS_NOTAIL_FL +#ifdef FSOPEN_CLOEXEC + { "FSOPEN_CLOEXEC", (unsigned long) FSOPEN_CLOEXEC }, +#endif // FSOPEN_CLOEXEC +#ifdef FSPICK_CLOEXEC + { "FSPICK_CLOEXEC", (unsigned long) FSPICK_CLOEXEC }, +#endif // FSPICK_CLOEXEC +#ifdef FSPICK_EMPTY_PATH + { "FSPICK_EMPTY_PATH", (unsigned long) FSPICK_EMPTY_PATH }, +#endif // FSPICK_EMPTY_PATH +#ifdef FSPICK_NO_AUTOMOUNT + { "FSPICK_NO_AUTOMOUNT", (unsigned long) FSPICK_NO_AUTOMOUNT }, +#endif // FSPICK_NO_AUTOMOUNT +#ifdef FSPICK_SYMLINK_NOFOLLOW + { "FSPICK_SYMLINK_NOFOLLOW", (unsigned long) FSPICK_SYMLINK_NOFOLLOW }, +#endif // FSPICK_SYMLINK_NOFOLLOW +#ifdef FS_POLICY_FLAG_DIRECT_KEY + { "FS_POLICY_FLAG_DIRECT_KEY", (unsigned long) FS_POLICY_FLAG_DIRECT_KEY }, +#endif // FS_POLICY_FLAG_DIRECT_KEY +#ifdef FS_POLICY_FLAGS_PAD_16 + { "FS_POLICY_FLAGS_PAD_16", (unsigned long) FS_POLICY_FLAGS_PAD_16 }, +#endif // FS_POLICY_FLAGS_PAD_16 +#ifdef FS_POLICY_FLAGS_PAD_32 + { "FS_POLICY_FLAGS_PAD_32", (unsigned long) FS_POLICY_FLAGS_PAD_32 }, +#endif // FS_POLICY_FLAGS_PAD_32 +#ifdef FS_POLICY_FLAGS_PAD_4 + { "FS_POLICY_FLAGS_PAD_4", (unsigned long) FS_POLICY_FLAGS_PAD_4 }, +#endif // FS_POLICY_FLAGS_PAD_4 +#ifdef FS_POLICY_FLAGS_PAD_8 + { "FS_POLICY_FLAGS_PAD_8", (unsigned long) FS_POLICY_FLAGS_PAD_8 }, +#endif // FS_POLICY_FLAGS_PAD_8 +#ifdef FS_POLICY_FLAGS_PAD_MASK + { "FS_POLICY_FLAGS_PAD_MASK", (unsigned long) FS_POLICY_FLAGS_PAD_MASK }, +#endif // FS_POLICY_FLAGS_PAD_MASK +#ifdef FS_POLICY_FLAGS_VALID + { "FS_POLICY_FLAGS_VALID", (unsigned long) FS_POLICY_FLAGS_VALID }, +#endif // FS_POLICY_FLAGS_VALID +#ifdef FS_PROJINHERIT_FL + { "FS_PROJINHERIT_FL", (unsigned long) FS_PROJINHERIT_FL }, +#endif // FS_PROJINHERIT_FL +#ifdef FS_RESERVED_FL + { "FS_RESERVED_FL", (unsigned long) FS_RESERVED_FL }, +#endif // FS_RESERVED_FL +#ifdef FS_SECRM_FL + { "FS_SECRM_FL", (unsigned long) FS_SECRM_FL }, +#endif // FS_SECRM_FL +#ifdef FS_SYNC_FL + { "FS_SYNC_FL", (unsigned long) FS_SYNC_FL }, +#endif // FS_SYNC_FL +#ifdef FS_TOPDIR_FL + { "FS_TOPDIR_FL", (unsigned long) FS_TOPDIR_FL }, +#endif // FS_TOPDIR_FL +#ifdef FS_UNRM_FL + { "FS_UNRM_FL", (unsigned long) FS_UNRM_FL }, +#endif // FS_UNRM_FL +#ifdef FS_VERITY_FL + { "FS_VERITY_FL", (unsigned long) FS_VERITY_FL }, +#endif // FS_VERITY_FL +#ifdef FS_XFLAG_APPEND + { "FS_XFLAG_APPEND", (unsigned long) FS_XFLAG_APPEND }, +#endif // FS_XFLAG_APPEND +#ifdef FS_XFLAG_COWEXTSIZE + { "FS_XFLAG_COWEXTSIZE", (unsigned long) FS_XFLAG_COWEXTSIZE }, +#endif // FS_XFLAG_COWEXTSIZE +#ifdef FS_XFLAG_DAX + { "FS_XFLAG_DAX", (unsigned long) FS_XFLAG_DAX }, +#endif // FS_XFLAG_DAX +#ifdef FS_XFLAG_EXTSIZE + { "FS_XFLAG_EXTSIZE", (unsigned long) FS_XFLAG_EXTSIZE }, +#endif // FS_XFLAG_EXTSIZE +#ifdef FS_XFLAG_EXTSZINHERIT + { "FS_XFLAG_EXTSZINHERIT", (unsigned long) FS_XFLAG_EXTSZINHERIT }, +#endif // FS_XFLAG_EXTSZINHERIT +#ifdef FS_XFLAG_FILESTREAM + { "FS_XFLAG_FILESTREAM", (unsigned long) FS_XFLAG_FILESTREAM }, +#endif // FS_XFLAG_FILESTREAM +#ifdef FS_XFLAG_HASATTR + { "FS_XFLAG_HASATTR", (unsigned long) FS_XFLAG_HASATTR }, +#endif // FS_XFLAG_HASATTR +#ifdef FS_XFLAG_IMMUTABLE + { "FS_XFLAG_IMMUTABLE", (unsigned long) FS_XFLAG_IMMUTABLE }, +#endif // FS_XFLAG_IMMUTABLE +#ifdef FS_XFLAG_NOATIME + { "FS_XFLAG_NOATIME", (unsigned long) FS_XFLAG_NOATIME }, +#endif // FS_XFLAG_NOATIME +#ifdef FS_XFLAG_NODEFRAG + { "FS_XFLAG_NODEFRAG", (unsigned long) FS_XFLAG_NODEFRAG }, +#endif // FS_XFLAG_NODEFRAG +#ifdef FS_XFLAG_NODUMP + { "FS_XFLAG_NODUMP", (unsigned long) FS_XFLAG_NODUMP }, +#endif // FS_XFLAG_NODUMP +#ifdef FS_XFLAG_NOSYMLINKS + { "FS_XFLAG_NOSYMLINKS", (unsigned long) FS_XFLAG_NOSYMLINKS }, +#endif // FS_XFLAG_NOSYMLINKS +#ifdef FS_XFLAG_PREALLOC + { "FS_XFLAG_PREALLOC", (unsigned long) FS_XFLAG_PREALLOC }, +#endif // FS_XFLAG_PREALLOC +#ifdef FS_XFLAG_PROJINHERIT + { "FS_XFLAG_PROJINHERIT", (unsigned long) FS_XFLAG_PROJINHERIT }, +#endif // FS_XFLAG_PROJINHERIT +#ifdef FS_XFLAG_REALTIME + { "FS_XFLAG_REALTIME", (unsigned long) FS_XFLAG_REALTIME }, +#endif // FS_XFLAG_REALTIME +#ifdef FS_XFLAG_RTINHERIT + { "FS_XFLAG_RTINHERIT", (unsigned long) FS_XFLAG_RTINHERIT }, +#endif // FS_XFLAG_RTINHERIT +#ifdef FS_XFLAG_SYNC + { "FS_XFLAG_SYNC", (unsigned long) FS_XFLAG_SYNC }, +#endif // FS_XFLAG_SYNC +#ifdef FTD_MSG + { "FTD_MSG", (unsigned long) FTD_MSG }, +#endif // FTD_MSG #ifdef F_TEST - {"F_TEST", (unsigned long)F_TEST}, + { "F_TEST", (unsigned long) F_TEST }, #endif // F_TEST #ifdef F_TLOCK - {"F_TLOCK", (unsigned long)F_TLOCK}, + { "F_TLOCK", (unsigned long) F_TLOCK }, #endif // F_TLOCK #ifdef F_ULOCK - {"F_ULOCK", (unsigned long)F_ULOCK}, + { "F_ULOCK", (unsigned long) F_ULOCK }, #endif // F_ULOCK #ifdef F_UNLCK - {"F_UNLCK", (unsigned long)F_UNLCK}, + { "F_UNLCK", (unsigned long) F_UNLCK }, #endif // F_UNLCK #ifdef F_WRLCK - {"F_WRLCK", (unsigned long)F_WRLCK}, + { "F_WRLCK", (unsigned long) F_WRLCK }, #endif // F_WRLCK +#ifdef HUGETLB_FLAG_ENCODE_MASK + { "HUGETLB_FLAG_ENCODE_MASK", (unsigned long) HUGETLB_FLAG_ENCODE_MASK }, +#endif // HUGETLB_FLAG_ENCODE_MASK +#ifdef HUGETLB_FLAG_ENCODE_SHIFT + { "HUGETLB_FLAG_ENCODE_SHIFT", (unsigned long) HUGETLB_FLAG_ENCODE_SHIFT }, +#endif // HUGETLB_FLAG_ENCODE_SHIFT +#ifdef HUPCL + { "HUPCL", (unsigned long) HUPCL }, +#endif // HUPCL +#ifdef IBSHIFT + { "IBSHIFT", (unsigned long) IBSHIFT }, +#endif // IBSHIFT +#ifdef ICANON + { "ICANON", (unsigned long) ICANON }, +#endif // ICANON +#ifdef ICRNL + { "ICRNL", (unsigned long) ICRNL }, +#endif // ICRNL +#ifdef IEXTEN + { "IEXTEN", (unsigned long) IEXTEN }, +#endif // IEXTEN +#ifdef IGNBRK + { "IGNBRK", (unsigned long) IGNBRK }, +#endif // IGNBRK +#ifdef IGNCR + { "IGNCR", (unsigned long) IGNCR }, +#endif // IGNCR +#ifdef IGNPAR + { "IGNPAR", (unsigned long) IGNPAR }, +#endif // IGNPAR +#ifdef ILL_BADIADDR + { "ILL_BADIADDR", (unsigned long) ILL_BADIADDR }, +#endif // ILL_BADIADDR #ifdef ILL_BADSTK - {"ILL_BADSTK", (unsigned long)ILL_BADSTK}, + { "ILL_BADSTK", (unsigned long) ILL_BADSTK }, #endif // ILL_BADSTK #ifdef ILL_COPROC - {"ILL_COPROC", (unsigned long)ILL_COPROC}, + { "ILL_COPROC", (unsigned long) ILL_COPROC }, #endif // ILL_COPROC #ifdef ILL_ILLADR - {"ILL_ILLADR", (unsigned long)ILL_ILLADR}, + { "ILL_ILLADR", (unsigned long) ILL_ILLADR }, #endif // ILL_ILLADR #ifdef ILL_ILLOPC - {"ILL_ILLOPC", (unsigned long)ILL_ILLOPC}, + { "ILL_ILLOPC", (unsigned long) ILL_ILLOPC }, #endif // ILL_ILLOPC #ifdef ILL_ILLOPN - {"ILL_ILLOPN", (unsigned long)ILL_ILLOPN}, + { "ILL_ILLOPN", (unsigned long) ILL_ILLOPN }, #endif // ILL_ILLOPN #ifdef ILL_ILLTRP - {"ILL_ILLTRP", (unsigned long)ILL_ILLTRP}, + { "ILL_ILLTRP", (unsigned long) ILL_ILLTRP }, #endif // ILL_ILLTRP #ifdef ILL_PRVOPC - {"ILL_PRVOPC", (unsigned long)ILL_PRVOPC}, + { "ILL_PRVOPC", (unsigned long) ILL_PRVOPC }, #endif // ILL_PRVOPC #ifdef ILL_PRVREG - {"ILL_PRVREG", (unsigned long)ILL_PRVREG}, + { "ILL_PRVREG", (unsigned long) ILL_PRVREG }, #endif // ILL_PRVREG +#ifdef IMAXBEL + { "IMAXBEL", (unsigned long) IMAXBEL }, +#endif // IMAXBEL +#ifdef INLCR + { "INLCR", (unsigned long) INLCR }, +#endif // INLCR +#ifdef INPCK + { "INPCK", (unsigned long) INPCK }, +#endif // INPCK +#ifdef INR_OPEN_CUR + { "INR_OPEN_CUR", (unsigned long) INR_OPEN_CUR }, +#endif // INR_OPEN_CUR +#ifdef INR_OPEN_MAX + { "INR_OPEN_MAX", (unsigned long) INR_OPEN_MAX }, +#endif // INR_OPEN_MAX +#ifdef ISIG + { "ISIG", (unsigned long) ISIG }, +#endif // ISIG +#ifdef ISTRIP + { "ISTRIP", (unsigned long) ISTRIP }, +#endif // ISTRIP +#ifdef IUCLC + { "IUCLC", (unsigned long) IUCLC }, +#endif // IUCLC +#ifdef IUTF8 + { "IUTF8", (unsigned long) IUTF8 }, +#endif // IUTF8 +#ifdef IXANY + { "IXANY", (unsigned long) IXANY }, +#endif // IXANY +#ifdef IXOFF + { "IXOFF", (unsigned long) IXOFF }, +#endif // IXOFF +#ifdef IXON + { "IXON", (unsigned long) IXON }, +#endif // IXON +#ifdef LINK_MAX + { "LINK_MAX", (unsigned long) LINK_MAX }, +#endif // LINK_MAX +#ifdef LITTLE_ENDIAN + { "LITTLE_ENDIAN", (unsigned long) LITTLE_ENDIAN }, +#endif // LITTLE_ENDIAN #ifdef LOCK_EX - {"LOCK_EX", (unsigned long)LOCK_EX}, + { "LOCK_EX", (unsigned long) LOCK_EX }, #endif // LOCK_EX #ifdef LOCK_NB - {"LOCK_NB", (unsigned long)LOCK_NB}, + { "LOCK_NB", (unsigned long) LOCK_NB }, #endif // LOCK_NB #ifdef LOCK_SH - {"LOCK_SH", (unsigned long)LOCK_SH}, + { "LOCK_SH", (unsigned long) LOCK_SH }, #endif // LOCK_SH #ifdef LOCK_UN - {"LOCK_UN", (unsigned long)LOCK_UN}, + { "LOCK_UN", (unsigned long) LOCK_UN }, #endif // LOCK_UN +#ifdef LO_CRYPT_BLOW + { "LO_CRYPT_BLOW", (unsigned long) LO_CRYPT_BLOW }, +#endif // LO_CRYPT_BLOW +#ifdef LO_CRYPT_CAST128 + { "LO_CRYPT_CAST128", (unsigned long) LO_CRYPT_CAST128 }, +#endif // LO_CRYPT_CAST128 +#ifdef LO_CRYPT_CRYPTOAPI + { "LO_CRYPT_CRYPTOAPI", (unsigned long) LO_CRYPT_CRYPTOAPI }, +#endif // LO_CRYPT_CRYPTOAPI +#ifdef LO_CRYPT_DES + { "LO_CRYPT_DES", (unsigned long) LO_CRYPT_DES }, +#endif // LO_CRYPT_DES +#ifdef LO_CRYPT_DUMMY + { "LO_CRYPT_DUMMY", (unsigned long) LO_CRYPT_DUMMY }, +#endif // LO_CRYPT_DUMMY +#ifdef LO_CRYPT_FISH2 + { "LO_CRYPT_FISH2", (unsigned long) LO_CRYPT_FISH2 }, +#endif // LO_CRYPT_FISH2 +#ifdef LO_CRYPT_IDEA + { "LO_CRYPT_IDEA", (unsigned long) LO_CRYPT_IDEA }, +#endif // LO_CRYPT_IDEA +#ifdef LO_CRYPT_NONE + { "LO_CRYPT_NONE", (unsigned long) LO_CRYPT_NONE }, +#endif // LO_CRYPT_NONE +#ifdef LO_CRYPT_SKIPJACK + { "LO_CRYPT_SKIPJACK", (unsigned long) LO_CRYPT_SKIPJACK }, +#endif // LO_CRYPT_SKIPJACK +#ifdef LO_CRYPT_XOR + { "LO_CRYPT_XOR", (unsigned long) LO_CRYPT_XOR }, +#endif // LO_CRYPT_XOR +#ifdef LO_KEY_SIZE + { "LO_KEY_SIZE", (unsigned long) LO_KEY_SIZE }, +#endif // LO_KEY_SIZE +#ifdef LO_NAME_SIZE + { "LO_NAME_SIZE", (unsigned long) LO_NAME_SIZE }, +#endif // LO_NAME_SIZE +#ifdef LOOP_CHANGE_FD + { "LOOP_CHANGE_FD", (unsigned long) LOOP_CHANGE_FD }, +#endif // LOOP_CHANGE_FD +#ifdef LOOP_CLR_FD + { "LOOP_CLR_FD", (unsigned long) LOOP_CLR_FD }, +#endif // LOOP_CLR_FD +#ifdef LOOP_CTL_ADD + { "LOOP_CTL_ADD", (unsigned long) LOOP_CTL_ADD }, +#endif // LOOP_CTL_ADD +#ifdef LOOP_CTL_GET_FREE + { "LOOP_CTL_GET_FREE", (unsigned long) LOOP_CTL_GET_FREE }, +#endif // LOOP_CTL_GET_FREE +#ifdef LOOP_CTL_REMOVE + { "LOOP_CTL_REMOVE", (unsigned long) LOOP_CTL_REMOVE }, +#endif // LOOP_CTL_REMOVE +#ifdef LOOP_GET_STATUS + { "LOOP_GET_STATUS", (unsigned long) LOOP_GET_STATUS }, +#endif // LOOP_GET_STATUS +#ifdef LOOP_GET_STATUS64 + { "LOOP_GET_STATUS64", (unsigned long) LOOP_GET_STATUS64 }, +#endif // LOOP_GET_STATUS64 +#ifdef LOOP_SET_BLOCK_SIZE + { "LOOP_SET_BLOCK_SIZE", (unsigned long) LOOP_SET_BLOCK_SIZE }, +#endif // LOOP_SET_BLOCK_SIZE +#ifdef LOOP_SET_CAPACITY + { "LOOP_SET_CAPACITY", (unsigned long) LOOP_SET_CAPACITY }, +#endif // LOOP_SET_CAPACITY +#ifdef LOOP_SET_DIRECT_IO + { "LOOP_SET_DIRECT_IO", (unsigned long) LOOP_SET_DIRECT_IO }, +#endif // LOOP_SET_DIRECT_IO +#ifdef LOOP_SET_FD + { "LOOP_SET_FD", (unsigned long) LOOP_SET_FD }, +#endif // LOOP_SET_FD +#ifdef LOOP_SET_STATUS + { "LOOP_SET_STATUS", (unsigned long) LOOP_SET_STATUS }, +#endif // LOOP_SET_STATUS +#ifdef LOOP_SET_STATUS64 + { "LOOP_SET_STATUS64", (unsigned long) LOOP_SET_STATUS64 }, +#endif // LOOP_SET_STATUS64 +#ifdef MADV_COLD + { "MADV_COLD", (unsigned long) MADV_COLD }, +#endif // MADV_COLD +#ifdef MADV_DODUMP + { "MADV_DODUMP", (unsigned long) MADV_DODUMP }, +#endif // MADV_DODUMP +#ifdef MADV_DOFORK + { "MADV_DOFORK", (unsigned long) MADV_DOFORK }, +#endif // MADV_DOFORK +#ifdef MADV_DONTDUMP + { "MADV_DONTDUMP", (unsigned long) MADV_DONTDUMP }, +#endif // MADV_DONTDUMP +#ifdef MADV_DONTFORK + { "MADV_DONTFORK", (unsigned long) MADV_DONTFORK }, +#endif // MADV_DONTFORK +#ifdef MADV_DONTNEED + { "MADV_DONTNEED", (unsigned long) MADV_DONTNEED }, +#endif // MADV_DONTNEED +#ifdef MADV_FREE + { "MADV_FREE", (unsigned long) MADV_FREE }, +#endif // MADV_FREE +#ifdef MADV_HUGEPAGE + { "MADV_HUGEPAGE", (unsigned long) MADV_HUGEPAGE }, +#endif // MADV_HUGEPAGE +#ifdef MADV_HWPOISON + { "MADV_HWPOISON", (unsigned long) MADV_HWPOISON }, +#endif // MADV_HWPOISON +#ifdef MADV_KEEPONFORK + { "MADV_KEEPONFORK", (unsigned long) MADV_KEEPONFORK }, +#endif // MADV_KEEPONFORK +#ifdef MADV_MERGEABLE + { "MADV_MERGEABLE", (unsigned long) MADV_MERGEABLE }, +#endif // MADV_MERGEABLE +#ifdef MADV_NOHUGEPAGE + { "MADV_NOHUGEPAGE", (unsigned long) MADV_NOHUGEPAGE }, +#endif // MADV_NOHUGEPAGE +#ifdef MADV_NORMAL + { "MADV_NORMAL", (unsigned long) MADV_NORMAL }, +#endif // MADV_NORMAL +#ifdef MADV_PAGEOUT + { "MADV_PAGEOUT", (unsigned long) MADV_PAGEOUT }, +#endif // MADV_PAGEOUT +#ifdef MADV_RANDOM + { "MADV_RANDOM", (unsigned long) MADV_RANDOM }, +#endif // MADV_RANDOM +#ifdef MADV_REMOVE + { "MADV_REMOVE", (unsigned long) MADV_REMOVE }, +#endif // MADV_REMOVE +#ifdef MADV_SEQUENTIAL + { "MADV_SEQUENTIAL", (unsigned long) MADV_SEQUENTIAL }, +#endif // MADV_SEQUENTIAL +#ifdef MADV_SOFT_OFFLINE + { "MADV_SOFT_OFFLINE", (unsigned long) MADV_SOFT_OFFLINE }, +#endif // MADV_SOFT_OFFLINE +#ifdef MADV_UNMERGEABLE + { "MADV_UNMERGEABLE", (unsigned long) MADV_UNMERGEABLE }, +#endif // MADV_UNMERGEABLE +#ifdef MADV_WILLNEED + { "MADV_WILLNEED", (unsigned long) MADV_WILLNEED }, +#endif // MADV_WILLNEED +#ifdef MADV_WIPEONFORK + { "MADV_WIPEONFORK", (unsigned long) MADV_WIPEONFORK }, +#endif // MADV_WIPEONFORK +#ifdef MAP_32BIT + { "MAP_32BIT", (unsigned long) MAP_32BIT }, +#endif // MAP_32BIT +#ifdef MAP_ANON + { "MAP_ANON", (unsigned long) MAP_ANON }, +#endif // MAP_ANON +#ifdef MAP_ANONYMOUS + { "MAP_ANONYMOUS", (unsigned long) MAP_ANONYMOUS }, +#endif // MAP_ANONYMOUS +#ifdef MAP_DENYWRITE + { "MAP_DENYWRITE", (unsigned long) MAP_DENYWRITE }, +#endif // MAP_DENYWRITE +#ifdef MAP_DENYWRITE + { "MAP_DENYWRITE", (unsigned long) MAP_DENYWRITE }, +#endif // MAP_DENYWRITE +#ifdef MAP_EXECUTABLE + { "MAP_EXECUTABLE", (unsigned long) MAP_EXECUTABLE }, +#endif // MAP_EXECUTABLE +#ifdef MAP_EXECUTABLE + { "MAP_EXECUTABLE", (unsigned long) MAP_EXECUTABLE }, +#endif // MAP_EXECUTABLE +#ifdef MAP_FILE + { "MAP_FILE", (unsigned long) MAP_FILE }, +#endif // MAP_FILE +#ifdef MAP_FIXED + { "MAP_FIXED", (unsigned long) MAP_FIXED }, +#endif // MAP_FIXED +#ifdef MAP_FIXED_NOREPLACE + { "MAP_FIXED_NOREPLACE", (unsigned long) MAP_FIXED_NOREPLACE }, +#endif // MAP_FIXED_NOREPLACE +#ifdef MAP_GROWSDOWN + { "MAP_GROWSDOWN", (unsigned long) MAP_GROWSDOWN }, +#endif // MAP_GROWSDOWN +#ifdef MAP_GROWSDOWN + { "MAP_GROWSDOWN", (unsigned long) MAP_GROWSDOWN }, +#endif // MAP_GROWSDOWN +#ifdef MAP_HUGE_16GB + { "MAP_HUGE_16GB", (unsigned long) MAP_HUGE_16GB }, +#endif // MAP_HUGE_16GB +#ifdef MAP_HUGE_16MB + { "MAP_HUGE_16MB", (unsigned long) MAP_HUGE_16MB }, +#endif // MAP_HUGE_16MB +#ifdef MAP_HUGE_1GB + { "MAP_HUGE_1GB", (unsigned long) MAP_HUGE_1GB }, +#endif // MAP_HUGE_1GB +#ifdef MAP_HUGE_1MB + { "MAP_HUGE_1MB", (unsigned long) MAP_HUGE_1MB }, +#endif // MAP_HUGE_1MB +#ifdef MAP_HUGE_256MB + { "MAP_HUGE_256MB", (unsigned long) MAP_HUGE_256MB }, +#endif // MAP_HUGE_256MB +#ifdef MAP_HUGE_2GB + { "MAP_HUGE_2GB", (unsigned long) MAP_HUGE_2GB }, +#endif // MAP_HUGE_2GB +#ifdef MAP_HUGE_2MB + { "MAP_HUGE_2MB", (unsigned long) MAP_HUGE_2MB }, +#endif // MAP_HUGE_2MB +#ifdef MAP_HUGE_32MB + { "MAP_HUGE_32MB", (unsigned long) MAP_HUGE_32MB }, +#endif // MAP_HUGE_32MB +#ifdef MAP_HUGE_512KB + { "MAP_HUGE_512KB", (unsigned long) MAP_HUGE_512KB }, +#endif // MAP_HUGE_512KB +#ifdef MAP_HUGE_512MB + { "MAP_HUGE_512MB", (unsigned long) MAP_HUGE_512MB }, +#endif // MAP_HUGE_512MB +#ifdef MAP_HUGE_64KB + { "MAP_HUGE_64KB", (unsigned long) MAP_HUGE_64KB }, +#endif // MAP_HUGE_64KB +#ifdef MAP_HUGE_8MB + { "MAP_HUGE_8MB", (unsigned long) MAP_HUGE_8MB }, +#endif // MAP_HUGE_8MB +#ifdef MAP_HUGE_MASK + { "MAP_HUGE_MASK", (unsigned long) MAP_HUGE_MASK }, +#endif // MAP_HUGE_MASK +#ifdef MAP_HUGE_MASK + { "MAP_HUGE_MASK", (unsigned long) MAP_HUGE_MASK }, +#endif // MAP_HUGE_MASK +#ifdef MAP_HUGE_SHIFT + { "MAP_HUGE_SHIFT", (unsigned long) MAP_HUGE_SHIFT }, +#endif // MAP_HUGE_SHIFT +#ifdef MAP_HUGE_SHIFT + { "MAP_HUGE_SHIFT", (unsigned long) MAP_HUGE_SHIFT }, +#endif // MAP_HUGE_SHIFT +#ifdef MAP_HUGETLB + { "MAP_HUGETLB", (unsigned long) MAP_HUGETLB }, +#endif // MAP_HUGETLB +#ifdef MAP_HUGETLB + { "MAP_HUGETLB", (unsigned long) MAP_HUGETLB }, +#endif // MAP_HUGETLB +#ifdef MAP_LOCKED + { "MAP_LOCKED", (unsigned long) MAP_LOCKED }, +#endif // MAP_LOCKED +#ifdef MAP_LOCKED + { "MAP_LOCKED", (unsigned long) MAP_LOCKED }, +#endif // MAP_LOCKED +#ifdef MAP_NONBLOCK + { "MAP_NONBLOCK", (unsigned long) MAP_NONBLOCK }, +#endif // MAP_NONBLOCK +#ifdef MAP_NONBLOCK + { "MAP_NONBLOCK", (unsigned long) MAP_NONBLOCK }, +#endif // MAP_NONBLOCK +#ifdef MAP_NORESERVE + { "MAP_NORESERVE", (unsigned long) MAP_NORESERVE }, +#endif // MAP_NORESERVE +#ifdef MAP_NORESERVE + { "MAP_NORESERVE", (unsigned long) MAP_NORESERVE }, +#endif // MAP_NORESERVE +#ifdef MAP_POPULATE + { "MAP_POPULATE", (unsigned long) MAP_POPULATE }, +#endif // MAP_POPULATE +#ifdef MAP_POPULATE + { "MAP_POPULATE", (unsigned long) MAP_POPULATE }, +#endif // MAP_POPULATE +#ifdef MAP_PRIVATE + { "MAP_PRIVATE", (unsigned long) MAP_PRIVATE }, +#endif // MAP_PRIVATE +#ifdef MAP_SHARED + { "MAP_SHARED", (unsigned long) MAP_SHARED }, +#endif // MAP_SHARED +#ifdef MAP_SHARED_VALIDATE + { "MAP_SHARED_VALIDATE", (unsigned long) MAP_SHARED_VALIDATE }, +#endif // MAP_SHARED_VALIDATE +#ifdef MAP_STACK + { "MAP_STACK", (unsigned long) MAP_STACK }, +#endif // MAP_STACK +#ifdef MAP_STACK + { "MAP_STACK", (unsigned long) MAP_STACK }, +#endif // MAP_STACK +#ifdef MAP_SYNC + { "MAP_SYNC", (unsigned long) MAP_SYNC }, +#endif // MAP_SYNC +#ifdef MAP_SYNC + { "MAP_SYNC", (unsigned long) MAP_SYNC }, +#endif // MAP_SYNC +#ifdef MAP_TYPE + { "MAP_TYPE", (unsigned long) MAP_TYPE }, +#endif // MAP_TYPE +#ifdef MAP_UNINITIALIZED + { "MAP_UNINITIALIZED", (unsigned long) MAP_UNINITIALIZED }, +#endif // MAP_UNINITIALIZED +#ifdef MAX_CANON + { "MAX_CANON", (unsigned long) MAX_CANON }, +#endif // MAX_CANON +#ifdef MAX_INPUT + { "MAX_INPUT", (unsigned long) MAX_INPUT }, +#endif // MAX_INPUT +#ifdef MAX_LO_CRYPT + { "MAX_LO_CRYPT", (unsigned long) MAX_LO_CRYPT }, +#endif // MAX_LO_CRYPT +#ifdef MCL_CURRENT + { "MCL_CURRENT", (unsigned long) MCL_CURRENT }, +#endif // MCL_CURRENT +#ifdef MCL_FUTURE + { "MCL_FUTURE", (unsigned long) MCL_FUTURE }, +#endif // MCL_FUTURE +#ifdef MCL_ONFAULT + { "MCL_ONFAULT", (unsigned long) MCL_ONFAULT }, +#endif // MCL_ONFAULT +#ifdef MINIJAIL_ARCH_BITS + { "MINIJAIL_ARCH_BITS", (unsigned long) MINIJAIL_ARCH_BITS }, +#endif // MINIJAIL_ARCH_BITS +#ifdef MINIJAIL_ARCH_NR + { "MINIJAIL_ARCH_NR", (unsigned long) MINIJAIL_ARCH_NR }, +#endif // MINIJAIL_ARCH_NR #ifdef MINSIGSTKSZ - {"MINSIGSTKSZ", (unsigned long)MINSIGSTKSZ}, + { "MINSIGSTKSZ", (unsigned long) MINSIGSTKSZ }, #endif // MINSIGSTKSZ +#ifdef MLOCK_ONFAULT + { "MLOCK_ONFAULT", (unsigned long) MLOCK_ONFAULT }, +#endif // MLOCK_ONFAULT +#ifdef MOUNT_ATTR__ATIME + { "MOUNT_ATTR__ATIME", (unsigned long) MOUNT_ATTR__ATIME }, +#endif // MOUNT_ATTR__ATIME +#ifdef MOUNT_ATTR_NOATIME + { "MOUNT_ATTR_NOATIME", (unsigned long) MOUNT_ATTR_NOATIME }, +#endif // MOUNT_ATTR_NOATIME +#ifdef MOUNT_ATTR_NODEV + { "MOUNT_ATTR_NODEV", (unsigned long) MOUNT_ATTR_NODEV }, +#endif // MOUNT_ATTR_NODEV +#ifdef MOUNT_ATTR_NODIRATIME + { "MOUNT_ATTR_NODIRATIME", (unsigned long) MOUNT_ATTR_NODIRATIME }, +#endif // MOUNT_ATTR_NODIRATIME +#ifdef MOUNT_ATTR_NOEXEC + { "MOUNT_ATTR_NOEXEC", (unsigned long) MOUNT_ATTR_NOEXEC }, +#endif // MOUNT_ATTR_NOEXEC +#ifdef MOUNT_ATTR_NOSUID + { "MOUNT_ATTR_NOSUID", (unsigned long) MOUNT_ATTR_NOSUID }, +#endif // MOUNT_ATTR_NOSUID +#ifdef MOUNT_ATTR_RDONLY + { "MOUNT_ATTR_RDONLY", (unsigned long) MOUNT_ATTR_RDONLY }, +#endif // MOUNT_ATTR_RDONLY +#ifdef MOUNT_ATTR_RELATIME + { "MOUNT_ATTR_RELATIME", (unsigned long) MOUNT_ATTR_RELATIME }, +#endif // MOUNT_ATTR_RELATIME +#ifdef MOUNT_ATTR_STRICTATIME + { "MOUNT_ATTR_STRICTATIME", (unsigned long) MOUNT_ATTR_STRICTATIME }, +#endif // MOUNT_ATTR_STRICTATIME +#ifdef MOVE_MOUNT_F_AUTOMOUNTS + { "MOVE_MOUNT_F_AUTOMOUNTS", (unsigned long) MOVE_MOUNT_F_AUTOMOUNTS }, +#endif // MOVE_MOUNT_F_AUTOMOUNTS +#ifdef MOVE_MOUNT_F_EMPTY_PATH + { "MOVE_MOUNT_F_EMPTY_PATH", (unsigned long) MOVE_MOUNT_F_EMPTY_PATH }, +#endif // MOVE_MOUNT_F_EMPTY_PATH +#ifdef MOVE_MOUNT_F_SYMLINKS + { "MOVE_MOUNT_F_SYMLINKS", (unsigned long) MOVE_MOUNT_F_SYMLINKS }, +#endif // MOVE_MOUNT_F_SYMLINKS +#ifdef MOVE_MOUNT__MASK + { "MOVE_MOUNT__MASK", (unsigned long) MOVE_MOUNT__MASK }, +#endif // MOVE_MOUNT__MASK +#ifdef MOVE_MOUNT_T_AUTOMOUNTS + { "MOVE_MOUNT_T_AUTOMOUNTS", (unsigned long) MOVE_MOUNT_T_AUTOMOUNTS }, +#endif // MOVE_MOUNT_T_AUTOMOUNTS +#ifdef MOVE_MOUNT_T_EMPTY_PATH + { "MOVE_MOUNT_T_EMPTY_PATH", (unsigned long) MOVE_MOUNT_T_EMPTY_PATH }, +#endif // MOVE_MOUNT_T_EMPTY_PATH +#ifdef MOVE_MOUNT_T_SYMLINKS + { "MOVE_MOUNT_T_SYMLINKS", (unsigned long) MOVE_MOUNT_T_SYMLINKS }, +#endif // MOVE_MOUNT_T_SYMLINKS +#ifdef MREMAP_DONTUNMAP + { "MREMAP_DONTUNMAP", (unsigned long) MREMAP_DONTUNMAP }, +#endif // MREMAP_DONTUNMAP +#ifdef MREMAP_FIXED + { "MREMAP_FIXED", (unsigned long) MREMAP_FIXED }, +#endif // MREMAP_FIXED +#ifdef MREMAP_MAYMOVE + { "MREMAP_MAYMOVE", (unsigned long) MREMAP_MAYMOVE }, +#endif // MREMAP_MAYMOVE +#ifdef MS_ASYNC + { "MS_ASYNC", (unsigned long) MS_ASYNC }, +#endif // MS_ASYNC +#ifdef MS_BIND + { "MS_BIND", (unsigned long) MS_BIND }, +#endif // MS_BIND +#ifdef MS_DIRSYNC + { "MS_DIRSYNC", (unsigned long) MS_DIRSYNC }, +#endif // MS_DIRSYNC +#ifdef MSG_BATCH + { "MSG_BATCH", (unsigned long) MSG_BATCH }, +#endif // MSG_BATCH +#ifdef MSG_CMSG_CLOEXEC + { "MSG_CMSG_CLOEXEC", (unsigned long) MSG_CMSG_CLOEXEC }, +#endif // MSG_CMSG_CLOEXEC +#ifdef MSG_CONFIRM + { "MSG_CONFIRM", (unsigned long) MSG_CONFIRM }, +#endif // MSG_CONFIRM +#ifdef MSG_CTRUNC + { "MSG_CTRUNC", (unsigned long) MSG_CTRUNC }, +#endif // MSG_CTRUNC +#ifdef MSG_DONTROUTE + { "MSG_DONTROUTE", (unsigned long) MSG_DONTROUTE }, +#endif // MSG_DONTROUTE +#ifdef MSG_DONTWAIT + { "MSG_DONTWAIT", (unsigned long) MSG_DONTWAIT }, +#endif // MSG_DONTWAIT +#ifdef MSG_EOR + { "MSG_EOR", (unsigned long) MSG_EOR }, +#endif // MSG_EOR +#ifdef MSG_ERRQUEUE + { "MSG_ERRQUEUE", (unsigned long) MSG_ERRQUEUE }, +#endif // MSG_ERRQUEUE +#ifdef MSG_FASTOPEN + { "MSG_FASTOPEN", (unsigned long) MSG_FASTOPEN }, +#endif // MSG_FASTOPEN +#ifdef MSG_FIN + { "MSG_FIN", (unsigned long) MSG_FIN }, +#endif // MSG_FIN +#ifdef MSG_MORE + { "MSG_MORE", (unsigned long) MSG_MORE }, +#endif // MSG_MORE +#ifdef MSG_NOSIGNAL + { "MSG_NOSIGNAL", (unsigned long) MSG_NOSIGNAL }, +#endif // MSG_NOSIGNAL +#ifdef MSG_OOB + { "MSG_OOB", (unsigned long) MSG_OOB }, +#endif // MSG_OOB +#ifdef MSG_PEEK + { "MSG_PEEK", (unsigned long) MSG_PEEK }, +#endif // MSG_PEEK +#ifdef MSG_PROXY + { "MSG_PROXY", (unsigned long) MSG_PROXY }, +#endif // MSG_PROXY +#ifdef MSG_RST + { "MSG_RST", (unsigned long) MSG_RST }, +#endif // MSG_RST +#ifdef MSG_SYN + { "MSG_SYN", (unsigned long) MSG_SYN }, +#endif // MSG_SYN +#ifdef MSG_TRUNC + { "MSG_TRUNC", (unsigned long) MSG_TRUNC }, +#endif // MSG_TRUNC +#ifdef MSG_WAITALL + { "MSG_WAITALL", (unsigned long) MSG_WAITALL }, +#endif // MSG_WAITALL +#ifdef MSG_WAITFORONE + { "MSG_WAITFORONE", (unsigned long) MSG_WAITFORONE }, +#endif // MSG_WAITFORONE +#ifdef MSG_ZEROCOPY + { "MSG_ZEROCOPY", (unsigned long) MSG_ZEROCOPY }, +#endif // MSG_ZEROCOPY +#ifdef MS_INVALIDATE + { "MS_INVALIDATE", (unsigned long) MS_INVALIDATE }, +#endif // MS_INVALIDATE +#ifdef MS_MANDLOCK + { "MS_MANDLOCK", (unsigned long) MS_MANDLOCK }, +#endif // MS_MANDLOCK +#ifdef MS_MGC_MSK + { "MS_MGC_MSK", (unsigned long) MS_MGC_MSK }, +#endif // MS_MGC_MSK +#ifdef MS_MGC_VAL + { "MS_MGC_VAL", (unsigned long) MS_MGC_VAL }, +#endif // MS_MGC_VAL +#ifdef MS_MOVE + { "MS_MOVE", (unsigned long) MS_MOVE }, +#endif // MS_MOVE +#ifdef MS_NOATIME + { "MS_NOATIME", (unsigned long) MS_NOATIME }, +#endif // MS_NOATIME +#ifdef MS_NODEV + { "MS_NODEV", (unsigned long) MS_NODEV }, +#endif // MS_NODEV +#ifdef MS_NODIRATIME + { "MS_NODIRATIME", (unsigned long) MS_NODIRATIME }, +#endif // MS_NODIRATIME +#ifdef MS_NOEXEC + { "MS_NOEXEC", (unsigned long) MS_NOEXEC }, +#endif // MS_NOEXEC +#ifdef MS_NOSUID + { "MS_NOSUID", (unsigned long) MS_NOSUID }, +#endif // MS_NOSUID +#ifdef MS_RDONLY + { "MS_RDONLY", (unsigned long) MS_RDONLY }, +#endif // MS_RDONLY +#ifdef MS_REC + { "MS_REC", (unsigned long) MS_REC }, +#endif // MS_REC +#ifdef MS_REMOUNT + { "MS_REMOUNT", (unsigned long) MS_REMOUNT }, +#endif // MS_REMOUNT +#ifdef MS_SILENT + { "MS_SILENT", (unsigned long) MS_SILENT }, +#endif // MS_SILENT +#ifdef MS_SYNC + { "MS_SYNC", (unsigned long) MS_SYNC }, +#endif // MS_SYNC +#ifdef MS_SYNCHRONOUS + { "MS_SYNCHRONOUS", (unsigned long) MS_SYNCHRONOUS }, +#endif // MS_SYNCHRONOUS +#ifdef MS_VERBOSE + { "MS_VERBOSE", (unsigned long) MS_VERBOSE }, +#endif // MS_VERBOSE +#ifdef NAME_MAX + { "NAME_MAX", (unsigned long) NAME_MAX }, +#endif // NAME_MAX +#ifdef NCC + { "NCC", (unsigned long) NCC }, +#endif // NCC +#ifdef NCCS + { "NCCS", (unsigned long) NCCS }, +#endif // NCCS +#ifdef NFDBITS + { "NFDBITS", (unsigned long) NFDBITS }, +#endif // NFDBITS +#ifdef NFF + { "NFF", (unsigned long) NFF }, +#endif // NFF #ifdef NGREG - {"NGREG", (unsigned long)NGREG}, + { "NGREG", (unsigned long) NGREG }, #endif // NGREG +#ifdef NGROUPS_MAX + { "NGROUPS_MAX", (unsigned long) NGROUPS_MAX }, +#endif // NGROUPS_MAX +#ifdef NL0 + { "NL0", (unsigned long) NL0 }, +#endif // NL0 +#ifdef NL1 + { "NL1", (unsigned long) NL1 }, +#endif // NL1 +#ifdef NLDLY + { "NLDLY", (unsigned long) NLDLY }, +#endif // NLDLY +#ifdef NOFLSH + { "NOFLSH", (unsigned long) NOFLSH }, +#endif // NOFLSH +#ifdef NPROTO + { "NPROTO", (unsigned long) NPROTO }, +#endif // NPROTO +#ifdef NR_FILE + { "NR_FILE", (unsigned long) NR_FILE }, +#endif // NR_FILE +#ifdef NR_OPEN + { "NR_OPEN", (unsigned long) NR_OPEN }, +#endif // NR_OPEN +#ifdef NSIG + { "NSIG", (unsigned long) NSIG }, +#endif // NSIG #ifdef O_ACCMODE - {"O_ACCMODE", (unsigned long)O_ACCMODE}, + { "O_ACCMODE", (unsigned long) O_ACCMODE }, #endif // O_ACCMODE #ifdef O_APPEND - {"O_APPEND", (unsigned long)O_APPEND}, + { "O_APPEND", (unsigned long) O_APPEND }, #endif // O_APPEND #ifdef O_ASYNC - {"O_ASYNC", (unsigned long)O_ASYNC}, + { "O_ASYNC", (unsigned long) O_ASYNC }, #endif // O_ASYNC +#ifdef O_CLOEXEC + { "O_CLOEXEC", (unsigned long) O_CLOEXEC }, +#endif // O_CLOEXEC #ifdef O_CREAT - {"O_CREAT", (unsigned long)O_CREAT}, + { "O_CREAT", (unsigned long) O_CREAT }, #endif // O_CREAT +#ifdef OCRNL + { "OCRNL", (unsigned long) OCRNL }, +#endif // OCRNL +#ifdef O_DIRECTORY + { "O_DIRECTORY", (unsigned long) O_DIRECTORY }, +#endif // O_DIRECTORY +#ifdef O_DSYNC + { "O_DSYNC", (unsigned long) O_DSYNC }, +#endif // O_DSYNC #ifdef O_EXCL - {"O_EXCL", (unsigned long)O_EXCL}, + { "O_EXCL", (unsigned long) O_EXCL }, #endif // O_EXCL +#ifdef OFDEL + { "OFDEL", (unsigned long) OFDEL }, +#endif // OFDEL +#ifdef OFILL + { "OFILL", (unsigned long) OFILL }, +#endif // OFILL #ifdef O_FSYNC - {"O_FSYNC", (unsigned long)O_FSYNC}, + { "O_FSYNC", (unsigned long) O_FSYNC }, #endif // O_FSYNC +#ifdef OLCUC + { "OLCUC", (unsigned long) OLCUC }, +#endif // OLCUC #ifdef O_NDELAY - {"O_NDELAY", (unsigned long)O_NDELAY}, + { "O_NDELAY", (unsigned long) O_NDELAY }, #endif // O_NDELAY +#ifdef ONLCR + { "ONLCR", (unsigned long) ONLCR }, +#endif // ONLCR +#ifdef ONLRET + { "ONLRET", (unsigned long) ONLRET }, +#endif // ONLRET +#ifdef ONOCR + { "ONOCR", (unsigned long) ONOCR }, +#endif // ONOCR #ifdef O_NOCTTY - {"O_NOCTTY", (unsigned long)O_NOCTTY}, + { "O_NOCTTY", (unsigned long) O_NOCTTY }, #endif // O_NOCTTY +#ifdef O_NOFOLLOW + { "O_NOFOLLOW", (unsigned long) O_NOFOLLOW }, +#endif // O_NOFOLLOW #ifdef O_NONBLOCK - {"O_NONBLOCK", (unsigned long)O_NONBLOCK}, + { "O_NONBLOCK", (unsigned long) O_NONBLOCK }, #endif // O_NONBLOCK +#ifdef OPEN_TREE_CLOEXEC + { "OPEN_TREE_CLOEXEC", (unsigned long) OPEN_TREE_CLOEXEC }, +#endif // OPEN_TREE_CLOEXEC +#ifdef OPEN_TREE_CLONE + { "OPEN_TREE_CLONE", (unsigned long) OPEN_TREE_CLONE }, +#endif // OPEN_TREE_CLONE +#ifdef OPOST + { "OPOST", (unsigned long) OPOST }, +#endif // OPOST #ifdef O_RDONLY - {"O_RDONLY", (unsigned long)O_RDONLY}, + { "O_RDONLY", (unsigned long) O_RDONLY }, #endif // O_RDONLY #ifdef O_RDWR - {"O_RDWR", (unsigned long)O_RDWR}, + { "O_RDWR", (unsigned long) O_RDWR }, #endif // O_RDWR #ifdef O_RSYNC - {"O_RSYNC", (unsigned long)O_RSYNC}, + { "O_RSYNC", (unsigned long) O_RSYNC }, #endif // O_RSYNC #ifdef O_SYNC - {"O_SYNC", (unsigned long)O_SYNC}, + { "O_SYNC", (unsigned long) O_SYNC }, #endif // O_SYNC #ifdef O_TRUNC - {"O_TRUNC", (unsigned long)O_TRUNC}, + { "O_TRUNC", (unsigned long) O_TRUNC }, #endif // O_TRUNC +#ifdef OVERCOMMIT_ALWAYS + { "OVERCOMMIT_ALWAYS", (unsigned long) OVERCOMMIT_ALWAYS }, +#endif // OVERCOMMIT_ALWAYS +#ifdef OVERCOMMIT_GUESS + { "OVERCOMMIT_GUESS", (unsigned long) OVERCOMMIT_GUESS }, +#endif // OVERCOMMIT_GUESS +#ifdef OVERCOMMIT_NEVER + { "OVERCOMMIT_NEVER", (unsigned long) OVERCOMMIT_NEVER }, +#endif // OVERCOMMIT_NEVER #ifdef O_WRONLY - {"O_WRONLY", (unsigned long)O_WRONLY}, + { "O_WRONLY", (unsigned long) O_WRONLY }, #endif // O_WRONLY +#ifdef PARENB + { "PARENB", (unsigned long) PARENB }, +#endif // PARENB +#ifdef PARMRK + { "PARMRK", (unsigned long) PARMRK }, +#endif // PARMRK +#ifdef PARODD + { "PARODD", (unsigned long) PARODD }, +#endif // PARODD +#ifdef PATH_MAX + { "PATH_MAX", (unsigned long) PATH_MAX }, +#endif // PATH_MAX +#ifdef PDP_ENDIAN + { "PDP_ENDIAN", (unsigned long) PDP_ENDIAN }, +#endif // PDP_ENDIAN +#ifdef PENDIN + { "PENDIN", (unsigned long) PENDIN }, +#endif // PENDIN +#ifdef PF_ALG + { "PF_ALG", (unsigned long) PF_ALG }, +#endif // PF_ALG +#ifdef PF_APPLETALK + { "PF_APPLETALK", (unsigned long) PF_APPLETALK }, +#endif // PF_APPLETALK +#ifdef PF_ASH + { "PF_ASH", (unsigned long) PF_ASH }, +#endif // PF_ASH +#ifdef PF_ATMPVC + { "PF_ATMPVC", (unsigned long) PF_ATMPVC }, +#endif // PF_ATMPVC +#ifdef PF_ATMSVC + { "PF_ATMSVC", (unsigned long) PF_ATMSVC }, +#endif // PF_ATMSVC +#ifdef PF_AX25 + { "PF_AX25", (unsigned long) PF_AX25 }, +#endif // PF_AX25 +#ifdef PF_BLUETOOTH + { "PF_BLUETOOTH", (unsigned long) PF_BLUETOOTH }, +#endif // PF_BLUETOOTH +#ifdef PF_BRIDGE + { "PF_BRIDGE", (unsigned long) PF_BRIDGE }, +#endif // PF_BRIDGE +#ifdef PF_CAIF + { "PF_CAIF", (unsigned long) PF_CAIF }, +#endif // PF_CAIF +#ifdef PF_CAN + { "PF_CAN", (unsigned long) PF_CAN }, +#endif // PF_CAN +#ifdef PF_ECONET + { "PF_ECONET", (unsigned long) PF_ECONET }, +#endif // PF_ECONET +#ifdef PF_FILE + { "PF_FILE", (unsigned long) PF_FILE }, +#endif // PF_FILE +#ifdef PF_IB + { "PF_IB", (unsigned long) PF_IB }, +#endif // PF_IB +#ifdef PF_IEEE802154 + { "PF_IEEE802154", (unsigned long) PF_IEEE802154 }, +#endif // PF_IEEE802154 +#ifdef PF_INET + { "PF_INET", (unsigned long) PF_INET }, +#endif // PF_INET +#ifdef PF_INET6 + { "PF_INET6", (unsigned long) PF_INET6 }, +#endif // PF_INET6 +#ifdef PF_IPX + { "PF_IPX", (unsigned long) PF_IPX }, +#endif // PF_IPX +#ifdef PF_IRDA + { "PF_IRDA", (unsigned long) PF_IRDA }, +#endif // PF_IRDA +#ifdef PF_ISDN + { "PF_ISDN", (unsigned long) PF_ISDN }, +#endif // PF_ISDN +#ifdef PF_IUCV + { "PF_IUCV", (unsigned long) PF_IUCV }, +#endif // PF_IUCV +#ifdef PF_KCM + { "PF_KCM", (unsigned long) PF_KCM }, +#endif // PF_KCM +#ifdef PF_KEY + { "PF_KEY", (unsigned long) PF_KEY }, +#endif // PF_KEY +#ifdef PF_LLC + { "PF_LLC", (unsigned long) PF_LLC }, +#endif // PF_LLC +#ifdef PF_LOCAL + { "PF_LOCAL", (unsigned long) PF_LOCAL }, +#endif // PF_LOCAL +#ifdef PF_MAX + { "PF_MAX", (unsigned long) PF_MAX }, +#endif // PF_MAX +#ifdef PF_MPLS + { "PF_MPLS", (unsigned long) PF_MPLS }, +#endif // PF_MPLS +#ifdef PF_NETBEUI + { "PF_NETBEUI", (unsigned long) PF_NETBEUI }, +#endif // PF_NETBEUI +#ifdef PF_NETLINK + { "PF_NETLINK", (unsigned long) PF_NETLINK }, +#endif // PF_NETLINK +#ifdef PF_NETROM + { "PF_NETROM", (unsigned long) PF_NETROM }, +#endif // PF_NETROM +#ifdef PF_NFC + { "PF_NFC", (unsigned long) PF_NFC }, +#endif // PF_NFC +#ifdef PF_PACKET + { "PF_PACKET", (unsigned long) PF_PACKET }, +#endif // PF_PACKET +#ifdef PF_PHONET + { "PF_PHONET", (unsigned long) PF_PHONET }, +#endif // PF_PHONET +#ifdef PF_PPPOX + { "PF_PPPOX", (unsigned long) PF_PPPOX }, +#endif // PF_PPPOX +#ifdef PF_QIPCRTR + { "PF_QIPCRTR", (unsigned long) PF_QIPCRTR }, +#endif // PF_QIPCRTR +#ifdef PF_RDS + { "PF_RDS", (unsigned long) PF_RDS }, +#endif // PF_RDS +#ifdef PF_ROSE + { "PF_ROSE", (unsigned long) PF_ROSE }, +#endif // PF_ROSE +#ifdef PF_ROUTE + { "PF_ROUTE", (unsigned long) PF_ROUTE }, +#endif // PF_ROUTE +#ifdef PF_RXRPC + { "PF_RXRPC", (unsigned long) PF_RXRPC }, +#endif // PF_RXRPC +#ifdef PF_SECURITY + { "PF_SECURITY", (unsigned long) PF_SECURITY }, +#endif // PF_SECURITY +#ifdef PF_SMC + { "PF_SMC", (unsigned long) PF_SMC }, +#endif // PF_SMC +#ifdef PF_SNA + { "PF_SNA", (unsigned long) PF_SNA }, +#endif // PF_SNA +#ifdef PF_TIPC + { "PF_TIPC", (unsigned long) PF_TIPC }, +#endif // PF_TIPC +#ifdef PF_UNIX + { "PF_UNIX", (unsigned long) PF_UNIX }, +#endif // PF_UNIX +#ifdef PF_UNSPEC + { "PF_UNSPEC", (unsigned long) PF_UNSPEC }, +#endif // PF_UNSPEC +#ifdef PF_VSOCK + { "PF_VSOCK", (unsigned long) PF_VSOCK }, +#endif // PF_VSOCK +#ifdef PF_WANPIPE + { "PF_WANPIPE", (unsigned long) PF_WANPIPE }, +#endif // PF_WANPIPE +#ifdef PF_X25 + { "PF_X25", (unsigned long) PF_X25 }, +#endif // PF_X25 +#ifdef PF_XDP + { "PF_XDP", (unsigned long) PF_XDP }, +#endif // PF_XDP +#ifdef PIPE_BUF + { "PIPE_BUF", (unsigned long) PIPE_BUF }, +#endif // PIPE_BUF +#ifdef PKEY_DISABLE_ACCESS + { "PKEY_DISABLE_ACCESS", (unsigned long) PKEY_DISABLE_ACCESS }, +#endif // PKEY_DISABLE_ACCESS +#ifdef PKEY_DISABLE_WRITE + { "PKEY_DISABLE_WRITE", (unsigned long) PKEY_DISABLE_WRITE }, +#endif // PKEY_DISABLE_WRITE #ifdef POLL_ERR - {"POLL_ERR", (unsigned long)POLL_ERR}, + { "POLL_ERR", (unsigned long) POLL_ERR }, #endif // POLL_ERR #ifdef POLL_HUP - {"POLL_HUP", (unsigned long)POLL_HUP}, + { "POLL_HUP", (unsigned long) POLL_HUP }, #endif // POLL_HUP #ifdef POLL_IN - {"POLL_IN", (unsigned long)POLL_IN}, + { "POLL_IN", (unsigned long) POLL_IN }, #endif // POLL_IN #ifdef POLL_MSG - {"POLL_MSG", (unsigned long)POLL_MSG}, + { "POLL_MSG", (unsigned long) POLL_MSG }, #endif // POLL_MSG #ifdef POLL_OUT - {"POLL_OUT", (unsigned long)POLL_OUT}, + { "POLL_OUT", (unsigned long) POLL_OUT }, #endif // POLL_OUT #ifdef POLL_PRI - {"POLL_PRI", (unsigned long)POLL_PRI}, + { "POLL_PRI", (unsigned long) POLL_PRI }, #endif // POLL_PRI +#ifdef PORT_16450 + { "PORT_16450", (unsigned long) PORT_16450 }, +#endif // PORT_16450 +#ifdef PORT_16550 + { "PORT_16550", (unsigned long) PORT_16550 }, +#endif // PORT_16550 +#ifdef PORT_16550A + { "PORT_16550A", (unsigned long) PORT_16550A }, +#endif // PORT_16550A +#ifdef PORT_16650 + { "PORT_16650", (unsigned long) PORT_16650 }, +#endif // PORT_16650 +#ifdef PORT_16650V2 + { "PORT_16650V2", (unsigned long) PORT_16650V2 }, +#endif // PORT_16650V2 +#ifdef PORT_16654 + { "PORT_16654", (unsigned long) PORT_16654 }, +#endif // PORT_16654 +#ifdef PORT_16750 + { "PORT_16750", (unsigned long) PORT_16750 }, +#endif // PORT_16750 +#ifdef PORT_16850 + { "PORT_16850", (unsigned long) PORT_16850 }, +#endif // PORT_16850 +#ifdef PORT_16C950 + { "PORT_16C950", (unsigned long) PORT_16C950 }, +#endif // PORT_16C950 +#ifdef PORT_8250 + { "PORT_8250", (unsigned long) PORT_8250 }, +#endif // PORT_8250 +#ifdef PORT_CIRRUS + { "PORT_CIRRUS", (unsigned long) PORT_CIRRUS }, +#endif // PORT_CIRRUS +#ifdef PORT_MAX + { "PORT_MAX", (unsigned long) PORT_MAX }, +#endif // PORT_MAX +#ifdef PORT_RSA + { "PORT_RSA", (unsigned long) PORT_RSA }, +#endif // PORT_RSA +#ifdef PORT_STARTECH + { "PORT_STARTECH", (unsigned long) PORT_STARTECH }, +#endif // PORT_STARTECH +#ifdef PORT_UNKNOWN + { "PORT_UNKNOWN", (unsigned long) PORT_UNKNOWN }, +#endif // PORT_UNKNOWN +#ifdef POSIX_FADV_DONTNEED + { "POSIX_FADV_DONTNEED", (unsigned long) POSIX_FADV_DONTNEED }, +#endif // POSIX_FADV_DONTNEED +#ifdef POSIX_FADV_NOREUSE + { "POSIX_FADV_NOREUSE", (unsigned long) POSIX_FADV_NOREUSE }, +#endif // POSIX_FADV_NOREUSE #ifdef POSIX_FADV_NORMAL - {"POSIX_FADV_NORMAL", (unsigned long)POSIX_FADV_NORMAL}, + { "POSIX_FADV_NORMAL", (unsigned long) POSIX_FADV_NORMAL }, #endif // POSIX_FADV_NORMAL #ifdef POSIX_FADV_RANDOM - {"POSIX_FADV_RANDOM", (unsigned long)POSIX_FADV_RANDOM}, + { "POSIX_FADV_RANDOM", (unsigned long) POSIX_FADV_RANDOM }, #endif // POSIX_FADV_RANDOM #ifdef POSIX_FADV_SEQUENTIAL - {"POSIX_FADV_SEQUENTIAL", (unsigned long)POSIX_FADV_SEQUENTIAL}, + { "POSIX_FADV_SEQUENTIAL", (unsigned long) POSIX_FADV_SEQUENTIAL }, #endif // POSIX_FADV_SEQUENTIAL #ifdef POSIX_FADV_WILLNEED - {"POSIX_FADV_WILLNEED", (unsigned long)POSIX_FADV_WILLNEED}, + { "POSIX_FADV_WILLNEED", (unsigned long) POSIX_FADV_WILLNEED }, #endif // POSIX_FADV_WILLNEED +#ifdef POSIX_MADV_DONTNEED + { "POSIX_MADV_DONTNEED", (unsigned long) POSIX_MADV_DONTNEED }, +#endif // POSIX_MADV_DONTNEED +#ifdef POSIX_MADV_NORMAL + { "POSIX_MADV_NORMAL", (unsigned long) POSIX_MADV_NORMAL }, +#endif // POSIX_MADV_NORMAL +#ifdef POSIX_MADV_RANDOM + { "POSIX_MADV_RANDOM", (unsigned long) POSIX_MADV_RANDOM }, +#endif // POSIX_MADV_RANDOM +#ifdef POSIX_MADV_SEQUENTIAL + { "POSIX_MADV_SEQUENTIAL", (unsigned long) POSIX_MADV_SEQUENTIAL }, +#endif // POSIX_MADV_SEQUENTIAL +#ifdef POSIX_MADV_WILLNEED + { "POSIX_MADV_WILLNEED", (unsigned long) POSIX_MADV_WILLNEED }, +#endif // POSIX_MADV_WILLNEED +#ifdef PR_CAP_AMBIENT + { "PR_CAP_AMBIENT", (unsigned long) PR_CAP_AMBIENT }, +#endif // PR_CAP_AMBIENT +#ifdef PR_CAP_AMBIENT_CLEAR_ALL + { "PR_CAP_AMBIENT_CLEAR_ALL", (unsigned long) PR_CAP_AMBIENT_CLEAR_ALL }, +#endif // PR_CAP_AMBIENT_CLEAR_ALL +#ifdef PR_CAP_AMBIENT_IS_SET + { "PR_CAP_AMBIENT_IS_SET", (unsigned long) PR_CAP_AMBIENT_IS_SET }, +#endif // PR_CAP_AMBIENT_IS_SET +#ifdef PR_CAP_AMBIENT_LOWER + { "PR_CAP_AMBIENT_LOWER", (unsigned long) PR_CAP_AMBIENT_LOWER }, +#endif // PR_CAP_AMBIENT_LOWER +#ifdef PR_CAP_AMBIENT_RAISE + { "PR_CAP_AMBIENT_RAISE", (unsigned long) PR_CAP_AMBIENT_RAISE }, +#endif // PR_CAP_AMBIENT_RAISE #ifdef PR_CAPBSET_DROP - {"PR_CAPBSET_DROP", (unsigned long)PR_CAPBSET_DROP}, + { "PR_CAPBSET_DROP", (unsigned long) PR_CAPBSET_DROP }, #endif // PR_CAPBSET_DROP #ifdef PR_CAPBSET_READ - {"PR_CAPBSET_READ", (unsigned long)PR_CAPBSET_READ}, + { "PR_CAPBSET_READ", (unsigned long) PR_CAPBSET_READ }, #endif // PR_CAPBSET_READ #ifdef PR_ENDIAN_BIG - {"PR_ENDIAN_BIG", (unsigned long)PR_ENDIAN_BIG}, + { "PR_ENDIAN_BIG", (unsigned long) PR_ENDIAN_BIG }, #endif // PR_ENDIAN_BIG #ifdef PR_ENDIAN_LITTLE - {"PR_ENDIAN_LITTLE", (unsigned long)PR_ENDIAN_LITTLE}, + { "PR_ENDIAN_LITTLE", (unsigned long) PR_ENDIAN_LITTLE }, #endif // PR_ENDIAN_LITTLE #ifdef PR_ENDIAN_PPC_LITTLE - {"PR_ENDIAN_PPC_LITTLE", (unsigned long)PR_ENDIAN_PPC_LITTLE}, + { "PR_ENDIAN_PPC_LITTLE", (unsigned long) PR_ENDIAN_PPC_LITTLE }, #endif // PR_ENDIAN_PPC_LITTLE #ifdef PR_FPEMU_NOPRINT - {"PR_FPEMU_NOPRINT", (unsigned long)PR_FPEMU_NOPRINT}, + { "PR_FPEMU_NOPRINT", (unsigned long) PR_FPEMU_NOPRINT }, #endif // PR_FPEMU_NOPRINT #ifdef PR_FPEMU_SIGFPE - {"PR_FPEMU_SIGFPE", (unsigned long)PR_FPEMU_SIGFPE}, + { "PR_FPEMU_SIGFPE", (unsigned long) PR_FPEMU_SIGFPE }, #endif // PR_FPEMU_SIGFPE #ifdef PR_FP_EXC_ASYNC - {"PR_FP_EXC_ASYNC", (unsigned long)PR_FP_EXC_ASYNC}, + { "PR_FP_EXC_ASYNC", (unsigned long) PR_FP_EXC_ASYNC }, #endif // PR_FP_EXC_ASYNC #ifdef PR_FP_EXC_DISABLED - {"PR_FP_EXC_DISABLED", (unsigned long)PR_FP_EXC_DISABLED}, + { "PR_FP_EXC_DISABLED", (unsigned long) PR_FP_EXC_DISABLED }, #endif // PR_FP_EXC_DISABLED #ifdef PR_FP_EXC_DIV - {"PR_FP_EXC_DIV", (unsigned long)PR_FP_EXC_DIV}, + { "PR_FP_EXC_DIV", (unsigned long) PR_FP_EXC_DIV }, #endif // PR_FP_EXC_DIV #ifdef PR_FP_EXC_INV - {"PR_FP_EXC_INV", (unsigned long)PR_FP_EXC_INV}, + { "PR_FP_EXC_INV", (unsigned long) PR_FP_EXC_INV }, #endif // PR_FP_EXC_INV #ifdef PR_FP_EXC_NONRECOV - {"PR_FP_EXC_NONRECOV", (unsigned long)PR_FP_EXC_NONRECOV}, + { "PR_FP_EXC_NONRECOV", (unsigned long) PR_FP_EXC_NONRECOV }, #endif // PR_FP_EXC_NONRECOV #ifdef PR_FP_EXC_OVF - {"PR_FP_EXC_OVF", (unsigned long)PR_FP_EXC_OVF}, + { "PR_FP_EXC_OVF", (unsigned long) PR_FP_EXC_OVF }, #endif // PR_FP_EXC_OVF #ifdef PR_FP_EXC_PRECISE - {"PR_FP_EXC_PRECISE", (unsigned long)PR_FP_EXC_PRECISE}, + { "PR_FP_EXC_PRECISE", (unsigned long) PR_FP_EXC_PRECISE }, #endif // PR_FP_EXC_PRECISE #ifdef PR_FP_EXC_RES - {"PR_FP_EXC_RES", (unsigned long)PR_FP_EXC_RES}, + { "PR_FP_EXC_RES", (unsigned long) PR_FP_EXC_RES }, #endif // PR_FP_EXC_RES #ifdef PR_FP_EXC_SW_ENABLE - {"PR_FP_EXC_SW_ENABLE", (unsigned long)PR_FP_EXC_SW_ENABLE}, + { "PR_FP_EXC_SW_ENABLE", (unsigned long) PR_FP_EXC_SW_ENABLE }, #endif // PR_FP_EXC_SW_ENABLE #ifdef PR_FP_EXC_UND - {"PR_FP_EXC_UND", (unsigned long)PR_FP_EXC_UND}, + { "PR_FP_EXC_UND", (unsigned long) PR_FP_EXC_UND }, #endif // PR_FP_EXC_UND #ifdef PR_GET_CHILD_SUBREAPER - {"PR_GET_CHILD_SUBREAPER", (unsigned long)PR_GET_CHILD_SUBREAPER}, + { "PR_GET_CHILD_SUBREAPER", (unsigned long) PR_GET_CHILD_SUBREAPER }, #endif // PR_GET_CHILD_SUBREAPER #ifdef PR_GET_DUMPABLE - {"PR_GET_DUMPABLE", (unsigned long)PR_GET_DUMPABLE}, + { "PR_GET_DUMPABLE", (unsigned long) PR_GET_DUMPABLE }, #endif // PR_GET_DUMPABLE #ifdef PR_GET_ENDIAN - {"PR_GET_ENDIAN", (unsigned long)PR_GET_ENDIAN}, + { "PR_GET_ENDIAN", (unsigned long) PR_GET_ENDIAN }, #endif // PR_GET_ENDIAN #ifdef PR_GET_FPEMU - {"PR_GET_FPEMU", (unsigned long)PR_GET_FPEMU}, + { "PR_GET_FPEMU", (unsigned long) PR_GET_FPEMU }, #endif // PR_GET_FPEMU #ifdef PR_GET_FPEXC - {"PR_GET_FPEXC", (unsigned long)PR_GET_FPEXC}, + { "PR_GET_FPEXC", (unsigned long) PR_GET_FPEXC }, #endif // PR_GET_FPEXC +#ifdef PR_GET_FP_MODE + { "PR_GET_FP_MODE", (unsigned long) PR_GET_FP_MODE }, +#endif // PR_GET_FP_MODE +#ifdef PR_GET_IO_FLUSHER + { "PR_GET_IO_FLUSHER", (unsigned long) PR_GET_IO_FLUSHER }, +#endif // PR_GET_IO_FLUSHER #ifdef PR_GET_KEEPCAPS - {"PR_GET_KEEPCAPS", (unsigned long)PR_GET_KEEPCAPS}, + { "PR_GET_KEEPCAPS", (unsigned long) PR_GET_KEEPCAPS }, #endif // PR_GET_KEEPCAPS #ifdef PR_GET_NAME - {"PR_GET_NAME", (unsigned long)PR_GET_NAME}, + { "PR_GET_NAME", (unsigned long) PR_GET_NAME }, #endif // PR_GET_NAME #ifdef PR_GET_NO_NEW_PRIVS - {"PR_GET_NO_NEW_PRIVS", (unsigned long)PR_GET_NO_NEW_PRIVS}, + { "PR_GET_NO_NEW_PRIVS", (unsigned long) PR_GET_NO_NEW_PRIVS }, #endif // PR_GET_NO_NEW_PRIVS #ifdef PR_GET_PDEATHSIG - {"PR_GET_PDEATHSIG", (unsigned long)PR_GET_PDEATHSIG}, + { "PR_GET_PDEATHSIG", (unsigned long) PR_GET_PDEATHSIG }, #endif // PR_GET_PDEATHSIG #ifdef PR_GET_SECCOMP - {"PR_GET_SECCOMP", (unsigned long)PR_GET_SECCOMP}, + { "PR_GET_SECCOMP", (unsigned long) PR_GET_SECCOMP }, #endif // PR_GET_SECCOMP #ifdef PR_GET_SECUREBITS - {"PR_GET_SECUREBITS", (unsigned long)PR_GET_SECUREBITS}, + { "PR_GET_SECUREBITS", (unsigned long) PR_GET_SECUREBITS }, #endif // PR_GET_SECUREBITS +#ifdef PR_GET_SPECULATION_CTRL + { "PR_GET_SPECULATION_CTRL", (unsigned long) PR_GET_SPECULATION_CTRL }, +#endif // PR_GET_SPECULATION_CTRL +#ifdef PR_GET_TAGGED_ADDR_CTRL + { "PR_GET_TAGGED_ADDR_CTRL", (unsigned long) PR_GET_TAGGED_ADDR_CTRL }, +#endif // PR_GET_TAGGED_ADDR_CTRL +#ifdef PR_GET_THP_DISABLE + { "PR_GET_THP_DISABLE", (unsigned long) PR_GET_THP_DISABLE }, +#endif // PR_GET_THP_DISABLE #ifdef PR_GET_TID_ADDRESS - {"PR_GET_TID_ADDRESS", (unsigned long)PR_GET_TID_ADDRESS}, + { "PR_GET_TID_ADDRESS", (unsigned long) PR_GET_TID_ADDRESS }, #endif // PR_GET_TID_ADDRESS #ifdef PR_GET_TIMERSLACK - {"PR_GET_TIMERSLACK", (unsigned long)PR_GET_TIMERSLACK}, + { "PR_GET_TIMERSLACK", (unsigned long) PR_GET_TIMERSLACK }, #endif // PR_GET_TIMERSLACK #ifdef PR_GET_TIMING - {"PR_GET_TIMING", (unsigned long)PR_GET_TIMING}, + { "PR_GET_TIMING", (unsigned long) PR_GET_TIMING }, #endif // PR_GET_TIMING #ifdef PR_GET_TSC - {"PR_GET_TSC", (unsigned long)PR_GET_TSC}, + { "PR_GET_TSC", (unsigned long) PR_GET_TSC }, #endif // PR_GET_TSC #ifdef PR_GET_UNALIGN - {"PR_GET_UNALIGN", (unsigned long)PR_GET_UNALIGN}, + { "PR_GET_UNALIGN", (unsigned long) PR_GET_UNALIGN }, #endif // PR_GET_UNALIGN +#ifdef PRIO_MAX + { "PRIO_MAX", (unsigned long) PRIO_MAX }, +#endif // PRIO_MAX +#ifdef PRIO_PGRP + { "PRIO_PGRP", (unsigned long) PRIO_PGRP }, +#endif // PRIO_PGRP +#ifdef PRIO_PROCESS + { "PRIO_PROCESS", (unsigned long) PRIO_PROCESS }, +#endif // PRIO_PROCESS +#ifdef PRIO_USER + { "PRIO_USER", (unsigned long) PRIO_USER }, +#endif // PRIO_USER #ifdef PR_MCE_KILL - {"PR_MCE_KILL", (unsigned long)PR_MCE_KILL}, + { "PR_MCE_KILL", (unsigned long) PR_MCE_KILL }, #endif // PR_MCE_KILL #ifdef PR_MCE_KILL_CLEAR - {"PR_MCE_KILL_CLEAR", (unsigned long)PR_MCE_KILL_CLEAR}, + { "PR_MCE_KILL_CLEAR", (unsigned long) PR_MCE_KILL_CLEAR }, #endif // PR_MCE_KILL_CLEAR #ifdef PR_MCE_KILL_DEFAULT - {"PR_MCE_KILL_DEFAULT", (unsigned long)PR_MCE_KILL_DEFAULT}, + { "PR_MCE_KILL_DEFAULT", (unsigned long) PR_MCE_KILL_DEFAULT }, #endif // PR_MCE_KILL_DEFAULT #ifdef PR_MCE_KILL_EARLY - {"PR_MCE_KILL_EARLY", (unsigned long)PR_MCE_KILL_EARLY}, + { "PR_MCE_KILL_EARLY", (unsigned long) PR_MCE_KILL_EARLY }, #endif // PR_MCE_KILL_EARLY #ifdef PR_MCE_KILL_GET - {"PR_MCE_KILL_GET", (unsigned long)PR_MCE_KILL_GET}, + { "PR_MCE_KILL_GET", (unsigned long) PR_MCE_KILL_GET }, #endif // PR_MCE_KILL_GET #ifdef PR_MCE_KILL_LATE - {"PR_MCE_KILL_LATE", (unsigned long)PR_MCE_KILL_LATE}, + { "PR_MCE_KILL_LATE", (unsigned long) PR_MCE_KILL_LATE }, #endif // PR_MCE_KILL_LATE #ifdef PR_MCE_KILL_SET - {"PR_MCE_KILL_SET", (unsigned long)PR_MCE_KILL_SET}, + { "PR_MCE_KILL_SET", (unsigned long) PR_MCE_KILL_SET }, #endif // PR_MCE_KILL_SET +#ifdef PR_MPX_DISABLE_MANAGEMENT + { "PR_MPX_DISABLE_MANAGEMENT", (unsigned long) PR_MPX_DISABLE_MANAGEMENT }, +#endif // PR_MPX_DISABLE_MANAGEMENT +#ifdef PR_MPX_ENABLE_MANAGEMENT + { "PR_MPX_ENABLE_MANAGEMENT", (unsigned long) PR_MPX_ENABLE_MANAGEMENT }, +#endif // PR_MPX_ENABLE_MANAGEMENT +#ifdef PROT_EXEC + { "PROT_EXEC", (unsigned long) PROT_EXEC }, +#endif // PROT_EXEC +#ifdef PROT_GROWSDOWN + { "PROT_GROWSDOWN", (unsigned long) PROT_GROWSDOWN }, +#endif // PROT_GROWSDOWN +#ifdef PROT_GROWSUP + { "PROT_GROWSUP", (unsigned long) PROT_GROWSUP }, +#endif // PROT_GROWSUP +#ifdef PROT_NONE + { "PROT_NONE", (unsigned long) PROT_NONE }, +#endif // PROT_NONE +#ifdef PROT_READ + { "PROT_READ", (unsigned long) PROT_READ }, +#endif // PROT_READ +#ifdef PROT_SEM + { "PROT_SEM", (unsigned long) PROT_SEM }, +#endif // PROT_SEM +#ifdef PROT_WRITE + { "PROT_WRITE", (unsigned long) PROT_WRITE }, +#endif // PROT_WRITE +#ifdef PR_PAC_RESET_KEYS + { "PR_PAC_RESET_KEYS", (unsigned long) PR_PAC_RESET_KEYS }, +#endif // PR_PAC_RESET_KEYS #ifdef PR_SET_CHILD_SUBREAPER - {"PR_SET_CHILD_SUBREAPER", (unsigned long)PR_SET_CHILD_SUBREAPER}, + { "PR_SET_CHILD_SUBREAPER", (unsigned long) PR_SET_CHILD_SUBREAPER }, #endif // PR_SET_CHILD_SUBREAPER #ifdef PR_SET_DUMPABLE - {"PR_SET_DUMPABLE", (unsigned long)PR_SET_DUMPABLE}, + { "PR_SET_DUMPABLE", (unsigned long) PR_SET_DUMPABLE }, #endif // PR_SET_DUMPABLE #ifdef PR_SET_ENDIAN - {"PR_SET_ENDIAN", (unsigned long)PR_SET_ENDIAN}, + { "PR_SET_ENDIAN", (unsigned long) PR_SET_ENDIAN }, #endif // PR_SET_ENDIAN #ifdef PR_SET_FPEMU - {"PR_SET_FPEMU", (unsigned long)PR_SET_FPEMU}, + { "PR_SET_FPEMU", (unsigned long) PR_SET_FPEMU }, #endif // PR_SET_FPEMU #ifdef PR_SET_FPEXC - {"PR_SET_FPEXC", (unsigned long)PR_SET_FPEXC}, + { "PR_SET_FPEXC", (unsigned long) PR_SET_FPEXC }, #endif // PR_SET_FPEXC +#ifdef PR_SET_FP_MODE + { "PR_SET_FP_MODE", (unsigned long) PR_SET_FP_MODE }, +#endif // PR_SET_FP_MODE +#ifdef PR_SET_IO_FLUSHER + { "PR_SET_IO_FLUSHER", (unsigned long) PR_SET_IO_FLUSHER }, +#endif // PR_SET_IO_FLUSHER #ifdef PR_SET_KEEPCAPS - {"PR_SET_KEEPCAPS", (unsigned long)PR_SET_KEEPCAPS}, + { "PR_SET_KEEPCAPS", (unsigned long) PR_SET_KEEPCAPS }, #endif // PR_SET_KEEPCAPS #ifdef PR_SET_MM - {"PR_SET_MM", (unsigned long)PR_SET_MM}, + { "PR_SET_MM", (unsigned long) PR_SET_MM }, #endif // PR_SET_MM #ifdef PR_SET_MM_ARG_END - {"PR_SET_MM_ARG_END", (unsigned long)PR_SET_MM_ARG_END}, + { "PR_SET_MM_ARG_END", (unsigned long) PR_SET_MM_ARG_END }, #endif // PR_SET_MM_ARG_END #ifdef PR_SET_MM_ARG_START - {"PR_SET_MM_ARG_START", (unsigned long)PR_SET_MM_ARG_START}, + { "PR_SET_MM_ARG_START", (unsigned long) PR_SET_MM_ARG_START }, #endif // PR_SET_MM_ARG_START #ifdef PR_SET_MM_AUXV - {"PR_SET_MM_AUXV", (unsigned long)PR_SET_MM_AUXV}, + { "PR_SET_MM_AUXV", (unsigned long) PR_SET_MM_AUXV }, #endif // PR_SET_MM_AUXV #ifdef PR_SET_MM_BRK - {"PR_SET_MM_BRK", (unsigned long)PR_SET_MM_BRK}, + { "PR_SET_MM_BRK", (unsigned long) PR_SET_MM_BRK }, #endif // PR_SET_MM_BRK #ifdef PR_SET_MM_END_CODE - {"PR_SET_MM_END_CODE", (unsigned long)PR_SET_MM_END_CODE}, + { "PR_SET_MM_END_CODE", (unsigned long) PR_SET_MM_END_CODE }, #endif // PR_SET_MM_END_CODE #ifdef PR_SET_MM_END_DATA - {"PR_SET_MM_END_DATA", (unsigned long)PR_SET_MM_END_DATA}, + { "PR_SET_MM_END_DATA", (unsigned long) PR_SET_MM_END_DATA }, #endif // PR_SET_MM_END_DATA #ifdef PR_SET_MM_ENV_END - {"PR_SET_MM_ENV_END", (unsigned long)PR_SET_MM_ENV_END}, + { "PR_SET_MM_ENV_END", (unsigned long) PR_SET_MM_ENV_END }, #endif // PR_SET_MM_ENV_END #ifdef PR_SET_MM_ENV_START - {"PR_SET_MM_ENV_START", (unsigned long)PR_SET_MM_ENV_START}, + { "PR_SET_MM_ENV_START", (unsigned long) PR_SET_MM_ENV_START }, #endif // PR_SET_MM_ENV_START #ifdef PR_SET_MM_EXE_FILE - {"PR_SET_MM_EXE_FILE", (unsigned long)PR_SET_MM_EXE_FILE}, + { "PR_SET_MM_EXE_FILE", (unsigned long) PR_SET_MM_EXE_FILE }, #endif // PR_SET_MM_EXE_FILE +#ifdef PR_SET_MM_MAP + { "PR_SET_MM_MAP", (unsigned long) PR_SET_MM_MAP }, +#endif // PR_SET_MM_MAP +#ifdef PR_SET_MM_MAP_SIZE + { "PR_SET_MM_MAP_SIZE", (unsigned long) PR_SET_MM_MAP_SIZE }, +#endif // PR_SET_MM_MAP_SIZE #ifdef PR_SET_MM_START_BRK - {"PR_SET_MM_START_BRK", (unsigned long)PR_SET_MM_START_BRK}, + { "PR_SET_MM_START_BRK", (unsigned long) PR_SET_MM_START_BRK }, #endif // PR_SET_MM_START_BRK #ifdef PR_SET_MM_START_CODE - {"PR_SET_MM_START_CODE", (unsigned long)PR_SET_MM_START_CODE}, + { "PR_SET_MM_START_CODE", (unsigned long) PR_SET_MM_START_CODE }, #endif // PR_SET_MM_START_CODE #ifdef PR_SET_MM_START_DATA - {"PR_SET_MM_START_DATA", (unsigned long)PR_SET_MM_START_DATA}, + { "PR_SET_MM_START_DATA", (unsigned long) PR_SET_MM_START_DATA }, #endif // PR_SET_MM_START_DATA #ifdef PR_SET_MM_START_STACK - {"PR_SET_MM_START_STACK", (unsigned long)PR_SET_MM_START_STACK}, + { "PR_SET_MM_START_STACK", (unsigned long) PR_SET_MM_START_STACK }, #endif // PR_SET_MM_START_STACK #ifdef PR_SET_NAME - {"PR_SET_NAME", (unsigned long)PR_SET_NAME}, + { "PR_SET_NAME", (unsigned long) PR_SET_NAME }, #endif // PR_SET_NAME #ifdef PR_SET_NO_NEW_PRIVS - {"PR_SET_NO_NEW_PRIVS", (unsigned long)PR_SET_NO_NEW_PRIVS}, + { "PR_SET_NO_NEW_PRIVS", (unsigned long) PR_SET_NO_NEW_PRIVS }, #endif // PR_SET_NO_NEW_PRIVS #ifdef PR_SET_PDEATHSIG - {"PR_SET_PDEATHSIG", (unsigned long)PR_SET_PDEATHSIG}, + { "PR_SET_PDEATHSIG", (unsigned long) PR_SET_PDEATHSIG }, #endif // PR_SET_PDEATHSIG #ifdef PR_SET_PTRACER - {"PR_SET_PTRACER", (unsigned long)PR_SET_PTRACER}, + { "PR_SET_PTRACER", (unsigned long) PR_SET_PTRACER }, #endif // PR_SET_PTRACER #ifdef PR_SET_SECCOMP - {"PR_SET_SECCOMP", (unsigned long)PR_SET_SECCOMP}, + { "PR_SET_SECCOMP", (unsigned long) PR_SET_SECCOMP }, #endif // PR_SET_SECCOMP #ifdef PR_SET_SECUREBITS - {"PR_SET_SECUREBITS", (unsigned long)PR_SET_SECUREBITS}, + { "PR_SET_SECUREBITS", (unsigned long) PR_SET_SECUREBITS }, #endif // PR_SET_SECUREBITS +#ifdef PR_SET_SPECULATION_CTRL + { "PR_SET_SPECULATION_CTRL", (unsigned long) PR_SET_SPECULATION_CTRL }, +#endif // PR_SET_SPECULATION_CTRL +#ifdef PR_SET_TAGGED_ADDR_CTRL + { "PR_SET_TAGGED_ADDR_CTRL", (unsigned long) PR_SET_TAGGED_ADDR_CTRL }, +#endif // PR_SET_TAGGED_ADDR_CTRL +#ifdef PR_SET_THP_DISABLE + { "PR_SET_THP_DISABLE", (unsigned long) PR_SET_THP_DISABLE }, +#endif // PR_SET_THP_DISABLE #ifdef PR_SET_TIMERSLACK - {"PR_SET_TIMERSLACK", (unsigned long)PR_SET_TIMERSLACK}, + { "PR_SET_TIMERSLACK", (unsigned long) PR_SET_TIMERSLACK }, #endif // PR_SET_TIMERSLACK #ifdef PR_SET_TIMING - {"PR_SET_TIMING", (unsigned long)PR_SET_TIMING}, + { "PR_SET_TIMING", (unsigned long) PR_SET_TIMING }, #endif // PR_SET_TIMING #ifdef PR_SET_TSC - {"PR_SET_TSC", (unsigned long)PR_SET_TSC}, + { "PR_SET_TSC", (unsigned long) PR_SET_TSC }, #endif // PR_SET_TSC #ifdef PR_SET_UNALIGN - {"PR_SET_UNALIGN", (unsigned long)PR_SET_UNALIGN}, + { "PR_SET_UNALIGN", (unsigned long) PR_SET_UNALIGN }, #endif // PR_SET_UNALIGN +#ifdef PR_SPEC_INDIRECT_BRANCH + { "PR_SPEC_INDIRECT_BRANCH", (unsigned long) PR_SPEC_INDIRECT_BRANCH }, +#endif // PR_SPEC_INDIRECT_BRANCH +#ifdef PR_SPEC_NOT_AFFECTED + { "PR_SPEC_NOT_AFFECTED", (unsigned long) PR_SPEC_NOT_AFFECTED }, +#endif // PR_SPEC_NOT_AFFECTED +#ifdef PR_SPEC_STORE_BYPASS + { "PR_SPEC_STORE_BYPASS", (unsigned long) PR_SPEC_STORE_BYPASS }, +#endif // PR_SPEC_STORE_BYPASS +#ifdef PR_SVE_GET_VL + { "PR_SVE_GET_VL", (unsigned long) PR_SVE_GET_VL }, +#endif // PR_SVE_GET_VL +#ifdef PR_SVE_SET_VL + { "PR_SVE_SET_VL", (unsigned long) PR_SVE_SET_VL }, +#endif // PR_SVE_SET_VL +#ifdef PR_SVE_VL_LEN_MASK + { "PR_SVE_VL_LEN_MASK", (unsigned long) PR_SVE_VL_LEN_MASK }, +#endif // PR_SVE_VL_LEN_MASK #ifdef PR_TASK_PERF_EVENTS_DISABLE - {"PR_TASK_PERF_EVENTS_DISABLE", (unsigned long)PR_TASK_PERF_EVENTS_DISABLE}, + { "PR_TASK_PERF_EVENTS_DISABLE", (unsigned long) PR_TASK_PERF_EVENTS_DISABLE }, #endif // PR_TASK_PERF_EVENTS_DISABLE #ifdef PR_TASK_PERF_EVENTS_ENABLE - {"PR_TASK_PERF_EVENTS_ENABLE", (unsigned long)PR_TASK_PERF_EVENTS_ENABLE}, + { "PR_TASK_PERF_EVENTS_ENABLE", (unsigned long) PR_TASK_PERF_EVENTS_ENABLE }, #endif // PR_TASK_PERF_EVENTS_ENABLE #ifdef PR_TIMING_STATISTICAL - {"PR_TIMING_STATISTICAL", (unsigned long)PR_TIMING_STATISTICAL}, + { "PR_TIMING_STATISTICAL", (unsigned long) PR_TIMING_STATISTICAL }, #endif // PR_TIMING_STATISTICAL #ifdef PR_TIMING_TIMESTAMP - {"PR_TIMING_TIMESTAMP", (unsigned long)PR_TIMING_TIMESTAMP}, + { "PR_TIMING_TIMESTAMP", (unsigned long) PR_TIMING_TIMESTAMP }, #endif // PR_TIMING_TIMESTAMP #ifdef PR_TSC_ENABLE - {"PR_TSC_ENABLE", (unsigned long)PR_TSC_ENABLE}, + { "PR_TSC_ENABLE", (unsigned long) PR_TSC_ENABLE }, #endif // PR_TSC_ENABLE #ifdef PR_TSC_SIGSEGV - {"PR_TSC_SIGSEGV", (unsigned long)PR_TSC_SIGSEGV}, + { "PR_TSC_SIGSEGV", (unsigned long) PR_TSC_SIGSEGV }, #endif // PR_TSC_SIGSEGV #ifdef PR_UNALIGN_NOPRINT - {"PR_UNALIGN_NOPRINT", (unsigned long)PR_UNALIGN_NOPRINT}, + { "PR_UNALIGN_NOPRINT", (unsigned long) PR_UNALIGN_NOPRINT }, #endif // PR_UNALIGN_NOPRINT #ifdef PR_UNALIGN_SIGBUS - {"PR_UNALIGN_SIGBUS", (unsigned long)PR_UNALIGN_SIGBUS}, + { "PR_UNALIGN_SIGBUS", (unsigned long) PR_UNALIGN_SIGBUS }, #endif // PR_UNALIGN_SIGBUS +#ifdef RLIMIT_AS + { "RLIMIT_AS", (unsigned long) RLIMIT_AS }, +#endif // RLIMIT_AS +#ifdef RLIMIT_CORE + { "RLIMIT_CORE", (unsigned long) RLIMIT_CORE }, +#endif // RLIMIT_CORE +#ifdef RLIMIT_CPU + { "RLIMIT_CPU", (unsigned long) RLIMIT_CPU }, +#endif // RLIMIT_CPU +#ifdef RLIMIT_DATA + { "RLIMIT_DATA", (unsigned long) RLIMIT_DATA }, +#endif // RLIMIT_DATA +#ifdef RLIMIT_FSIZE + { "RLIMIT_FSIZE", (unsigned long) RLIMIT_FSIZE }, +#endif // RLIMIT_FSIZE +#ifdef RLIMIT_LOCKS + { "RLIMIT_LOCKS", (unsigned long) RLIMIT_LOCKS }, +#endif // RLIMIT_LOCKS +#ifdef RLIMIT_MEMLOCK + { "RLIMIT_MEMLOCK", (unsigned long) RLIMIT_MEMLOCK }, +#endif // RLIMIT_MEMLOCK +#ifdef RLIMIT_MSGQUEUE + { "RLIMIT_MSGQUEUE", (unsigned long) RLIMIT_MSGQUEUE }, +#endif // RLIMIT_MSGQUEUE +#ifdef RLIMIT_NICE + { "RLIMIT_NICE", (unsigned long) RLIMIT_NICE }, +#endif // RLIMIT_NICE +#ifdef RLIMIT_NLIMITS + { "RLIMIT_NLIMITS", (unsigned long) RLIMIT_NLIMITS }, +#endif // RLIMIT_NLIMITS +#ifdef RLIMIT_NOFILE + { "RLIMIT_NOFILE", (unsigned long) RLIMIT_NOFILE }, +#endif // RLIMIT_NOFILE +#ifdef RLIMIT_NPROC + { "RLIMIT_NPROC", (unsigned long) RLIMIT_NPROC }, +#endif // RLIMIT_NPROC +#ifdef RLIMIT_OFILE + { "RLIMIT_OFILE", (unsigned long) RLIMIT_OFILE }, +#endif // RLIMIT_OFILE +#ifdef RLIMIT_RSS + { "RLIMIT_RSS", (unsigned long) RLIMIT_RSS }, +#endif // RLIMIT_RSS +#ifdef RLIMIT_RTPRIO + { "RLIMIT_RTPRIO", (unsigned long) RLIMIT_RTPRIO }, +#endif // RLIMIT_RTPRIO +#ifdef RLIMIT_RTTIME + { "RLIMIT_RTTIME", (unsigned long) RLIMIT_RTTIME }, +#endif // RLIMIT_RTTIME +#ifdef RLIMIT_SIGPENDING + { "RLIMIT_SIGPENDING", (unsigned long) RLIMIT_SIGPENDING }, +#endif // RLIMIT_SIGPENDING +#ifdef RLIMIT_STACK + { "RLIMIT_STACK", (unsigned long) RLIMIT_STACK }, +#endif // RLIMIT_STACK +#ifdef RLIM_NLIMITS + { "RLIM_NLIMITS", (unsigned long) RLIM_NLIMITS }, +#endif // RLIM_NLIMITS +#ifdef RLIM_SAVED_CUR + { "RLIM_SAVED_CUR", (unsigned long) RLIM_SAVED_CUR }, +#endif // RLIM_SAVED_CUR +#ifdef RLIM_SAVED_MAX + { "RLIM_SAVED_MAX", (unsigned long) RLIM_SAVED_MAX }, +#endif // RLIM_SAVED_MAX #ifdef R_OK - {"R_OK", (unsigned long)R_OK}, + { "R_OK", (unsigned long) R_OK }, #endif // R_OK +#ifdef RTSXOFF + { "RTSXOFF", (unsigned long) RTSXOFF }, +#endif // RTSXOFF +#ifdef RUSAGE_CHILDREN + { "RUSAGE_CHILDREN", (unsigned long) RUSAGE_CHILDREN }, +#endif // RUSAGE_CHILDREN +#ifdef RUSAGE_SELF + { "RUSAGE_SELF", (unsigned long) RUSAGE_SELF }, +#endif // RUSAGE_SELF #ifdef SA_INTERRUPT - {"SA_INTERRUPT", (unsigned long)SA_INTERRUPT}, + { "SA_INTERRUPT", (unsigned long) SA_INTERRUPT }, #endif // SA_INTERRUPT #ifdef SA_NOCLDSTOP - {"SA_NOCLDSTOP", (unsigned long)SA_NOCLDSTOP}, + { "SA_NOCLDSTOP", (unsigned long) SA_NOCLDSTOP }, #endif // SA_NOCLDSTOP #ifdef SA_NOCLDWAIT - {"SA_NOCLDWAIT", (unsigned long)SA_NOCLDWAIT}, + { "SA_NOCLDWAIT", (unsigned long) SA_NOCLDWAIT }, #endif // SA_NOCLDWAIT #ifdef SA_NODEFER - {"SA_NODEFER", (unsigned long)SA_NODEFER}, + { "SA_NODEFER", (unsigned long) SA_NODEFER }, #endif // SA_NODEFER #ifdef SA_NOMASK - {"SA_NOMASK", (unsigned long)SA_NOMASK}, + { "SA_NOMASK", (unsigned long) SA_NOMASK }, #endif // SA_NOMASK #ifdef SA_ONESHOT - {"SA_ONESHOT", (unsigned long)SA_ONESHOT}, + { "SA_ONESHOT", (unsigned long) SA_ONESHOT }, #endif // SA_ONESHOT #ifdef SA_ONSTACK - {"SA_ONSTACK", (unsigned long)SA_ONSTACK}, + { "SA_ONSTACK", (unsigned long) SA_ONSTACK }, #endif // SA_ONSTACK #ifdef SA_RESETHAND - {"SA_RESETHAND", (unsigned long)SA_RESETHAND}, + { "SA_RESETHAND", (unsigned long) SA_RESETHAND }, #endif // SA_RESETHAND #ifdef SA_RESTART - {"SA_RESTART", (unsigned long)SA_RESTART}, + { "SA_RESTART", (unsigned long) SA_RESTART }, #endif // SA_RESTART #ifdef SA_SIGINFO - {"SA_SIGINFO", (unsigned long)SA_SIGINFO}, + { "SA_SIGINFO", (unsigned long) SA_SIGINFO }, #endif // SA_SIGINFO #ifdef SA_STACK - {"SA_STACK", (unsigned long)SA_STACK}, + { "SA_STACK", (unsigned long) SA_STACK }, #endif // SA_STACK #ifdef S_BLKSIZE - {"S_BLKSIZE", (unsigned long)S_BLKSIZE}, + { "S_BLKSIZE", (unsigned long) S_BLKSIZE }, #endif // S_BLKSIZE #ifdef SCHED_BATCH - {"SCHED_BATCH", (unsigned long)SCHED_BATCH}, + { "SCHED_BATCH", (unsigned long) SCHED_BATCH }, #endif // SCHED_BATCH +#ifdef SCHED_DEADLINE + { "SCHED_DEADLINE", (unsigned long) SCHED_DEADLINE }, +#endif // SCHED_DEADLINE #ifdef SCHED_FIFO - {"SCHED_FIFO", (unsigned long)SCHED_FIFO}, + { "SCHED_FIFO", (unsigned long) SCHED_FIFO }, #endif // SCHED_FIFO +#ifdef SCHED_FLAG_DL_OVERRUN + { "SCHED_FLAG_DL_OVERRUN", (unsigned long) SCHED_FLAG_DL_OVERRUN }, +#endif // SCHED_FLAG_DL_OVERRUN +#ifdef SCHED_FLAG_KEEP_PARAMS + { "SCHED_FLAG_KEEP_PARAMS", (unsigned long) SCHED_FLAG_KEEP_PARAMS }, +#endif // SCHED_FLAG_KEEP_PARAMS +#ifdef SCHED_FLAG_KEEP_POLICY + { "SCHED_FLAG_KEEP_POLICY", (unsigned long) SCHED_FLAG_KEEP_POLICY }, +#endif // SCHED_FLAG_KEEP_POLICY +#ifdef SCHED_FLAG_RECLAIM + { "SCHED_FLAG_RECLAIM", (unsigned long) SCHED_FLAG_RECLAIM }, +#endif // SCHED_FLAG_RECLAIM +#ifdef SCHED_FLAG_RESET_ON_FORK + { "SCHED_FLAG_RESET_ON_FORK", (unsigned long) SCHED_FLAG_RESET_ON_FORK }, +#endif // SCHED_FLAG_RESET_ON_FORK +#ifdef SCHED_FLAG_UTIL_CLAMP_MAX + { "SCHED_FLAG_UTIL_CLAMP_MAX", (unsigned long) SCHED_FLAG_UTIL_CLAMP_MAX }, +#endif // SCHED_FLAG_UTIL_CLAMP_MAX +#ifdef SCHED_FLAG_UTIL_CLAMP_MIN + { "SCHED_FLAG_UTIL_CLAMP_MIN", (unsigned long) SCHED_FLAG_UTIL_CLAMP_MIN }, +#endif // SCHED_FLAG_UTIL_CLAMP_MIN #ifdef SCHED_IDLE - {"SCHED_IDLE", (unsigned long)SCHED_IDLE}, + { "SCHED_IDLE", (unsigned long) SCHED_IDLE }, #endif // SCHED_IDLE #ifdef SCHED_NORMAL - {"SCHED_NORMAL", (unsigned long)SCHED_NORMAL}, + { "SCHED_NORMAL", (unsigned long) SCHED_NORMAL }, #endif // SCHED_NORMAL #ifdef SCHED_RESET_ON_FORK - {"SCHED_RESET_ON_FORK", (unsigned long)SCHED_RESET_ON_FORK}, + { "SCHED_RESET_ON_FORK", (unsigned long) SCHED_RESET_ON_FORK }, #endif // SCHED_RESET_ON_FORK #ifdef SCHED_RR - {"SCHED_RR", (unsigned long)SCHED_RR}, + { "SCHED_RR", (unsigned long) SCHED_RR }, #endif // SCHED_RR +#ifdef SCM_RIGHTS + { "SCM_RIGHTS", (unsigned long) SCM_RIGHTS }, +#endif // SCM_RIGHTS +#ifdef SCM_TIMESTAMPING_OPT_STATS + { "SCM_TIMESTAMPING_OPT_STATS", (unsigned long) SCM_TIMESTAMPING_OPT_STATS }, +#endif // SCM_TIMESTAMPING_OPT_STATS +#ifdef SCM_TIMESTAMPING_PKTINFO + { "SCM_TIMESTAMPING_PKTINFO", (unsigned long) SCM_TIMESTAMPING_PKTINFO }, +#endif // SCM_TIMESTAMPING_PKTINFO +#ifdef SCM_TIMESTAMPING + { "SCM_TIMESTAMPING", (unsigned long) SCM_TIMESTAMPING }, +#endif // SCM_TIMESTAMPING +#ifdef SCM_TIMESTAMPNS + { "SCM_TIMESTAMPNS", (unsigned long) SCM_TIMESTAMPNS }, +#endif // SCM_TIMESTAMPNS +#ifdef SCM_TIMESTAMP + { "SCM_TIMESTAMP", (unsigned long) SCM_TIMESTAMP }, +#endif // SCM_TIMESTAMP +#ifdef SCM_TXTIME + { "SCM_TXTIME", (unsigned long) SCM_TXTIME }, +#endif // SCM_TXTIME +#ifdef SCM_WIFI_STATUS + { "SCM_WIFI_STATUS", (unsigned long) SCM_WIFI_STATUS }, +#endif // SCM_WIFI_STATUS #ifdef SEEK_CUR - {"SEEK_CUR", (unsigned long)SEEK_CUR}, + { "SEEK_CUR", (unsigned long) SEEK_CUR }, #endif // SEEK_CUR +#ifdef SEEK_DATA + { "SEEK_DATA", (unsigned long) SEEK_DATA }, +#endif // SEEK_DATA #ifdef SEEK_END - {"SEEK_END", (unsigned long)SEEK_END}, + { "SEEK_END", (unsigned long) SEEK_END }, #endif // SEEK_END +#ifdef SEEK_HOLE + { "SEEK_HOLE", (unsigned long) SEEK_HOLE }, +#endif // SEEK_HOLE +#ifdef SEEK_MAX + { "SEEK_MAX", (unsigned long) SEEK_MAX }, +#endif // SEEK_MAX #ifdef SEEK_SET - {"SEEK_SET", (unsigned long)SEEK_SET}, + { "SEEK_SET", (unsigned long) SEEK_SET }, #endif // SEEK_SET +#ifdef SEGV_ACCADI + { "SEGV_ACCADI", (unsigned long) SEGV_ACCADI }, +#endif // SEGV_ACCADI #ifdef SEGV_ACCERR - {"SEGV_ACCERR", (unsigned long)SEGV_ACCERR}, + { "SEGV_ACCERR", (unsigned long) SEGV_ACCERR }, #endif // SEGV_ACCERR +#ifdef SEGV_ADIDERR + { "SEGV_ADIDERR", (unsigned long) SEGV_ADIDERR }, +#endif // SEGV_ADIDERR +#ifdef SEGV_ADIPERR + { "SEGV_ADIPERR", (unsigned long) SEGV_ADIPERR }, +#endif // SEGV_ADIPERR +#ifdef SEGV_BNDERR + { "SEGV_BNDERR", (unsigned long) SEGV_BNDERR }, +#endif // SEGV_BNDERR #ifdef SEGV_MAPERR - {"SEGV_MAPERR", (unsigned long)SEGV_MAPERR}, + { "SEGV_MAPERR", (unsigned long) SEGV_MAPERR }, #endif // SEGV_MAPERR +#ifdef SEGV_PKUERR + { "SEGV_PKUERR", (unsigned long) SEGV_PKUERR }, +#endif // SEGV_PKUERR +#ifdef SERIAL_IO_AU + { "SERIAL_IO_AU", (unsigned long) SERIAL_IO_AU }, +#endif // SERIAL_IO_AU +#ifdef SERIAL_IO_HUB6 + { "SERIAL_IO_HUB6", (unsigned long) SERIAL_IO_HUB6 }, +#endif // SERIAL_IO_HUB6 +#ifdef SERIAL_IO_MEM16 + { "SERIAL_IO_MEM16", (unsigned long) SERIAL_IO_MEM16 }, +#endif // SERIAL_IO_MEM16 +#ifdef SERIAL_IO_MEM + { "SERIAL_IO_MEM", (unsigned long) SERIAL_IO_MEM }, +#endif // SERIAL_IO_MEM +#ifdef SERIAL_IO_MEM32 + { "SERIAL_IO_MEM32", (unsigned long) SERIAL_IO_MEM32 }, +#endif // SERIAL_IO_MEM32 +#ifdef SERIAL_IO_MEM32BE + { "SERIAL_IO_MEM32BE", (unsigned long) SERIAL_IO_MEM32BE }, +#endif // SERIAL_IO_MEM32BE +#ifdef SERIAL_IO_PORT + { "SERIAL_IO_PORT", (unsigned long) SERIAL_IO_PORT }, +#endif // SERIAL_IO_PORT +#ifdef SERIAL_IO_TSI + { "SERIAL_IO_TSI", (unsigned long) SERIAL_IO_TSI }, +#endif // SERIAL_IO_TSI +#ifdef SHUT_RD + { "SHUT_RD", (unsigned long) SHUT_RD }, +#endif // SHUT_RD +#ifdef SHUT_RDWR + { "SHUT_RDWR", (unsigned long) SHUT_RDWR }, +#endif // SHUT_RDWR +#ifdef SHUT_WR + { "SHUT_WR", (unsigned long) SHUT_WR }, +#endif // SHUT_WR #ifdef SI_ASYNCIO - {"SI_ASYNCIO", (unsigned long)SI_ASYNCIO}, + { "SI_ASYNCIO", (unsigned long) SI_ASYNCIO }, #endif // SI_ASYNCIO #ifdef SI_ASYNCNL - {"SI_ASYNCNL", (unsigned long)SI_ASYNCNL}, + { "SI_ASYNCNL", (unsigned long) SI_ASYNCNL }, #endif // SI_ASYNCNL +#ifdef SI_DETHREAD + { "SI_DETHREAD", (unsigned long) SI_DETHREAD }, +#endif // SI_DETHREAD #ifdef S_IEXEC - {"S_IEXEC", (unsigned long)S_IEXEC}, + { "S_IEXEC", (unsigned long) S_IEXEC }, #endif // S_IEXEC +#ifdef S_IFBLK + { "S_IFBLK", (unsigned long) S_IFBLK }, +#endif // S_IFBLK +#ifdef S_IFCHR + { "S_IFCHR", (unsigned long) S_IFCHR }, +#endif // S_IFCHR +#ifdef S_IFDIR + { "S_IFDIR", (unsigned long) S_IFDIR }, +#endif // S_IFDIR +#ifdef S_IFIFO + { "S_IFIFO", (unsigned long) S_IFIFO }, +#endif // S_IFIFO +#ifdef S_IFLNK + { "S_IFLNK", (unsigned long) S_IFLNK }, +#endif // S_IFLNK +#ifdef S_IFMT + { "S_IFMT", (unsigned long) S_IFMT }, +#endif // S_IFMT +#ifdef S_IFREG + { "S_IFREG", (unsigned long) S_IFREG }, +#endif // S_IFREG +#ifdef S_IFSOCK + { "S_IFSOCK", (unsigned long) S_IFSOCK }, +#endif // S_IFSOCK #ifdef SIGABRT - {"SIGABRT", (unsigned long)SIGABRT}, + { "SIGABRT", (unsigned long) SIGABRT }, #endif // SIGABRT #ifdef SIGALRM - {"SIGALRM", (unsigned long)SIGALRM}, + { "SIGALRM", (unsigned long) SIGALRM }, #endif // SIGALRM #ifdef SIGBUS - {"SIGBUS", (unsigned long)SIGBUS}, + { "SIGBUS", (unsigned long) SIGBUS }, +#endif // SIGBUS +#ifdef SIGBUS + { "SIGBUS", (unsigned long) SIGBUS }, #endif // SIGBUS #ifdef SIGCHLD - {"SIGCHLD", (unsigned long)SIGCHLD}, + { "SIGCHLD", (unsigned long) SIGCHLD }, +#endif // SIGCHLD +#ifdef SIGCHLD + { "SIGCHLD", (unsigned long) SIGCHLD }, #endif // SIGCHLD #ifdef SIGCLD - {"SIGCLD", (unsigned long)SIGCLD}, + { "SIGCLD", (unsigned long) SIGCLD }, #endif // SIGCLD #ifdef SIGCONT - {"SIGCONT", (unsigned long)SIGCONT}, + { "SIGCONT", (unsigned long) SIGCONT }, +#endif // SIGCONT +#ifdef SIGCONT + { "SIGCONT", (unsigned long) SIGCONT }, #endif // SIGCONT #ifdef SIGEV_NONE - {"SIGEV_NONE", (unsigned long)SIGEV_NONE}, + { "SIGEV_NONE", (unsigned long) SIGEV_NONE }, #endif // SIGEV_NONE #ifdef SIGEV_SIGNAL - {"SIGEV_SIGNAL", (unsigned long)SIGEV_SIGNAL}, + { "SIGEV_SIGNAL", (unsigned long) SIGEV_SIGNAL }, #endif // SIGEV_SIGNAL #ifdef SIGEV_THREAD_ID - {"SIGEV_THREAD_ID", (unsigned long)SIGEV_THREAD_ID}, + { "SIGEV_THREAD_ID", (unsigned long) SIGEV_THREAD_ID }, #endif // SIGEV_THREAD_ID #ifdef SIGEV_THREAD - {"SIGEV_THREAD", (unsigned long)SIGEV_THREAD}, + { "SIGEV_THREAD", (unsigned long) SIGEV_THREAD }, #endif // SIGEV_THREAD #ifdef SIGFPE - {"SIGFPE", (unsigned long)SIGFPE}, + { "SIGFPE", (unsigned long) SIGFPE }, #endif // SIGFPE #ifdef SIGHUP - {"SIGHUP", (unsigned long)SIGHUP}, + { "SIGHUP", (unsigned long) SIGHUP }, #endif // SIGHUP #ifdef SIGILL - {"SIGILL", (unsigned long)SIGILL}, + { "SIGILL", (unsigned long) SIGILL }, #endif // SIGILL #ifdef SIGINT - {"SIGINT", (unsigned long)SIGINT}, + { "SIGINT", (unsigned long) SIGINT }, #endif // SIGINT #ifdef SIGIO - {"SIGIO", (unsigned long)SIGIO}, + { "SIGIO", (unsigned long) SIGIO }, #endif // SIGIO #ifdef SIGIOT - {"SIGIOT", (unsigned long)SIGIOT}, + { "SIGIOT", (unsigned long) SIGIOT }, #endif // SIGIOT #ifdef SIGKILL - {"SIGKILL", (unsigned long)SIGKILL}, + { "SIGKILL", (unsigned long) SIGKILL }, #endif // SIGKILL #ifdef SIGPIPE - {"SIGPIPE", (unsigned long)SIGPIPE}, + { "SIGPIPE", (unsigned long) SIGPIPE }, #endif // SIGPIPE #ifdef SIGPOLL - {"SIGPOLL", (unsigned long)SIGPOLL}, + { "SIGPOLL", (unsigned long) SIGPOLL }, +#endif // SIGPOLL +#ifdef SIGPOLL + { "SIGPOLL", (unsigned long) SIGPOLL }, #endif // SIGPOLL #ifdef SIGPROF - {"SIGPROF", (unsigned long)SIGPROF}, + { "SIGPROF", (unsigned long) SIGPROF }, #endif // SIGPROF #ifdef SIGPWR - {"SIGPWR", (unsigned long)SIGPWR}, + { "SIGPWR", (unsigned long) SIGPWR }, #endif // SIGPWR #ifdef SIGQUIT - {"SIGQUIT", (unsigned long)SIGQUIT}, + { "SIGQUIT", (unsigned long) SIGQUIT }, #endif // SIGQUIT #ifdef SIGSEGV - {"SIGSEGV", (unsigned long)SIGSEGV}, + { "SIGSEGV", (unsigned long) SIGSEGV }, #endif // SIGSEGV #ifdef SIGSTKFLT - {"SIGSTKFLT", (unsigned long)SIGSTKFLT}, + { "SIGSTKFLT", (unsigned long) SIGSTKFLT }, #endif // SIGSTKFLT #ifdef SIGSTKSZ - {"SIGSTKSZ", (unsigned long)SIGSTKSZ}, + { "SIGSTKSZ", (unsigned long) SIGSTKSZ }, #endif // SIGSTKSZ #ifdef SIGSTOP - {"SIGSTOP", (unsigned long)SIGSTOP}, + { "SIGSTOP", (unsigned long) SIGSTOP }, #endif // SIGSTOP +#ifdef SIGSTOP + { "SIGSTOP", (unsigned long) SIGSTOP }, +#endif // SIGSTOP +#ifdef SIGSYS + { "SIGSYS", (unsigned long) SIGSYS }, +#endif // SIGSYS #ifdef SIGSYS - {"SIGSYS", (unsigned long)SIGSYS}, + { "SIGSYS", (unsigned long) SIGSYS }, #endif // SIGSYS #ifdef SIGTERM - {"SIGTERM", (unsigned long)SIGTERM}, + { "SIGTERM", (unsigned long) SIGTERM }, #endif // SIGTERM #ifdef SIGTRAP - {"SIGTRAP", (unsigned long)SIGTRAP}, + { "SIGTRAP", (unsigned long) SIGTRAP }, #endif // SIGTRAP #ifdef SIGTSTP - {"SIGTSTP", (unsigned long)SIGTSTP}, + { "SIGTSTP", (unsigned long) SIGTSTP }, +#endif // SIGTSTP +#ifdef SIGTSTP + { "SIGTSTP", (unsigned long) SIGTSTP }, #endif // SIGTSTP #ifdef SIGTTIN - {"SIGTTIN", (unsigned long)SIGTTIN}, + { "SIGTTIN", (unsigned long) SIGTTIN }, #endif // SIGTTIN #ifdef SIGTTOU - {"SIGTTOU", (unsigned long)SIGTTOU}, + { "SIGTTOU", (unsigned long) SIGTTOU }, #endif // SIGTTOU -#ifdef SIGUNUSED - {"SIGUNUSED", (unsigned long)SIGUNUSED}, -#endif // SIGUNUSED #ifdef SIGURG - {"SIGURG", (unsigned long)SIGURG}, + { "SIGURG", (unsigned long) SIGURG }, #endif // SIGURG +#ifdef SIGURG + { "SIGURG", (unsigned long) SIGURG }, +#endif // SIGURG +#ifdef SIGUSR1 + { "SIGUSR1", (unsigned long) SIGUSR1 }, +#endif // SIGUSR1 #ifdef SIGUSR1 - {"SIGUSR1", (unsigned long)SIGUSR1}, + { "SIGUSR1", (unsigned long) SIGUSR1 }, #endif // SIGUSR1 #ifdef SIGUSR2 - {"SIGUSR2", (unsigned long)SIGUSR2}, + { "SIGUSR2", (unsigned long) SIGUSR2 }, +#endif // SIGUSR2 +#ifdef SIGUSR2 + { "SIGUSR2", (unsigned long) SIGUSR2 }, #endif // SIGUSR2 #ifdef SIGVTALRM - {"SIGVTALRM", (unsigned long)SIGVTALRM}, + { "SIGVTALRM", (unsigned long) SIGVTALRM }, #endif // SIGVTALRM #ifdef SIGWINCH - {"SIGWINCH", (unsigned long)SIGWINCH}, + { "SIGWINCH", (unsigned long) SIGWINCH }, #endif // SIGWINCH #ifdef SIGXCPU - {"SIGXCPU", (unsigned long)SIGXCPU}, + { "SIGXCPU", (unsigned long) SIGXCPU }, #endif // SIGXCPU #ifdef SIGXFSZ - {"SIGXFSZ", (unsigned long)SIGXFSZ}, + { "SIGXFSZ", (unsigned long) SIGXFSZ }, #endif // SIGXFSZ #ifdef SI_KERNEL - {"SI_KERNEL", (unsigned long)SI_KERNEL}, + { "SI_KERNEL", (unsigned long) SI_KERNEL }, #endif // SI_KERNEL #ifdef SI_MESGQ - {"SI_MESGQ", (unsigned long)SI_MESGQ}, + { "SI_MESGQ", (unsigned long) SI_MESGQ }, #endif // SI_MESGQ +#ifdef SIOCADDDLCI + { "SIOCADDDLCI", (unsigned long) SIOCADDDLCI }, +#endif // SIOCADDDLCI +#ifdef SIOCADDMULTI + { "SIOCADDMULTI", (unsigned long) SIOCADDMULTI }, +#endif // SIOCADDMULTI +#ifdef SIOCADDRT + { "SIOCADDRT", (unsigned long) SIOCADDRT }, +#endif // SIOCADDRT +#ifdef SIOCATMARK + { "SIOCATMARK", (unsigned long) SIOCATMARK }, +#endif // SIOCATMARK +#ifdef SIOCBONDCHANGEACTIVE + { "SIOCBONDCHANGEACTIVE", (unsigned long) SIOCBONDCHANGEACTIVE }, +#endif // SIOCBONDCHANGEACTIVE +#ifdef SIOCBONDENSLAVE + { "SIOCBONDENSLAVE", (unsigned long) SIOCBONDENSLAVE }, +#endif // SIOCBONDENSLAVE +#ifdef SIOCBONDINFOQUERY + { "SIOCBONDINFOQUERY", (unsigned long) SIOCBONDINFOQUERY }, +#endif // SIOCBONDINFOQUERY +#ifdef SIOCBONDRELEASE + { "SIOCBONDRELEASE", (unsigned long) SIOCBONDRELEASE }, +#endif // SIOCBONDRELEASE +#ifdef SIOCBONDSETHWADDR + { "SIOCBONDSETHWADDR", (unsigned long) SIOCBONDSETHWADDR }, +#endif // SIOCBONDSETHWADDR +#ifdef SIOCBONDSLAVEINFOQUERY + { "SIOCBONDSLAVEINFOQUERY", (unsigned long) SIOCBONDSLAVEINFOQUERY }, +#endif // SIOCBONDSLAVEINFOQUERY +#ifdef SIOCBRADDBR + { "SIOCBRADDBR", (unsigned long) SIOCBRADDBR }, +#endif // SIOCBRADDBR +#ifdef SIOCBRADDIF + { "SIOCBRADDIF", (unsigned long) SIOCBRADDIF }, +#endif // SIOCBRADDIF +#ifdef SIOCBRDELBR + { "SIOCBRDELBR", (unsigned long) SIOCBRDELBR }, +#endif // SIOCBRDELBR +#ifdef SIOCBRDELIF + { "SIOCBRDELIF", (unsigned long) SIOCBRDELIF }, +#endif // SIOCBRDELIF +#ifdef SIOCDARP + { "SIOCDARP", (unsigned long) SIOCDARP }, +#endif // SIOCDARP +#ifdef SIOCDELDLCI + { "SIOCDELDLCI", (unsigned long) SIOCDELDLCI }, +#endif // SIOCDELDLCI +#ifdef SIOCDELMULTI + { "SIOCDELMULTI", (unsigned long) SIOCDELMULTI }, +#endif // SIOCDELMULTI +#ifdef SIOCDELRT + { "SIOCDELRT", (unsigned long) SIOCDELRT }, +#endif // SIOCDELRT +#ifdef SIOCDEVPRIVATE + { "SIOCDEVPRIVATE", (unsigned long) SIOCDEVPRIVATE }, +#endif // SIOCDEVPRIVATE +#ifdef SIOCDIFADDR + { "SIOCDIFADDR", (unsigned long) SIOCDIFADDR }, +#endif // SIOCDIFADDR +#ifdef SIOCDRARP + { "SIOCDRARP", (unsigned long) SIOCDRARP }, +#endif // SIOCDRARP +#ifdef SIOCETHTOOL + { "SIOCETHTOOL", (unsigned long) SIOCETHTOOL }, +#endif // SIOCETHTOOL +#ifdef SIOCGARP + { "SIOCGARP", (unsigned long) SIOCGARP }, +#endif // SIOCGARP +#ifdef SIOCGHWTSTAMP + { "SIOCGHWTSTAMP", (unsigned long) SIOCGHWTSTAMP }, +#endif // SIOCGHWTSTAMP +#ifdef SIOCGIFADDR + { "SIOCGIFADDR", (unsigned long) SIOCGIFADDR }, +#endif // SIOCGIFADDR +#ifdef SIOCGIFBR + { "SIOCGIFBR", (unsigned long) SIOCGIFBR }, +#endif // SIOCGIFBR +#ifdef SIOCGIFBRDADDR + { "SIOCGIFBRDADDR", (unsigned long) SIOCGIFBRDADDR }, +#endif // SIOCGIFBRDADDR +#ifdef SIOCGIFCONF + { "SIOCGIFCONF", (unsigned long) SIOCGIFCONF }, +#endif // SIOCGIFCONF +#ifdef SIOCGIFCOUNT + { "SIOCGIFCOUNT", (unsigned long) SIOCGIFCOUNT }, +#endif // SIOCGIFCOUNT +#ifdef SIOCGIFDSTADDR + { "SIOCGIFDSTADDR", (unsigned long) SIOCGIFDSTADDR }, +#endif // SIOCGIFDSTADDR +#ifdef SIOCGIFENCAP + { "SIOCGIFENCAP", (unsigned long) SIOCGIFENCAP }, +#endif // SIOCGIFENCAP +#ifdef SIOCGIFFLAGS + { "SIOCGIFFLAGS", (unsigned long) SIOCGIFFLAGS }, +#endif // SIOCGIFFLAGS +#ifdef SIOCGIFHWADDR + { "SIOCGIFHWADDR", (unsigned long) SIOCGIFHWADDR }, +#endif // SIOCGIFHWADDR +#ifdef SIOCGIFINDEX + { "SIOCGIFINDEX", (unsigned long) SIOCGIFINDEX }, +#endif // SIOCGIFINDEX +#ifdef SIOCGIFMAP + { "SIOCGIFMAP", (unsigned long) SIOCGIFMAP }, +#endif // SIOCGIFMAP +#ifdef SIOCGIFMEM + { "SIOCGIFMEM", (unsigned long) SIOCGIFMEM }, +#endif // SIOCGIFMEM +#ifdef SIOCGIFMETRIC + { "SIOCGIFMETRIC", (unsigned long) SIOCGIFMETRIC }, +#endif // SIOCGIFMETRIC +#ifdef SIOCGIFMTU + { "SIOCGIFMTU", (unsigned long) SIOCGIFMTU }, +#endif // SIOCGIFMTU +#ifdef SIOCGIFNAME + { "SIOCGIFNAME", (unsigned long) SIOCGIFNAME }, +#endif // SIOCGIFNAME +#ifdef SIOCGIFNETMASK + { "SIOCGIFNETMASK", (unsigned long) SIOCGIFNETMASK }, +#endif // SIOCGIFNETMASK +#ifdef SIOCGIFPFLAGS + { "SIOCGIFPFLAGS", (unsigned long) SIOCGIFPFLAGS }, +#endif // SIOCGIFPFLAGS +#ifdef SIOCGIFSLAVE + { "SIOCGIFSLAVE", (unsigned long) SIOCGIFSLAVE }, +#endif // SIOCGIFSLAVE +#ifdef SIOCGIFTXQLEN + { "SIOCGIFTXQLEN", (unsigned long) SIOCGIFTXQLEN }, +#endif // SIOCGIFTXQLEN +#ifdef SIOCGIFVLAN + { "SIOCGIFVLAN", (unsigned long) SIOCGIFVLAN }, +#endif // SIOCGIFVLAN +#ifdef SIOCGMIIPHY + { "SIOCGMIIPHY", (unsigned long) SIOCGMIIPHY }, +#endif // SIOCGMIIPHY +#ifdef SIOCGMIIREG + { "SIOCGMIIREG", (unsigned long) SIOCGMIIREG }, +#endif // SIOCGMIIREG +#ifdef SIOCGPGRP + { "SIOCGPGRP", (unsigned long) SIOCGPGRP }, +#endif // SIOCGPGRP +#ifdef SIOCGRARP + { "SIOCGRARP", (unsigned long) SIOCGRARP }, +#endif // SIOCGRARP +#ifdef SIOCGSKNS + { "SIOCGSKNS", (unsigned long) SIOCGSKNS }, +#endif // SIOCGSKNS +#ifdef SIOCGSTAMP + { "SIOCGSTAMP", (unsigned long) SIOCGSTAMP }, +#endif // SIOCGSTAMP +#ifdef SIOCGSTAMP_NEW + { "SIOCGSTAMP_NEW", (unsigned long) SIOCGSTAMP_NEW }, +#endif // SIOCGSTAMP_NEW +#ifdef SIOCGSTAMPNS + { "SIOCGSTAMPNS", (unsigned long) SIOCGSTAMPNS }, +#endif // SIOCGSTAMPNS +#ifdef SIOCGSTAMPNS_NEW + { "SIOCGSTAMPNS_NEW", (unsigned long) SIOCGSTAMPNS_NEW }, +#endif // SIOCGSTAMPNS_NEW +#ifdef SIOCINQ + { "SIOCINQ", (unsigned long) SIOCINQ }, +#endif // SIOCINQ +#ifdef SIOCOUTQNSD + { "SIOCOUTQNSD", (unsigned long) SIOCOUTQNSD }, +#endif // SIOCOUTQNSD +#ifdef SIOCOUTQ + { "SIOCOUTQ", (unsigned long) SIOCOUTQ }, +#endif // SIOCOUTQ +#ifdef SIOCPROTOPRIVATE + { "SIOCPROTOPRIVATE", (unsigned long) SIOCPROTOPRIVATE }, +#endif // SIOCPROTOPRIVATE +#ifdef SIOCRTMSG + { "SIOCRTMSG", (unsigned long) SIOCRTMSG }, +#endif // SIOCRTMSG +#ifdef SIOCSARP + { "SIOCSARP", (unsigned long) SIOCSARP }, +#endif // SIOCSARP +#ifdef SIOCSHWTSTAMP + { "SIOCSHWTSTAMP", (unsigned long) SIOCSHWTSTAMP }, +#endif // SIOCSHWTSTAMP +#ifdef SIOCSIFADDR + { "SIOCSIFADDR", (unsigned long) SIOCSIFADDR }, +#endif // SIOCSIFADDR +#ifdef SIOCSIFBR + { "SIOCSIFBR", (unsigned long) SIOCSIFBR }, +#endif // SIOCSIFBR +#ifdef SIOCSIFBRDADDR + { "SIOCSIFBRDADDR", (unsigned long) SIOCSIFBRDADDR }, +#endif // SIOCSIFBRDADDR +#ifdef SIOCSIFDSTADDR + { "SIOCSIFDSTADDR", (unsigned long) SIOCSIFDSTADDR }, +#endif // SIOCSIFDSTADDR +#ifdef SIOCSIFENCAP + { "SIOCSIFENCAP", (unsigned long) SIOCSIFENCAP }, +#endif // SIOCSIFENCAP +#ifdef SIOCSIFFLAGS + { "SIOCSIFFLAGS", (unsigned long) SIOCSIFFLAGS }, +#endif // SIOCSIFFLAGS +#ifdef SIOCSIFHWADDR + { "SIOCSIFHWADDR", (unsigned long) SIOCSIFHWADDR }, +#endif // SIOCSIFHWADDR +#ifdef SIOCSIFHWBROADCAST + { "SIOCSIFHWBROADCAST", (unsigned long) SIOCSIFHWBROADCAST }, +#endif // SIOCSIFHWBROADCAST +#ifdef SIOCSIFLINK + { "SIOCSIFLINK", (unsigned long) SIOCSIFLINK }, +#endif // SIOCSIFLINK +#ifdef SIOCSIFMAP + { "SIOCSIFMAP", (unsigned long) SIOCSIFMAP }, +#endif // SIOCSIFMAP +#ifdef SIOCSIFMEM + { "SIOCSIFMEM", (unsigned long) SIOCSIFMEM }, +#endif // SIOCSIFMEM +#ifdef SIOCSIFMETRIC + { "SIOCSIFMETRIC", (unsigned long) SIOCSIFMETRIC }, +#endif // SIOCSIFMETRIC +#ifdef SIOCSIFMTU + { "SIOCSIFMTU", (unsigned long) SIOCSIFMTU }, +#endif // SIOCSIFMTU +#ifdef SIOCSIFNAME + { "SIOCSIFNAME", (unsigned long) SIOCSIFNAME }, +#endif // SIOCSIFNAME +#ifdef SIOCSIFNETMASK + { "SIOCSIFNETMASK", (unsigned long) SIOCSIFNETMASK }, +#endif // SIOCSIFNETMASK +#ifdef SIOCSIFPFLAGS + { "SIOCSIFPFLAGS", (unsigned long) SIOCSIFPFLAGS }, +#endif // SIOCSIFPFLAGS +#ifdef SIOCSIFSLAVE + { "SIOCSIFSLAVE", (unsigned long) SIOCSIFSLAVE }, +#endif // SIOCSIFSLAVE +#ifdef SIOCSIFTXQLEN + { "SIOCSIFTXQLEN", (unsigned long) SIOCSIFTXQLEN }, +#endif // SIOCSIFTXQLEN +#ifdef SIOCSIFVLAN + { "SIOCSIFVLAN", (unsigned long) SIOCSIFVLAN }, +#endif // SIOCSIFVLAN +#ifdef SIOCSMIIREG + { "SIOCSMIIREG", (unsigned long) SIOCSMIIREG }, +#endif // SIOCSMIIREG +#ifdef SIOCSPGRP + { "SIOCSPGRP", (unsigned long) SIOCSPGRP }, +#endif // SIOCSPGRP +#ifdef SIOCSRARP + { "SIOCSRARP", (unsigned long) SIOCSRARP }, +#endif // SIOCSRARP +#ifdef SIOCWANDEV + { "SIOCWANDEV", (unsigned long) SIOCWANDEV }, +#endif // SIOCWANDEV +#ifdef SIOGIFINDEX + { "SIOGIFINDEX", (unsigned long) SIOGIFINDEX }, +#endif // SIOGIFINDEX #ifdef SI_QUEUE - {"SI_QUEUE", (unsigned long)SI_QUEUE}, + { "SI_QUEUE", (unsigned long) SI_QUEUE }, #endif // SI_QUEUE #ifdef S_IREAD - {"S_IREAD", (unsigned long)S_IREAD}, + { "S_IREAD", (unsigned long) S_IREAD }, #endif // S_IREAD +#ifdef S_IRUSR + { "S_IRUSR", (unsigned long) S_IRUSR }, +#endif // S_IRUSR +#ifdef S_ISGID + { "S_ISGID", (unsigned long) S_ISGID }, +#endif // S_ISGID #ifdef SI_SIGIO - {"SI_SIGIO", (unsigned long)SI_SIGIO}, + { "SI_SIGIO", (unsigned long) SI_SIGIO }, #endif // SI_SIGIO +#ifdef S_ISUID + { "S_ISUID", (unsigned long) S_ISUID }, +#endif // S_ISUID +#ifdef S_ISVTX + { "S_ISVTX", (unsigned long) S_ISVTX }, +#endif // S_ISVTX #ifdef SI_TIMER - {"SI_TIMER", (unsigned long)SI_TIMER}, + { "SI_TIMER", (unsigned long) SI_TIMER }, #endif // SI_TIMER #ifdef SI_TKILL - {"SI_TKILL", (unsigned long)SI_TKILL}, + { "SI_TKILL", (unsigned long) SI_TKILL }, #endif // SI_TKILL #ifdef SI_USER - {"SI_USER", (unsigned long)SI_USER}, + { "SI_USER", (unsigned long) SI_USER }, #endif // SI_USER #ifdef S_IWRITE - {"S_IWRITE", (unsigned long)S_IWRITE}, + { "S_IWRITE", (unsigned long) S_IWRITE }, #endif // S_IWRITE +#ifdef S_IWUSR + { "S_IWUSR", (unsigned long) S_IWUSR }, +#endif // S_IWUSR +#ifdef S_IXUSR + { "S_IXUSR", (unsigned long) S_IXUSR }, +#endif // S_IXUSR +#ifdef SO_ACCEPTCONN + { "SO_ACCEPTCONN", (unsigned long) SO_ACCEPTCONN }, +#endif // SO_ACCEPTCONN +#ifdef SO_ATTACH_BPF + { "SO_ATTACH_BPF", (unsigned long) SO_ATTACH_BPF }, +#endif // SO_ATTACH_BPF +#ifdef SO_ATTACH_FILTER + { "SO_ATTACH_FILTER", (unsigned long) SO_ATTACH_FILTER }, +#endif // SO_ATTACH_FILTER +#ifdef SO_ATTACH_REUSEPORT_CBPF + { "SO_ATTACH_REUSEPORT_CBPF", (unsigned long) SO_ATTACH_REUSEPORT_CBPF }, +#endif // SO_ATTACH_REUSEPORT_CBPF +#ifdef SO_ATTACH_REUSEPORT_EBPF + { "SO_ATTACH_REUSEPORT_EBPF", (unsigned long) SO_ATTACH_REUSEPORT_EBPF }, +#endif // SO_ATTACH_REUSEPORT_EBPF +#ifdef SO_BINDTODEVICE + { "SO_BINDTODEVICE", (unsigned long) SO_BINDTODEVICE }, +#endif // SO_BINDTODEVICE +#ifdef SO_BINDTOIFINDEX + { "SO_BINDTOIFINDEX", (unsigned long) SO_BINDTOIFINDEX }, +#endif // SO_BINDTOIFINDEX +#ifdef SO_BPF_EXTENSIONS + { "SO_BPF_EXTENSIONS", (unsigned long) SO_BPF_EXTENSIONS }, +#endif // SO_BPF_EXTENSIONS +#ifdef SO_BROADCAST + { "SO_BROADCAST", (unsigned long) SO_BROADCAST }, +#endif // SO_BROADCAST +#ifdef SO_BSDCOMPAT + { "SO_BSDCOMPAT", (unsigned long) SO_BSDCOMPAT }, +#endif // SO_BSDCOMPAT +#ifdef SO_BUSY_POLL + { "SO_BUSY_POLL", (unsigned long) SO_BUSY_POLL }, +#endif // SO_BUSY_POLL +#ifdef SOCK_CLOEXEC + { "SOCK_CLOEXEC", (unsigned long) SOCK_CLOEXEC }, +#endif // SOCK_CLOEXEC +#ifdef SOCK_DCCP + { "SOCK_DCCP", (unsigned long) SOCK_DCCP }, +#endif // SOCK_DCCP +#ifdef SOCK_DGRAM + { "SOCK_DGRAM", (unsigned long) SOCK_DGRAM }, +#endif // SOCK_DGRAM +#ifdef SOCK_IOC_TYPE + { "SOCK_IOC_TYPE", (unsigned long) SOCK_IOC_TYPE }, +#endif // SOCK_IOC_TYPE +#ifdef SOCK_NONBLOCK + { "SOCK_NONBLOCK", (unsigned long) SOCK_NONBLOCK }, +#endif // SOCK_NONBLOCK +#ifdef SOCK_PACKET + { "SOCK_PACKET", (unsigned long) SOCK_PACKET }, +#endif // SOCK_PACKET +#ifdef SOCK_RAW + { "SOCK_RAW", (unsigned long) SOCK_RAW }, +#endif // SOCK_RAW +#ifdef SOCK_RDM + { "SOCK_RDM", (unsigned long) SOCK_RDM }, +#endif // SOCK_RDM +#ifdef SOCK_SEQPACKET + { "SOCK_SEQPACKET", (unsigned long) SOCK_SEQPACKET }, +#endif // SOCK_SEQPACKET +#ifdef SOCK_STREAM + { "SOCK_STREAM", (unsigned long) SOCK_STREAM }, +#endif // SOCK_STREAM +#ifdef SO_CNX_ADVICE + { "SO_CNX_ADVICE", (unsigned long) SO_CNX_ADVICE }, +#endif // SO_CNX_ADVICE +#ifdef SO_COOKIE + { "SO_COOKIE", (unsigned long) SO_COOKIE }, +#endif // SO_COOKIE +#ifdef SO_DEBUG + { "SO_DEBUG", (unsigned long) SO_DEBUG }, +#endif // SO_DEBUG +#ifdef SO_DETACH_BPF + { "SO_DETACH_BPF", (unsigned long) SO_DETACH_BPF }, +#endif // SO_DETACH_BPF +#ifdef SO_DETACH_FILTER + { "SO_DETACH_FILTER", (unsigned long) SO_DETACH_FILTER }, +#endif // SO_DETACH_FILTER +#ifdef SO_DETACH_REUSEPORT_BPF + { "SO_DETACH_REUSEPORT_BPF", (unsigned long) SO_DETACH_REUSEPORT_BPF }, +#endif // SO_DETACH_REUSEPORT_BPF +#ifdef SO_DOMAIN + { "SO_DOMAIN", (unsigned long) SO_DOMAIN }, +#endif // SO_DOMAIN +#ifdef SO_DONTROUTE + { "SO_DONTROUTE", (unsigned long) SO_DONTROUTE }, +#endif // SO_DONTROUTE +#ifdef SO_ERROR + { "SO_ERROR", (unsigned long) SO_ERROR }, +#endif // SO_ERROR +#ifdef SO_GET_FILTER + { "SO_GET_FILTER", (unsigned long) SO_GET_FILTER }, +#endif // SO_GET_FILTER +#ifdef SO_INCOMING_CPU + { "SO_INCOMING_CPU", (unsigned long) SO_INCOMING_CPU }, +#endif // SO_INCOMING_CPU +#ifdef SO_INCOMING_NAPI_ID + { "SO_INCOMING_NAPI_ID", (unsigned long) SO_INCOMING_NAPI_ID }, +#endif // SO_INCOMING_NAPI_ID +#ifdef SO_KEEPALIVE + { "SO_KEEPALIVE", (unsigned long) SO_KEEPALIVE }, +#endif // SO_KEEPALIVE +#ifdef SOL_AAL + { "SOL_AAL", (unsigned long) SOL_AAL }, +#endif // SOL_AAL +#ifdef SOL_ALG + { "SOL_ALG", (unsigned long) SOL_ALG }, +#endif // SOL_ALG +#ifdef SOL_ATM + { "SOL_ATM", (unsigned long) SOL_ATM }, +#endif // SOL_ATM +#ifdef SOL_BLUETOOTH + { "SOL_BLUETOOTH", (unsigned long) SOL_BLUETOOTH }, +#endif // SOL_BLUETOOTH +#ifdef SOL_CAIF + { "SOL_CAIF", (unsigned long) SOL_CAIF }, +#endif // SOL_CAIF +#ifdef SOL_DCCP + { "SOL_DCCP", (unsigned long) SOL_DCCP }, +#endif // SOL_DCCP +#ifdef SOL_DECNET + { "SOL_DECNET", (unsigned long) SOL_DECNET }, +#endif // SOL_DECNET +#ifdef SO_LINGER + { "SO_LINGER", (unsigned long) SO_LINGER }, +#endif // SO_LINGER +#ifdef SOL_IRDA + { "SOL_IRDA", (unsigned long) SOL_IRDA }, +#endif // SOL_IRDA +#ifdef SOL_IUCV + { "SOL_IUCV", (unsigned long) SOL_IUCV }, +#endif // SOL_IUCV +#ifdef SOL_KCM + { "SOL_KCM", (unsigned long) SOL_KCM }, +#endif // SOL_KCM +#ifdef SOL_LLC + { "SOL_LLC", (unsigned long) SOL_LLC }, +#endif // SOL_LLC +#ifdef SOL_NETBEUI + { "SOL_NETBEUI", (unsigned long) SOL_NETBEUI }, +#endif // SOL_NETBEUI +#ifdef SOL_NETLINK + { "SOL_NETLINK", (unsigned long) SOL_NETLINK }, +#endif // SOL_NETLINK +#ifdef SOL_NFC + { "SOL_NFC", (unsigned long) SOL_NFC }, +#endif // SOL_NFC +#ifdef SO_LOCK_FILTER + { "SO_LOCK_FILTER", (unsigned long) SO_LOCK_FILTER }, +#endif // SO_LOCK_FILTER +#ifdef SOL_PACKET + { "SOL_PACKET", (unsigned long) SOL_PACKET }, +#endif // SOL_PACKET +#ifdef SOL_PNPIPE + { "SOL_PNPIPE", (unsigned long) SOL_PNPIPE }, +#endif // SOL_PNPIPE +#ifdef SOL_PPPOL2TP + { "SOL_PPPOL2TP", (unsigned long) SOL_PPPOL2TP }, +#endif // SOL_PPPOL2TP +#ifdef SOL_RAW + { "SOL_RAW", (unsigned long) SOL_RAW }, +#endif // SOL_RAW +#ifdef SOL_RDS + { "SOL_RDS", (unsigned long) SOL_RDS }, +#endif // SOL_RDS +#ifdef SOL_RXRPC + { "SOL_RXRPC", (unsigned long) SOL_RXRPC }, +#endif // SOL_RXRPC +#ifdef SOL_SOCKET + { "SOL_SOCKET", (unsigned long) SOL_SOCKET }, +#endif // SOL_SOCKET +#ifdef SOL_TIPC + { "SOL_TIPC", (unsigned long) SOL_TIPC }, +#endif // SOL_TIPC +#ifdef SOL_TLS + { "SOL_TLS", (unsigned long) SOL_TLS }, +#endif // SOL_TLS +#ifdef SOL_X25 + { "SOL_X25", (unsigned long) SOL_X25 }, +#endif // SOL_X25 +#ifdef SOL_XDP + { "SOL_XDP", (unsigned long) SOL_XDP }, +#endif // SOL_XDP +#ifdef SO_MARK + { "SO_MARK", (unsigned long) SO_MARK }, +#endif // SO_MARK +#ifdef SOMAXCONN + { "SOMAXCONN", (unsigned long) SOMAXCONN }, +#endif // SOMAXCONN +#ifdef SO_MAX_PACING_RATE + { "SO_MAX_PACING_RATE", (unsigned long) SO_MAX_PACING_RATE }, +#endif // SO_MAX_PACING_RATE +#ifdef SO_MEMINFO + { "SO_MEMINFO", (unsigned long) SO_MEMINFO }, +#endif // SO_MEMINFO +#ifdef SO_NO_CHECK + { "SO_NO_CHECK", (unsigned long) SO_NO_CHECK }, +#endif // SO_NO_CHECK +#ifdef SO_NOFCS + { "SO_NOFCS", (unsigned long) SO_NOFCS }, +#endif // SO_NOFCS +#ifdef SO_OOBINLINE + { "SO_OOBINLINE", (unsigned long) SO_OOBINLINE }, +#endif // SO_OOBINLINE +#ifdef SO_PASSCRED + { "SO_PASSCRED", (unsigned long) SO_PASSCRED }, +#endif // SO_PASSCRED +#ifdef SO_PASSSEC + { "SO_PASSSEC", (unsigned long) SO_PASSSEC }, +#endif // SO_PASSSEC +#ifdef SO_PEEK_OFF + { "SO_PEEK_OFF", (unsigned long) SO_PEEK_OFF }, +#endif // SO_PEEK_OFF +#ifdef SO_PEERCRED + { "SO_PEERCRED", (unsigned long) SO_PEERCRED }, +#endif // SO_PEERCRED +#ifdef SO_PEERGROUPS + { "SO_PEERGROUPS", (unsigned long) SO_PEERGROUPS }, +#endif // SO_PEERGROUPS +#ifdef SO_PEERNAME + { "SO_PEERNAME", (unsigned long) SO_PEERNAME }, +#endif // SO_PEERNAME +#ifdef SO_PEERSEC + { "SO_PEERSEC", (unsigned long) SO_PEERSEC }, +#endif // SO_PEERSEC +#ifdef SO_PRIORITY + { "SO_PRIORITY", (unsigned long) SO_PRIORITY }, +#endif // SO_PRIORITY +#ifdef SO_PROTOCOL + { "SO_PROTOCOL", (unsigned long) SO_PROTOCOL }, +#endif // SO_PROTOCOL +#ifdef SO_RCVBUF + { "SO_RCVBUF", (unsigned long) SO_RCVBUF }, +#endif // SO_RCVBUF +#ifdef SO_RCVBUFFORCE + { "SO_RCVBUFFORCE", (unsigned long) SO_RCVBUFFORCE }, +#endif // SO_RCVBUFFORCE +#ifdef SO_RCVLOWAT + { "SO_RCVLOWAT", (unsigned long) SO_RCVLOWAT }, +#endif // SO_RCVLOWAT +#ifdef SO_RCVTIMEO_NEW + { "SO_RCVTIMEO_NEW", (unsigned long) SO_RCVTIMEO_NEW }, +#endif // SO_RCVTIMEO_NEW +#ifdef SO_RCVTIMEO_OLD + { "SO_RCVTIMEO_OLD", (unsigned long) SO_RCVTIMEO_OLD }, +#endif // SO_RCVTIMEO_OLD +#ifdef SO_RCVTIMEO + { "SO_RCVTIMEO", (unsigned long) SO_RCVTIMEO }, +#endif // SO_RCVTIMEO +#ifdef SO_REUSEADDR + { "SO_REUSEADDR", (unsigned long) SO_REUSEADDR }, +#endif // SO_REUSEADDR +#ifdef SO_REUSEPORT + { "SO_REUSEPORT", (unsigned long) SO_REUSEPORT }, +#endif // SO_REUSEPORT +#ifdef SO_RXQ_OVFL + { "SO_RXQ_OVFL", (unsigned long) SO_RXQ_OVFL }, +#endif // SO_RXQ_OVFL +#ifdef SO_SECURITY_AUTHENTICATION + { "SO_SECURITY_AUTHENTICATION", (unsigned long) SO_SECURITY_AUTHENTICATION }, +#endif // SO_SECURITY_AUTHENTICATION +#ifdef SO_SECURITY_ENCRYPTION_NETWORK + { "SO_SECURITY_ENCRYPTION_NETWORK", (unsigned long) SO_SECURITY_ENCRYPTION_NETWORK }, +#endif // SO_SECURITY_ENCRYPTION_NETWORK +#ifdef SO_SECURITY_ENCRYPTION_TRANSPORT + { "SO_SECURITY_ENCRYPTION_TRANSPORT", (unsigned long) SO_SECURITY_ENCRYPTION_TRANSPORT }, +#endif // SO_SECURITY_ENCRYPTION_TRANSPORT +#ifdef SO_SELECT_ERR_QUEUE + { "SO_SELECT_ERR_QUEUE", (unsigned long) SO_SELECT_ERR_QUEUE }, +#endif // SO_SELECT_ERR_QUEUE +#ifdef SO_SNDBUF + { "SO_SNDBUF", (unsigned long) SO_SNDBUF }, +#endif // SO_SNDBUF +#ifdef SO_SNDBUFFORCE + { "SO_SNDBUFFORCE", (unsigned long) SO_SNDBUFFORCE }, +#endif // SO_SNDBUFFORCE +#ifdef SO_SNDLOWAT + { "SO_SNDLOWAT", (unsigned long) SO_SNDLOWAT }, +#endif // SO_SNDLOWAT +#ifdef SO_SNDTIMEO_NEW + { "SO_SNDTIMEO_NEW", (unsigned long) SO_SNDTIMEO_NEW }, +#endif // SO_SNDTIMEO_NEW +#ifdef SO_SNDTIMEO_OLD + { "SO_SNDTIMEO_OLD", (unsigned long) SO_SNDTIMEO_OLD }, +#endif // SO_SNDTIMEO_OLD +#ifdef SO_SNDTIMEO + { "SO_SNDTIMEO", (unsigned long) SO_SNDTIMEO }, +#endif // SO_SNDTIMEO +#ifdef SO_TIMESTAMPING_NEW + { "SO_TIMESTAMPING_NEW", (unsigned long) SO_TIMESTAMPING_NEW }, +#endif // SO_TIMESTAMPING_NEW +#ifdef SO_TIMESTAMPING_OLD + { "SO_TIMESTAMPING_OLD", (unsigned long) SO_TIMESTAMPING_OLD }, +#endif // SO_TIMESTAMPING_OLD +#ifdef SO_TIMESTAMPING + { "SO_TIMESTAMPING", (unsigned long) SO_TIMESTAMPING }, +#endif // SO_TIMESTAMPING +#ifdef SO_TIMESTAMP_NEW + { "SO_TIMESTAMP_NEW", (unsigned long) SO_TIMESTAMP_NEW }, +#endif // SO_TIMESTAMP_NEW +#ifdef SO_TIMESTAMPNS_NEW + { "SO_TIMESTAMPNS_NEW", (unsigned long) SO_TIMESTAMPNS_NEW }, +#endif // SO_TIMESTAMPNS_NEW +#ifdef SO_TIMESTAMPNS_OLD + { "SO_TIMESTAMPNS_OLD", (unsigned long) SO_TIMESTAMPNS_OLD }, +#endif // SO_TIMESTAMPNS_OLD +#ifdef SO_TIMESTAMPNS + { "SO_TIMESTAMPNS", (unsigned long) SO_TIMESTAMPNS }, +#endif // SO_TIMESTAMPNS +#ifdef SO_TIMESTAMP_OLD + { "SO_TIMESTAMP_OLD", (unsigned long) SO_TIMESTAMP_OLD }, +#endif // SO_TIMESTAMP_OLD +#ifdef SO_TIMESTAMP + { "SO_TIMESTAMP", (unsigned long) SO_TIMESTAMP }, +#endif // SO_TIMESTAMP +#ifdef SO_TXTIME + { "SO_TXTIME", (unsigned long) SO_TXTIME }, +#endif // SO_TXTIME +#ifdef SO_TYPE + { "SO_TYPE", (unsigned long) SO_TYPE }, +#endif // SO_TYPE +#ifdef SO_WIFI_STATUS + { "SO_WIFI_STATUS", (unsigned long) SO_WIFI_STATUS }, +#endif // SO_WIFI_STATUS +#ifdef SO_ZEROCOPY + { "SO_ZEROCOPY", (unsigned long) SO_ZEROCOPY }, +#endif // SO_ZEROCOPY #ifdef SS_DISABLE - {"SS_DISABLE", (unsigned long)SS_DISABLE}, + { "SS_DISABLE", (unsigned long) SS_DISABLE }, #endif // SS_DISABLE #ifdef SS_ONSTACK - {"SS_ONSTACK", (unsigned long)SS_ONSTACK}, + { "SS_ONSTACK", (unsigned long) SS_ONSTACK }, #endif // SS_ONSTACK -#ifdef TRAP_BRKPT - {"TRAP_BRKPT", (unsigned long)TRAP_BRKPT}, -#endif // TRAP_BRKPT -#ifdef TRAP_TRACE - {"TRAP_TRACE", (unsigned long)TRAP_TRACE}, -#endif // TRAP_TRACE +#ifdef SYNC_FILE_RANGE_WAIT_AFTER + { "SYNC_FILE_RANGE_WAIT_AFTER", (unsigned long) SYNC_FILE_RANGE_WAIT_AFTER }, +#endif // SYNC_FILE_RANGE_WAIT_AFTER +#ifdef SYNC_FILE_RANGE_WAIT_BEFORE + { "SYNC_FILE_RANGE_WAIT_BEFORE", (unsigned long) SYNC_FILE_RANGE_WAIT_BEFORE }, +#endif // SYNC_FILE_RANGE_WAIT_BEFORE +#ifdef SYNC_FILE_RANGE_WRITE + { "SYNC_FILE_RANGE_WRITE", (unsigned long) SYNC_FILE_RANGE_WRITE }, +#endif // SYNC_FILE_RANGE_WRITE +#ifdef SYS_ACCEPT4 + { "SYS_ACCEPT4", (unsigned long) SYS_ACCEPT4 }, +#endif // SYS_ACCEPT4 +#ifdef SYS_ACCEPT + { "SYS_ACCEPT", (unsigned long) SYS_ACCEPT }, +#endif // SYS_ACCEPT +#ifdef SYS_BIND + { "SYS_BIND", (unsigned long) SYS_BIND }, +#endif // SYS_BIND +#ifdef SYS_CONNECT + { "SYS_CONNECT", (unsigned long) SYS_CONNECT }, +#endif // SYS_CONNECT +#ifdef SYS_GETPEERNAME + { "SYS_GETPEERNAME", (unsigned long) SYS_GETPEERNAME }, +#endif // SYS_GETPEERNAME +#ifdef SYS_GETSOCKNAME + { "SYS_GETSOCKNAME", (unsigned long) SYS_GETSOCKNAME }, +#endif // SYS_GETSOCKNAME +#ifdef SYS_GETSOCKOPT + { "SYS_GETSOCKOPT", (unsigned long) SYS_GETSOCKOPT }, +#endif // SYS_GETSOCKOPT +#ifdef SYS_LISTEN + { "SYS_LISTEN", (unsigned long) SYS_LISTEN }, +#endif // SYS_LISTEN +#ifdef SYS_RECV + { "SYS_RECV", (unsigned long) SYS_RECV }, +#endif // SYS_RECV +#ifdef SYS_RECVFROM + { "SYS_RECVFROM", (unsigned long) SYS_RECVFROM }, +#endif // SYS_RECVFROM +#ifdef SYS_RECVMMSG + { "SYS_RECVMMSG", (unsigned long) SYS_RECVMMSG }, +#endif // SYS_RECVMMSG +#ifdef SYS_RECVMSG + { "SYS_RECVMSG", (unsigned long) SYS_RECVMSG }, +#endif // SYS_RECVMSG +#ifdef SYS_SEND + { "SYS_SEND", (unsigned long) SYS_SEND }, +#endif // SYS_SEND +#ifdef SYS_SENDMMSG + { "SYS_SENDMMSG", (unsigned long) SYS_SENDMMSG }, +#endif // SYS_SENDMMSG +#ifdef SYS_SENDMSG + { "SYS_SENDMSG", (unsigned long) SYS_SENDMSG }, +#endif // SYS_SENDMSG +#ifdef SYS_SENDTO + { "SYS_SENDTO", (unsigned long) SYS_SENDTO }, +#endif // SYS_SENDTO +#ifdef SYS_SETSOCKOPT + { "SYS_SETSOCKOPT", (unsigned long) SYS_SETSOCKOPT }, +#endif // SYS_SETSOCKOPT +#ifdef SYS_SHUTDOWN + { "SYS_SHUTDOWN", (unsigned long) SYS_SHUTDOWN }, +#endif // SYS_SHUTDOWN +#ifdef SYS_SOCKET + { "SYS_SOCKET", (unsigned long) SYS_SOCKET }, +#endif // SYS_SOCKET +#ifdef SYS_SOCKETPAIR + { "SYS_SOCKETPAIR", (unsigned long) SYS_SOCKETPAIR }, +#endif // SYS_SOCKETPAIR +#ifdef TAB0 + { "TAB0", (unsigned long) TAB0 }, +#endif // TAB0 +#ifdef TAB1 + { "TAB1", (unsigned long) TAB1 }, +#endif // TAB1 +#ifdef TAB2 + { "TAB2", (unsigned long) TAB2 }, +#endif // TAB2 +#ifdef TAB3 + { "TAB3", (unsigned long) TAB3 }, +#endif // TAB3 +#ifdef TABDLY + { "TABDLY", (unsigned long) TABDLY }, +#endif // TABDLY +#ifdef TCFLSH + { "TCFLSH", (unsigned long) TCFLSH }, +#endif // TCFLSH +#ifdef TCGETA + { "TCGETA", (unsigned long) TCGETA }, +#endif // TCGETA +#ifdef TCGETS + { "TCGETS", (unsigned long) TCGETS }, +#endif // TCGETS +#ifdef TCGETS2 + { "TCGETS2", (unsigned long) TCGETS2 }, +#endif // TCGETS2 +#ifdef TCGETX + { "TCGETX", (unsigned long) TCGETX }, +#endif // TCGETX +#ifdef TCIFLUSH + { "TCIFLUSH", (unsigned long) TCIFLUSH }, +#endif // TCIFLUSH +#ifdef TCIOFF + { "TCIOFF", (unsigned long) TCIOFF }, +#endif // TCIOFF +#ifdef TCIOFLUSH + { "TCIOFLUSH", (unsigned long) TCIOFLUSH }, +#endif // TCIOFLUSH +#ifdef TCION + { "TCION", (unsigned long) TCION }, +#endif // TCION +#ifdef TCOFLUSH + { "TCOFLUSH", (unsigned long) TCOFLUSH }, +#endif // TCOFLUSH +#ifdef TCOOFF + { "TCOOFF", (unsigned long) TCOOFF }, +#endif // TCOOFF +#ifdef TCOON + { "TCOON", (unsigned long) TCOON }, +#endif // TCOON +#ifdef TCSADRAIN + { "TCSADRAIN", (unsigned long) TCSADRAIN }, +#endif // TCSADRAIN +#ifdef TCSAFLUSH + { "TCSAFLUSH", (unsigned long) TCSAFLUSH }, +#endif // TCSAFLUSH +#ifdef TCSANOW + { "TCSANOW", (unsigned long) TCSANOW }, +#endif // TCSANOW +#ifdef TCSBRK + { "TCSBRK", (unsigned long) TCSBRK }, +#endif // TCSBRK +#ifdef TCSBRKP + { "TCSBRKP", (unsigned long) TCSBRKP }, +#endif // TCSBRKP +#ifdef TCSETA + { "TCSETA", (unsigned long) TCSETA }, +#endif // TCSETA +#ifdef TCSETAF + { "TCSETAF", (unsigned long) TCSETAF }, +#endif // TCSETAF +#ifdef TCSETAW + { "TCSETAW", (unsigned long) TCSETAW }, +#endif // TCSETAW +#ifdef TCSETS + { "TCSETS", (unsigned long) TCSETS }, +#endif // TCSETS +#ifdef TCSETS2 + { "TCSETS2", (unsigned long) TCSETS2 }, +#endif // TCSETS2 +#ifdef TCSETSF + { "TCSETSF", (unsigned long) TCSETSF }, +#endif // TCSETSF +#ifdef TCSETSF2 + { "TCSETSF2", (unsigned long) TCSETSF2 }, +#endif // TCSETSF2 +#ifdef TCSETSW + { "TCSETSW", (unsigned long) TCSETSW }, +#endif // TCSETSW +#ifdef TCSETSW2 + { "TCSETSW2", (unsigned long) TCSETSW2 }, +#endif // TCSETSW2 +#ifdef TCSETX + { "TCSETX", (unsigned long) TCSETX }, +#endif // TCSETX +#ifdef TCSETXF + { "TCSETXF", (unsigned long) TCSETXF }, +#endif // TCSETXF +#ifdef TCSETXW + { "TCSETXW", (unsigned long) TCSETXW }, +#endif // TCSETXW +#ifdef TCXONC + { "TCXONC", (unsigned long) TCXONC }, +#endif // TCXONC +#ifdef TIOCCBRK + { "TIOCCBRK", (unsigned long) TIOCCBRK }, +#endif // TIOCCBRK +#ifdef TIOCCONS + { "TIOCCONS", (unsigned long) TIOCCONS }, +#endif // TIOCCONS +#ifdef TIOCEXCL + { "TIOCEXCL", (unsigned long) TIOCEXCL }, +#endif // TIOCEXCL +#ifdef TIOCGDEV + { "TIOCGDEV", (unsigned long) TIOCGDEV }, +#endif // TIOCGDEV +#ifdef TIOCGETD + { "TIOCGETD", (unsigned long) TIOCGETD }, +#endif // TIOCGETD +#ifdef TIOCGEXCL + { "TIOCGEXCL", (unsigned long) TIOCGEXCL }, +#endif // TIOCGEXCL +#ifdef TIOCGICOUNT + { "TIOCGICOUNT", (unsigned long) TIOCGICOUNT }, +#endif // TIOCGICOUNT +#ifdef TIOCGISO7816 + { "TIOCGISO7816", (unsigned long) TIOCGISO7816 }, +#endif // TIOCGISO7816 +#ifdef TIOCGLCKTRMIOS + { "TIOCGLCKTRMIOS", (unsigned long) TIOCGLCKTRMIOS }, +#endif // TIOCGLCKTRMIOS +#ifdef TIOCGPGRP + { "TIOCGPGRP", (unsigned long) TIOCGPGRP }, +#endif // TIOCGPGRP +#ifdef TIOCGPKT + { "TIOCGPKT", (unsigned long) TIOCGPKT }, +#endif // TIOCGPKT +#ifdef TIOCGPTLCK + { "TIOCGPTLCK", (unsigned long) TIOCGPTLCK }, +#endif // TIOCGPTLCK +#ifdef TIOCGPTN + { "TIOCGPTN", (unsigned long) TIOCGPTN }, +#endif // TIOCGPTN +#ifdef TIOCGPTPEER + { "TIOCGPTPEER", (unsigned long) TIOCGPTPEER }, +#endif // TIOCGPTPEER +#ifdef TIOCGRS485 + { "TIOCGRS485", (unsigned long) TIOCGRS485 }, +#endif // TIOCGRS485 +#ifdef TIOCGSERIAL + { "TIOCGSERIAL", (unsigned long) TIOCGSERIAL }, +#endif // TIOCGSERIAL +#ifdef TIOCGSID + { "TIOCGSID", (unsigned long) TIOCGSID }, +#endif // TIOCGSID +#ifdef TIOCGSOFTCAR + { "TIOCGSOFTCAR", (unsigned long) TIOCGSOFTCAR }, +#endif // TIOCGSOFTCAR +#ifdef TIOCGWINSZ + { "TIOCGWINSZ", (unsigned long) TIOCGWINSZ }, +#endif // TIOCGWINSZ +#ifdef TIOCINQ + { "TIOCINQ", (unsigned long) TIOCINQ }, +#endif // TIOCINQ +#ifdef TIOCLINUX + { "TIOCLINUX", (unsigned long) TIOCLINUX }, +#endif // TIOCLINUX +#ifdef TIOCMBIC + { "TIOCMBIC", (unsigned long) TIOCMBIC }, +#endif // TIOCMBIC +#ifdef TIOCMBIS + { "TIOCMBIS", (unsigned long) TIOCMBIS }, +#endif // TIOCMBIS +#ifdef TIOCM_CAR + { "TIOCM_CAR", (unsigned long) TIOCM_CAR }, +#endif // TIOCM_CAR +#ifdef TIOCM_CD + { "TIOCM_CD", (unsigned long) TIOCM_CD }, +#endif // TIOCM_CD +#ifdef TIOCM_CTS + { "TIOCM_CTS", (unsigned long) TIOCM_CTS }, +#endif // TIOCM_CTS +#ifdef TIOCM_DSR + { "TIOCM_DSR", (unsigned long) TIOCM_DSR }, +#endif // TIOCM_DSR +#ifdef TIOCM_DTR + { "TIOCM_DTR", (unsigned long) TIOCM_DTR }, +#endif // TIOCM_DTR +#ifdef TIOCMGET + { "TIOCMGET", (unsigned long) TIOCMGET }, +#endif // TIOCMGET +#ifdef TIOCMIWAIT + { "TIOCMIWAIT", (unsigned long) TIOCMIWAIT }, +#endif // TIOCMIWAIT +#ifdef TIOCM_LE + { "TIOCM_LE", (unsigned long) TIOCM_LE }, +#endif // TIOCM_LE +#ifdef TIOCM_LOOP + { "TIOCM_LOOP", (unsigned long) TIOCM_LOOP }, +#endif // TIOCM_LOOP +#ifdef TIOCM_OUT1 + { "TIOCM_OUT1", (unsigned long) TIOCM_OUT1 }, +#endif // TIOCM_OUT1 +#ifdef TIOCM_OUT2 + { "TIOCM_OUT2", (unsigned long) TIOCM_OUT2 }, +#endif // TIOCM_OUT2 +#ifdef TIOCM_RI + { "TIOCM_RI", (unsigned long) TIOCM_RI }, +#endif // TIOCM_RI +#ifdef TIOCM_RNG + { "TIOCM_RNG", (unsigned long) TIOCM_RNG }, +#endif // TIOCM_RNG +#ifdef TIOCM_RTS + { "TIOCM_RTS", (unsigned long) TIOCM_RTS }, +#endif // TIOCM_RTS +#ifdef TIOCMSET + { "TIOCMSET", (unsigned long) TIOCMSET }, +#endif // TIOCMSET +#ifdef TIOCM_SR + { "TIOCM_SR", (unsigned long) TIOCM_SR }, +#endif // TIOCM_SR +#ifdef TIOCM_ST + { "TIOCM_ST", (unsigned long) TIOCM_ST }, +#endif // TIOCM_ST +#ifdef TIOCNOTTY + { "TIOCNOTTY", (unsigned long) TIOCNOTTY }, +#endif // TIOCNOTTY +#ifdef TIOCNXCL + { "TIOCNXCL", (unsigned long) TIOCNXCL }, +#endif // TIOCNXCL +#ifdef TIOCOUTQ + { "TIOCOUTQ", (unsigned long) TIOCOUTQ }, +#endif // TIOCOUTQ +#ifdef TIOCPKT + { "TIOCPKT", (unsigned long) TIOCPKT }, +#endif // TIOCPKT +#ifdef TIOCPKT_DATA + { "TIOCPKT_DATA", (unsigned long) TIOCPKT_DATA }, +#endif // TIOCPKT_DATA +#ifdef TIOCPKT_DOSTOP + { "TIOCPKT_DOSTOP", (unsigned long) TIOCPKT_DOSTOP }, +#endif // TIOCPKT_DOSTOP +#ifdef TIOCPKT_FLUSHREAD + { "TIOCPKT_FLUSHREAD", (unsigned long) TIOCPKT_FLUSHREAD }, +#endif // TIOCPKT_FLUSHREAD +#ifdef TIOCPKT_FLUSHWRITE + { "TIOCPKT_FLUSHWRITE", (unsigned long) TIOCPKT_FLUSHWRITE }, +#endif // TIOCPKT_FLUSHWRITE +#ifdef TIOCPKT_IOCTL + { "TIOCPKT_IOCTL", (unsigned long) TIOCPKT_IOCTL }, +#endif // TIOCPKT_IOCTL +#ifdef TIOCPKT_NOSTOP + { "TIOCPKT_NOSTOP", (unsigned long) TIOCPKT_NOSTOP }, +#endif // TIOCPKT_NOSTOP +#ifdef TIOCPKT_START + { "TIOCPKT_START", (unsigned long) TIOCPKT_START }, +#endif // TIOCPKT_START +#ifdef TIOCPKT_STOP + { "TIOCPKT_STOP", (unsigned long) TIOCPKT_STOP }, +#endif // TIOCPKT_STOP +#ifdef TIOCSBRK + { "TIOCSBRK", (unsigned long) TIOCSBRK }, +#endif // TIOCSBRK +#ifdef TIOCSCTTY + { "TIOCSCTTY", (unsigned long) TIOCSCTTY }, +#endif // TIOCSCTTY +#ifdef TIOCSERCONFIG + { "TIOCSERCONFIG", (unsigned long) TIOCSERCONFIG }, +#endif // TIOCSERCONFIG +#ifdef TIOCSERGETLSR + { "TIOCSERGETLSR", (unsigned long) TIOCSERGETLSR }, +#endif // TIOCSERGETLSR +#ifdef TIOCSERGETMULTI + { "TIOCSERGETMULTI", (unsigned long) TIOCSERGETMULTI }, +#endif // TIOCSERGETMULTI +#ifdef TIOCSERGSTRUCT + { "TIOCSERGSTRUCT", (unsigned long) TIOCSERGSTRUCT }, +#endif // TIOCSERGSTRUCT +#ifdef TIOCSERGWILD + { "TIOCSERGWILD", (unsigned long) TIOCSERGWILD }, +#endif // TIOCSERGWILD +#ifdef TIOCSERSETMULTI + { "TIOCSERSETMULTI", (unsigned long) TIOCSERSETMULTI }, +#endif // TIOCSERSETMULTI +#ifdef TIOCSERSWILD + { "TIOCSERSWILD", (unsigned long) TIOCSERSWILD }, +#endif // TIOCSERSWILD +#ifdef TIOCSER_TEMT + { "TIOCSER_TEMT", (unsigned long) TIOCSER_TEMT }, +#endif // TIOCSER_TEMT +#ifdef TIOCSETD + { "TIOCSETD", (unsigned long) TIOCSETD }, +#endif // TIOCSETD +#ifdef TIOCSIG + { "TIOCSIG", (unsigned long) TIOCSIG }, +#endif // TIOCSIG +#ifdef TIOCSISO7816 + { "TIOCSISO7816", (unsigned long) TIOCSISO7816 }, +#endif // TIOCSISO7816 +#ifdef TIOCSLCKTRMIOS + { "TIOCSLCKTRMIOS", (unsigned long) TIOCSLCKTRMIOS }, +#endif // TIOCSLCKTRMIOS +#ifdef TIOCSPGRP + { "TIOCSPGRP", (unsigned long) TIOCSPGRP }, +#endif // TIOCSPGRP +#ifdef TIOCSPTLCK + { "TIOCSPTLCK", (unsigned long) TIOCSPTLCK }, +#endif // TIOCSPTLCK +#ifdef TIOCSRS485 + { "TIOCSRS485", (unsigned long) TIOCSRS485 }, +#endif // TIOCSRS485 +#ifdef TIOCSSERIAL + { "TIOCSSERIAL", (unsigned long) TIOCSSERIAL }, +#endif // TIOCSSERIAL +#ifdef TIOCSSOFTCAR + { "TIOCSSOFTCAR", (unsigned long) TIOCSSOFTCAR }, +#endif // TIOCSSOFTCAR +#ifdef TIOCSTI + { "TIOCSTI", (unsigned long) TIOCSTI }, +#endif // TIOCSTI +#ifdef TIOCSWINSZ + { "TIOCSWINSZ", (unsigned long) TIOCSWINSZ }, +#endif // TIOCSWINSZ +#ifdef TIOCVHANGUP + { "TIOCVHANGUP", (unsigned long) TIOCVHANGUP }, +#endif // TIOCVHANGUP +#ifdef TOSTOP + { "TOSTOP", (unsigned long) TOSTOP }, +#endif // TOSTOP +#ifdef UART_CLEAR_FIFO + { "UART_CLEAR_FIFO", (unsigned long) UART_CLEAR_FIFO }, +#endif // UART_CLEAR_FIFO +#ifdef UART_NATSEMI + { "UART_NATSEMI", (unsigned long) UART_NATSEMI }, +#endif // UART_NATSEMI +#ifdef UART_STARTECH + { "UART_STARTECH", (unsigned long) UART_STARTECH }, +#endif // UART_STARTECH +#ifdef UART_USE_FIFO + { "UART_USE_FIFO", (unsigned long) UART_USE_FIFO }, +#endif // UART_USE_FIFO +#ifdef VDISCARD + { "VDISCARD", (unsigned long) VDISCARD }, +#endif // VDISCARD +#ifdef VEOF + { "VEOF", (unsigned long) VEOF }, +#endif // VEOF +#ifdef VEOL + { "VEOL", (unsigned long) VEOL }, +#endif // VEOL +#ifdef VEOL2 + { "VEOL2", (unsigned long) VEOL2 }, +#endif // VEOL2 +#ifdef VERASE + { "VERASE", (unsigned long) VERASE }, +#endif // VERASE +#ifdef VINTR + { "VINTR", (unsigned long) VINTR }, +#endif // VINTR +#ifdef VKILL + { "VKILL", (unsigned long) VKILL }, +#endif // VKILL +#ifdef VLNEXT + { "VLNEXT", (unsigned long) VLNEXT }, +#endif // VLNEXT +#ifdef VMIN + { "VMIN", (unsigned long) VMIN }, +#endif // VMIN +#ifdef VQUIT + { "VQUIT", (unsigned long) VQUIT }, +#endif // VQUIT +#ifdef VREPRINT + { "VREPRINT", (unsigned long) VREPRINT }, +#endif // VREPRINT +#ifdef VSTART + { "VSTART", (unsigned long) VSTART }, +#endif // VSTART +#ifdef VSTOP + { "VSTOP", (unsigned long) VSTOP }, +#endif // VSTOP +#ifdef VSUSP + { "VSUSP", (unsigned long) VSUSP }, +#endif // VSUSP +#ifdef VSWTC + { "VSWTC", (unsigned long) VSWTC }, +#endif // VSWTC +#ifdef VT0 + { "VT0", (unsigned long) VT0 }, +#endif // VT0 +#ifdef VT1 + { "VT1", (unsigned long) VT1 }, +#endif // VT1 +#ifdef VTDLY + { "VTDLY", (unsigned long) VTDLY }, +#endif // VTDLY +#ifdef VTIME + { "VTIME", (unsigned long) VTIME }, +#endif // VTIME +#ifdef VWERASE + { "VWERASE", (unsigned long) VWERASE }, +#endif // VWERASE +#ifdef WCHAR_MAX + { "WCHAR_MAX", (unsigned long) WCHAR_MAX }, +#endif // WCHAR_MAX +#ifdef WCHAR_MIN + { "WCHAR_MIN", (unsigned long) WCHAR_MIN }, +#endif // WCHAR_MIN #ifdef W_OK - {"W_OK", (unsigned long)W_OK}, + { "W_OK", (unsigned long) W_OK }, #endif // W_OK +#ifdef XATTR_LIST_MAX + { "XATTR_LIST_MAX", (unsigned long) XATTR_LIST_MAX }, +#endif // XATTR_LIST_MAX +#ifdef XATTR_NAME_MAX + { "XATTR_NAME_MAX", (unsigned long) XATTR_NAME_MAX }, +#endif // XATTR_NAME_MAX +#ifdef XATTR_SIZE_MAX + { "XATTR_SIZE_MAX", (unsigned long) XATTR_SIZE_MAX }, +#endif // XATTR_SIZE_MAX +#ifdef XCASE + { "XCASE", (unsigned long) XCASE }, +#endif // XCASE #ifdef X_OK - {"X_OK", (unsigned long)X_OK}, + { "X_OK", (unsigned long) X_OK }, #endif // X_OK - {NULL, 0}, +#ifdef XTABS + { "XTABS", (unsigned long) XTABS }, +#endif // XTABS + { NULL, 0 }, }; diff --git a/linux-x86/libsyscalls.gen.c b/linux-x86/libsyscalls.gen.c index db00274..e0b2e53 100644 --- a/linux-x86/libsyscalls.gen.c +++ b/linux-x86/libsyscalls.gen.c @@ -1,6 +1,6 @@ /* GENERATED BY MAKEFILE */ #include <stddef.h> -#include <asm/unistd.h> +#include "gen_syscalls-inl.h" #include "libsyscalls.h" const struct syscall_entry syscall_table[] = { #ifdef __NR_read @@ -957,5 +957,89 @@ const struct syscall_entry syscall_table[] = { #ifdef __NR_seccomp { "seccomp", __NR_seccomp }, #endif +#ifdef __NR_getrandom +{ "getrandom", __NR_getrandom }, +#endif +#ifdef __NR_memfd_create +{ "memfd_create", __NR_memfd_create }, +#endif +#ifdef __NR_kexec_file_load +{ "kexec_file_load", __NR_kexec_file_load }, +#endif +#ifdef __NR_bpf +{ "bpf", __NR_bpf }, +#endif +#ifdef __NR_execveat +{ "execveat", __NR_execveat }, +#endif +#ifdef __NR_userfaultfd +{ "userfaultfd", __NR_userfaultfd }, +#endif +#ifdef __NR_membarrier +{ "membarrier", __NR_membarrier }, +#endif +#ifdef __NR_mlock2 +{ "mlock2", __NR_mlock2 }, +#endif +#ifdef __NR_copy_file_range +{ "copy_file_range", __NR_copy_file_range }, +#endif +#ifdef __NR_preadv2 +{ "preadv2", __NR_preadv2 }, +#endif +#ifdef __NR_pwritev2 +{ "pwritev2", __NR_pwritev2 }, +#endif +#ifdef __NR_pkey_mprotect +{ "pkey_mprotect", __NR_pkey_mprotect }, +#endif +#ifdef __NR_pkey_alloc +{ "pkey_alloc", __NR_pkey_alloc }, +#endif +#ifdef __NR_pkey_free +{ "pkey_free", __NR_pkey_free }, +#endif +#ifdef __NR_statx +{ "statx", __NR_statx }, +#endif +#ifdef __NR_io_pgetevents +{ "io_pgetevents", __NR_io_pgetevents }, +#endif +#ifdef __NR_rseq +{ "rseq", __NR_rseq }, +#endif +#ifdef __NR_pidfd_send_signal +{ "pidfd_send_signal", __NR_pidfd_send_signal }, +#endif +#ifdef __NR_io_uring_setup +{ "io_uring_setup", __NR_io_uring_setup }, +#endif +#ifdef __NR_io_uring_enter +{ "io_uring_enter", __NR_io_uring_enter }, +#endif +#ifdef __NR_io_uring_register +{ "io_uring_register", __NR_io_uring_register }, +#endif +#ifdef __NR_open_tree +{ "open_tree", __NR_open_tree }, +#endif +#ifdef __NR_move_mount +{ "move_mount", __NR_move_mount }, +#endif +#ifdef __NR_fsopen +{ "fsopen", __NR_fsopen }, +#endif +#ifdef __NR_fsconfig +{ "fsconfig", __NR_fsconfig }, +#endif +#ifdef __NR_fsmount +{ "fsmount", __NR_fsmount }, +#endif +#ifdef __NR_fspick +{ "fspick", __NR_fspick }, +#endif { NULL, -1 }, }; + +const size_t syscall_table_size = + sizeof(syscall_table) / sizeof(syscall_table[0]); diff --git a/minijail0.1 b/minijail0.1 index 820d3ca..7dc6f74 100644 --- a/minijail0.1 +++ b/minijail0.1 @@ -12,12 +12,14 @@ Runs PROGRAM inside a sandbox. Run using the alternate syscall table named \fItable\fR. Only available on kernels and architectures that support the \fBPR_ALT_SYSCALL\fR option of \fBprctl\fR(2). .TP -\fB-b <src>[,<dest>[,<writeable>]] +\fB-b <src>[,[dest][,<writeable>]] Bind-mount \fIsrc\fR into the chroot directory at \fIdest\fR, optionally writeable. The \fIsrc\fR path must be an absolute path. + If \fIdest\fR is not specified, it will default to \fIsrc\fR. If the destination does not exist, it will be created as a file or directory based on the \fIsrc\fR type (including missing parent directories). + To create a writable bind-mount set \fIwritable\fR to \fB1\fR. If not specified it will default to \fB0\fR (read-only). .TP @@ -48,8 +50,12 @@ Change root (using \fBchroot\fR(2)) to \fIdir\fR. \fB-d\fR, \fB--mount-dev\fR Create a new /dev mount with a minimal set of nodes. Implies \fB-v\fR. Additional nodes can be bound with the \fB-b\fR or \fB-k\fR options. -The initial set of nodes are: full null tty urandom zero. -Symlinks are also created for: fd ptmx stderr stdin stdout. + +.nf +\[bu] The initial set of nodes are: full null tty urandom zero. +\[bu] Symlinks are also created for: fd ptmx stderr stdin stdout. +\[bu] Directores are also created for: shm. +.re .TP \fB-e[file]\fR Enter a new network namespace, or if \fIfile\fR is specified, enter an existing @@ -134,22 +140,22 @@ If the destination does not exist, it will be created as a directory (including missing parent directories). .TP \fB-K[mode]\fR -Don't mark all existing mounts as MS_PRIVATE. +Don't mark all existing mounts as MS_SLAVE. This option is \fBdangerous\fR as it negates most of the functionality of \fB-v\fR. You very likely don't need this. You may specify a mount propagation mode in which case, that will be used -instead of the default MS_PRIVATE. See the \fBmount\fR(2) man page and the +instead of the default MS_SLAVE. See the \fBmount\fR(2) man page and the kernel docs \fIDocumentation/filesystems/sharedsubtree.txt\fR for more technical details, but a brief guide: .IP \[bu] \fBslave\fR Changes in the parent mount namespace will propagate in, but changes in this mount namespace will not propagate back out. This is usually -what people want to use. +what people want to use, and is the default behavior if you don't specify \fB-K\fR. .IP \[bu] \fBprivate\fR No changes in either mount namespace will propagate. -This is the default behavior if you don't specify \fB-K\fR. +This provides the most isolation. .IP \[bu] \fBshared\fR Changes in the parent and this mount namespace will freely propagate back and forth. This is not recommended. @@ -252,8 +258,8 @@ Change users to the specified \fIuser\fR name, or numeric user ID \fIuid\fR. Enter a new user namespace (implies \fB-p\fR). .TP \fB-v\fR -Run inside a new VFS namespace. This option makes the program's mountpoints -independent of the rest of the system's. +Run inside a new VFS namespace. This option prevents mounts performed by the +program from affecting the rest of the system (but see \fB-K\fR). .TP \fB-V <file>\fR Enter the VFS namespace specified by \fIfile\fR. @@ -306,6 +312,21 @@ arch-and-kernel-version-specific pre-compiled BPF binary (such as the ones produced by \fBparse_seccomp_policy\fR). Note that the filter might be different based on the runtime environment; see \fBminijail0\fR(5) for more details. +.TP +\fB--allow-speculative-execution\fR +Allow speculative execution features that may cause data leaks across processes. +This passes the \fISECCOMP_FILTER_FLAG_SPEC_ALLOW\fR flag to seccomp which +disables mitigations against certain speculative execution attacks; namely +Branch Target Injection (spectre-v2) and Speculative Store Bypass (spectre-v4). +These mitigations incur a runtime performance hit, so it is useful to be able +to disable them in order to quantify their performance impact. + +\fBWARNING:\fR It is dangerous to use this option on programs that process +untrusted input, which is normally what Minijail is used for. Do not enable +this option unless you know what you're doing. + +See the kernel documentation \fIDocumentation/userspace-api/spec_ctrl.rst\fR +and \fIDocumentation/admin-guide/hw-vuln/spectre.rst\fR for more information. .SH SANDBOXING PROFILES The following sandboxing profiles are supported: .TP diff --git a/minijail0.sh b/minijail0.sh new file mode 100755 index 0000000..cd5303a --- /dev/null +++ b/minijail0.sh @@ -0,0 +1,9 @@ +#!/bin/sh +# Copyright 2020 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# Helper for running minijail0 in a compiled checkout. + +dir="$(dirname "$0")" +exec "${dir}/minijail0" --preload-library="${dir}/libminijailpreload.so" "$@" diff --git a/minijail0_cli.c b/minijail0_cli.c index c8b700b..3461579 100644 --- a/minijail0_cli.c +++ b/minijail0_cli.c @@ -29,6 +29,30 @@ #define IDMAP_LEN 32U #define DEFAULT_TMP_SIZE (64 * 1024 * 1024) +/* + * A malloc() that aborts on failure. We only implement this in the CLI as + * the library should return ENOMEM errors when allocations fail. + */ +static void *xmalloc(size_t size) +{ + void *ret = malloc(size); + if (!ret) { + perror("malloc() failed"); + exit(1); + } + return ret; +} + +static char *xstrdup(const char *s) +{ + char *ret = strdup(s); + if (!ret) { + perror("strdup() failed"); + exit(1); + } + return ret; +} + static void set_user(struct minijail *j, const char *arg, uid_t *out_uid, gid_t *out_gid) { @@ -40,13 +64,16 @@ static void set_user(struct minijail *j, const char *arg, uid_t *out_uid, return; } - if (lookup_user(arg, out_uid, out_gid)) { - fprintf(stderr, "Bad user: '%s'\n", arg); + int ret = lookup_user(arg, out_uid, out_gid); + if (ret) { + fprintf(stderr, "Bad user '%s': %s\n", arg, strerror(-ret)); exit(1); } - if (minijail_change_user(j, arg)) { - fprintf(stderr, "Bad user: '%s'\n", arg); + ret = minijail_change_user(j, arg); + if (ret) { + fprintf(stderr, "minijail_change_user('%s') failed: %s\n", arg, + strerror(-ret)); exit(1); } } @@ -61,15 +88,13 @@ static void set_group(struct minijail *j, const char *arg, gid_t *out_gid) return; } - if (lookup_group(arg, out_gid)) { - fprintf(stderr, "Bad group: '%s'\n", arg); + int ret = lookup_group(arg, out_gid); + if (ret) { + fprintf(stderr, "Bad group '%s': %s\n", arg, strerror(-ret)); exit(1); } - if (minijail_change_group(j, arg)) { - fprintf(stderr, "Bad group: '%s'\n", arg); - exit(1); - } + minijail_change_gid(j, *out_gid); } /* @@ -81,15 +106,16 @@ static void suppl_group_add(size_t *suppl_gids_count, gid_t **suppl_gids, char *end = NULL; int groupid = strtod(arg, &end); gid_t gid; + int ret; if (!*end && *arg) { /* A gid number has been specified, proceed. */ gid = groupid; - } else if (lookup_group(arg, &gid)) { + } else if ((ret = lookup_group(arg, &gid))) { /* * A group name has been specified, * but doesn't exist: we bail out. */ - fprintf(stderr, "Bad group: '%s'\n", arg); + fprintf(stderr, "Bad group '%s': %s\n", arg, strerror(-ret)); exit(1); } @@ -287,7 +313,7 @@ static void add_mount(struct minijail *j, char *arg) static char *build_idmap(id_t id, id_t lowerid) { int ret; - char *idmap = malloc(IDMAP_LEN); + char *idmap = xmalloc(IDMAP_LEN); ret = snprintf(idmap, IDMAP_LEN, "%d %d 1", id, lowerid); if (ret < 0 || (size_t)ret >= IDMAP_LEN) { free(idmap); @@ -485,12 +511,7 @@ static void read_seccomp_filter(const char *filter_path, rewind(f); filter->len = filter_size / sizeof(struct sock_filter); - filter->filter = malloc(filter_size); - if (!filter->filter) { - fclose(f); - fprintf(stderr, "failed to allocate memory for filter: %m"); - exit(1); - } + filter->filter = xmalloc(filter_size); if (fread(filter->filter, sizeof(struct sock_filter), filter->len, f) != filter->len) { fclose(f); @@ -506,7 +527,7 @@ static void usage(const char *progn) /* clang-format off */ printf("Usage: %s [-dGhHiIKlLnNprRstUvyYz]\n" " [-a <table>]\n" - " [-b <src>[,<dest>[,<writeable>]]] [-k <src>,<dest>,<type>[,<flags>[,<data>]]]\n" + " [-b <src>[,[dest][,<writeable>]]] [-k <src>,<dest>,<type>[,<flags>[,<data>]]]\n" " [-c <caps>] [-C <dir>] [-P <dir>] [-e[file]] [-f <file>] [-g <group>]\n" " [-m[<uid> <loweruid> <count>]*] [-M[<gid> <lowergid> <count>]*] [--profile <name>]\n" " [-R <type,cur,max>] [-S <file>] [-t[size]] [-T <type>] [-u <user>] [-V <file>]\n" @@ -599,7 +620,9 @@ static void usage(const char *progn) " E.g., '-S /usr/share/filters/<prog>.$(uname -m).bpf'.\n" " Requires -n when not running as root.\n" " The user is responsible for ensuring that the binary\n" - " was compiled for the correct architecture / kernel version.\n"); + " was compiled for the correct architecture / kernel version.\n" + " --allow-speculative-execution:Allow speculative execution and disable\n" + " mitigations for speculative execution attacks.\n"); /* clang-format on */ } @@ -624,6 +647,7 @@ int parse_args(struct minijail *j, int argc, char *const argv[], int binding = 0; int chroot = 0, pivot_root = 0; int mount_ns = 0, change_remount = 0; + const char *remount_mode = NULL; int inherit_suppl_gids = 0, keep_suppl_gids = 0; int caps = 0, ambient_caps = 0; int seccomp = -1; @@ -651,6 +675,7 @@ int parse_args(struct minijail *j, int argc, char *const argv[], {"preload-library", required_argument, 0, 132}, {"seccomp-bpf-binary", required_argument, 0, 133}, {"add-suppl-group", required_argument, 0, 134}, + {"allow-speculative-execution", no_argument, 0, 135}, {0, 0, 0, 0}, }; /* clang-format on */ @@ -725,11 +750,7 @@ int parse_args(struct minijail *j, int argc, char *const argv[], add_mount(j, optarg); break; case 'K': - if (optarg) { - set_remount_mode(j, optarg); - } else { - minijail_skip_remount_private(j); - } + remount_mode = optarg; change_remount = 1; break; case 'P': @@ -759,6 +780,37 @@ int parse_args(struct minijail *j, int argc, char *const argv[], break; case 'v': minijail_namespace_vfs(j); + /* + * Set the default mount propagation in the command-line + * tool to MS_SLAVE. + * + * When executing the sandboxed program in a new mount + * namespace the Minijail library will by default + * remount all mounts with the MS_PRIVATE flag. While + * this is an appropriate, safe default for the library, + * MS_PRIVATE can be problematic: unmount events will + * not propagate into mountpoints marked as MS_PRIVATE. + * This means that if a mount is unmounted in the root + * mount namespace, it will not be unmounted in the + * non-root mount namespace. + * This in turn can be problematic because activity in + * the non-root mount namespace can now directly + * influence the root mount namespace (e.g. preventing + * re-mounts of said mount), which would be a privilege + * inversion. + * + * Setting the default in the command-line to MS_SLAVE + * will still prevent mounts from leaking out of the + * non-root mount namespace but avoid these + * privilege-inversion issues. + * For cases where mounts should not flow *into* the + * namespace either, the user can pass -Kprivate. + * Note that mounts are marked as MS_PRIVATE by default + * by the kernel, so unless the init process (like + * systemd) or something else marks them as shared, this + * won't do anything. + */ + minijail_remount_mode(j, MS_SLAVE); mount_ns = 1; break; case 'V': @@ -818,7 +870,7 @@ int parse_args(struct minijail *j, int argc, char *const argv[], uidmap = NULL; } if (optarg) - uidmap = strdup(optarg); + uidmap = xstrdup(optarg); break; case 'M': set_gidmap = 1; @@ -827,7 +879,7 @@ int parse_args(struct minijail *j, int argc, char *const argv[], gidmap = NULL; } if (optarg) - gidmap = strdup(optarg); + gidmap = xstrdup(optarg); break; case 'a': if (0 != minijail_use_alt_syscall(j, optarg)) { @@ -908,6 +960,9 @@ int parse_args(struct minijail *j, int argc, char *const argv[], suppl_group_add(&suppl_gids_count, &suppl_gids, optarg); break; + case 135: + minijail_set_seccomp_filter_allow_speculation(j); + break; default: usage(argv[0]); exit(opt == 'h' ? 0 : 1); @@ -969,6 +1024,15 @@ int parse_args(struct minijail *j, int argc, char *const argv[], exit(1); } + /* Configure the remount flag here to avoid having -v override it. */ + if (change_remount) { + if (remount_mode != NULL) { + set_remount_mode(j, remount_mode); + } else { + minijail_skip_remount_private(j); + } + } + /* * Proceed in setting the supplementary gids specified on the * cmdline options. diff --git a/minijail0_cli_unittest.cc b/minijail0_cli_unittest.cc index a9d739b..76ff37f 100644 --- a/minijail0_cli_unittest.cc +++ b/minijail0_cli_unittest.cc @@ -240,7 +240,7 @@ TEST_F(CliTest, valid_logging) { "syslog", }; - for (const auto profile : profiles) { + for (const auto& profile : profiles) { argv[1] = profile; ASSERT_TRUE(parse_args_(argv)); } @@ -319,7 +319,7 @@ TEST_F(CliTest, valid_profile) { "minimalistic-mountns-nodev", }; - for (const auto profile : profiles) { + for (const auto& profile : profiles) { argv[1] = profile; ASSERT_TRUE(parse_args_(argv)); } diff --git a/parse_seccomp_policy.cc b/parse_seccomp_policy.cc index 38fcbee..000b80d 100644 --- a/parse_seccomp_policy.cc +++ b/parse_seccomp_policy.cc @@ -82,6 +82,7 @@ int main(int argc, char** argv) { .action = ACTION_RET_KILL, .allow_logging = 0, .allow_syscalls_for_logging = 0, + .allow_duplicate_syscalls = allow_duplicate_syscalls(), }; struct sock_fprog fp; diff --git a/OWNERS.rust b/rust/OWNERS index 1db5ac3..1db5ac3 100644 --- a/OWNERS.rust +++ b/rust/OWNERS diff --git a/Cargo.toml b/rust/minijail-sys/Cargo.toml index bf55389..934c605 100644 --- a/Cargo.toml +++ b/rust/minijail-sys/Cargo.toml @@ -1,6 +1,7 @@ [package] name = "minijail-sys" version = "0.0.11" +description = "Provides raw (unsafe) bindings to the libminijail C library." authors = ["The Chromium OS Authors"] edition = "2018" build = "build.rs" diff --git a/build.rs b/rust/minijail-sys/build.rs index 51cef31..8c7ea6d 100644 --- a/build.rs +++ b/rust/minijail-sys/build.rs @@ -19,7 +19,7 @@ fn main() -> io::Result<()> { return Ok(()); } - let current_dir = env::var("CARGO_MANIFEST_DIR").unwrap(); + let current_dir = env::var("CARGO_MANIFEST_DIR").unwrap() + "/../.."; let out_dir = env::var("OUT_DIR").unwrap(); let profile = env::var("PROFILE").unwrap(); diff --git a/lib.rs b/rust/minijail-sys/lib.rs index 3206bde..59db51e 100644 --- a/lib.rs +++ b/rust/minijail-sys/lib.rs @@ -13,7 +13,7 @@ // unsigned long int on amd64, which will end up being 32-bit on 32-bit platforms. // // As a workaround to let us commit these bindings and still use them on 32-bit platforms, the -// bindgen invocation blacklists some of the generated fixed-width types and redefines them +// bindgen invocation blocklists some of the generated fixed-width types and redefines them // manually as Rust fixed-width types. // // Generated in CrOS SDK chroot with: diff --git a/libminijail.rs b/rust/minijail-sys/libminijail.rs index bf1e5ae..594a479 100644 --- a/libminijail.rs +++ b/rust/minijail-sys/libminijail.rs @@ -1,4 +1,5 @@ /* automatically generated by rust-bindgen */ +#![allow(clippy::all)] pub type __rlim64_t = u64; pub type __u8 = u8; @@ -285,6 +286,9 @@ extern "C" { ) -> ::std::os::raw::c_int; } extern "C" { + pub fn minijail_copy_jail(from: *const minijail, out: *mut minijail) -> ::std::os::raw::c_int; +} +extern "C" { pub fn minijail_add_hook( j: *mut minijail, hook: minijail_hook_t, diff --git a/rust/minijail/Cargo.toml b/rust/minijail/Cargo.toml new file mode 100644 index 0000000..db0652f --- /dev/null +++ b/rust/minijail/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "minijail" +version = "0.2.1" +description = "Provides a safe Rust friendly interface to libminijail." +authors = ["The Chromium OS Authors"] +edition = "2018" + +[dependencies] +libc = "0.2.44" +minijail-sys = { path = "../minijail-sys" } # provided by ebuild + +[[test]] +name = "fork_remap" +path = "tests/fork_remap.rs" +harness = false diff --git a/rust/minijail/src/lib.rs b/rust/minijail/src/lib.rs new file mode 100644 index 0000000..ba59075 --- /dev/null +++ b/rust/minijail/src/lib.rs @@ -0,0 +1,1024 @@ +// Copyright 2017 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +use libc::pid_t; +use minijail_sys::*; +use std::ffi::CString; +use std::fmt::{self, Display}; +use std::fs; +use std::io; +use std::os::raw::{c_char, c_ulong, c_ushort}; +use std::os::unix::io::{AsRawFd, IntoRawFd, RawFd}; +use std::path::{Path, PathBuf}; +use std::ptr::{null, null_mut}; + +#[derive(Debug)] +pub enum Error { + // minijail failed to accept bind mount. + BindMount { + errno: i32, + src: PathBuf, + dst: PathBuf, + }, + // minijail failed to accept mount. + Mount { + errno: i32, + src: PathBuf, + dest: PathBuf, + fstype: String, + flags: usize, + data: String, + }, + /// Failure to count the number of threads in /proc/self/tasks. + CheckingMultiThreaded(io::Error), + /// minjail_new failed, this is an allocation failure. + CreatingMinijail, + /// minijail_fork failed with the given error code. + ForkingMinijail(i32), + /// Attempt to `fork` while already multithreaded. + ForkingWhileMultiThreaded, + /// The seccomp policy path doesn't exist. + SeccompPath(PathBuf), + /// The string passed in didn't parse to a valid CString. + StrToCString(String), + /// The path passed in didn't parse to a valid CString. + PathToCString(PathBuf), + /// Failed to call dup2 to set stdin, stdout, or stderr to /dev/null. + DupDevNull(i32), + /// Failed to set up /dev/null for FDs 0, 1, or 2. + OpenDevNull(io::Error), + /// Failed to read policy bpf from file. + ReadProgram(io::Error), + /// Setting the specified alt-syscall table failed with errno. Is the table in the kernel? + SetAltSyscallTable { errno: i32, name: String }, + /// Setting the specified rlimit failed with errno. + SetRlimit { errno: i32, kind: libc::c_int }, + /// chroot failed with the provided errno. + SettingChrootDirectory(i32, PathBuf), + /// pivot_root failed with the provided errno. + SettingPivotRootDirectory(i32, PathBuf), + /// There is an entry in /proc/self/fd that isn't a valid PID. + ReadFdDirEntry(io::Error), + /// /proc/self/fd failed to open. + ReadFdDir(io::Error), + /// An entry in /proc/self/fd is not an integer + ProcFd(String), + /// Minijail refused to preserve an FD in the inherit list of `fork()`. + PreservingFd(i32), + /// Program size is too large + ProgramTooLarge, + /// Alignment of file should be divisible by the alignment of sock_filter. + WrongProgramAlignment, + /// File size should be non-zero and a multiple of sock_filter + WrongProgramSize, + + /// The command was not found. + NoCommand, + /// The command could not be run. + NoAccess, + /// Process was killed by SIGSYS indicating a seccomp violation. + SeccompViolation(i32), + /// Process was killed by a signal other than SIGSYS. + Killed(u8), + /// Process finished returning a non-zero code. + ReturnCode(u8), +} + +impl Display for Error { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + use self::Error::*; + + match self { + BindMount { src, dst, errno } => write!( + f, + "failed to accept bind mount {} -> {}: {}", + src.display(), + dst.display(), + io::Error::from_raw_os_error(*errno), + ), + Mount { + errno, + src, + dest, + fstype, + flags, + data, + } => write!( + f, + "failed to accept mount {} -> {} of type {:?} with flags 0x{:x} \ + and data {:?}: {}", + src.display(), + dest.display(), + fstype, + flags, + data, + io::Error::from_raw_os_error(*errno), + ), + CheckingMultiThreaded(e) => write!( + f, + "Failed to count the number of threads from /proc/self/tasks {}", + e + ), + CreatingMinijail => write!(f, "minjail_new failed due to an allocation failure"), + ForkingMinijail(e) => write!(f, "minijail_fork failed with error {}", e), + ForkingWhileMultiThreaded => write!(f, "Attempt to call fork() while multithreaded"), + SeccompPath(p) => write!(f, "missing seccomp policy path: {}", p.display()), + StrToCString(s) => write!(f, "failed to convert string into CString: {}", s), + PathToCString(s) => write!(f, "failed to convert path into CString: {}", s.display()), + DupDevNull(errno) => write!( + f, + "failed to call dup2 to set stdin, stdout, or stderr to /dev/null: {}", + io::Error::from_raw_os_error(*errno), + ), + OpenDevNull(e) => write!( + f, + "fail to open /dev/null for setting FDs 0, 1, or 2: {}", + e, + ), + ReadProgram(e) => write!(f, "failed to read from bpf file: {}", e), + SetAltSyscallTable { name, errno } => write!( + f, + "failed to set alt-syscall table {}: {}", + name, + io::Error::from_raw_os_error(*errno), + ), + SetRlimit { errno, kind } => write!(f, "failed to set rlimit {}: {}", kind, errno), + SettingChrootDirectory(errno, p) => write!( + f, + "failed to set chroot {}: {}", + p.display(), + io::Error::from_raw_os_error(*errno), + ), + SettingPivotRootDirectory(errno, p) => write!( + f, + "failed to set pivot root {}: {}", + p.display(), + io::Error::from_raw_os_error(*errno), + ), + ReadFdDirEntry(e) => write!(f, "failed to read an entry in /proc/self/fd: {}", e), + ReadFdDir(e) => write!(f, "failed to open /proc/self/fd: {}", e), + ProcFd(s) => write!(f, "an entry in /proc/self/fd is not an integer: {}", s), + PreservingFd(e) => write!(f, "fork failed in minijail_preserve_fd with error {}", e), + ProgramTooLarge => write!(f, "bpf program is too large (max 64K instructions)"), + WrongProgramAlignment => write!( + f, + "the alignment of bpf file was not a multiple of that of sock_filter" + ), + WrongProgramSize => write!(f, "bpf file was empty or not a multiple of sock_filter"), + NoCommand => write!(f, "command was not found"), + NoAccess => write!(f, "unable to execute command"), + SeccompViolation(s) => write!(f, "seccomp violation syscall #{}", s), + Killed(s) => write!(f, "killed with signal number {}", s), + ReturnCode(e) => write!(f, "exited with code {}", e), + } + } +} + +impl std::error::Error for Error {} + +pub type Result<T> = std::result::Result<T, Error>; + +/// Configuration to jail a process based on wrapping libminijail. +/// +/// Intentionally leave out everything related to `minijail_run`. Forking is +/// hard to reason about w.r.t. memory and resource safety. It is better to avoid +/// forking from rust code. Leave forking to the library user, who can make +/// an informed decision about when to fork to minimize risk. +/// # Examples +/// * Load seccomp policy - like "minijail0 -n -S myfilter.policy" +/// +/// ``` +/// # use minijail::Minijail; +/// # fn seccomp_filter_test() -> Result<(), ()> { +/// let mut j = Minijail::new().map_err(|_| ())?; +/// j.no_new_privs(); +/// j.parse_seccomp_filters("my_filter.policy").map_err(|_| ())?; +/// j.use_seccomp_filter(); +/// unsafe { // `fork` will close all the programs FDs. +/// j.fork(None).map_err(|_| ())?; +/// } +/// # Ok(()) +/// # } +/// ``` +/// +/// * Keep stdin, stdout, and stderr open after jailing. +/// +/// ``` +/// # use minijail::Minijail; +/// # use std::os::unix::io::RawFd; +/// # fn seccomp_filter_test() -> Result<(), ()> { +/// let j = Minijail::new().map_err(|_| ())?; +/// let preserve_fds: Vec<RawFd> = vec![0, 1, 2]; +/// unsafe { // `fork` will close all the programs FDs. +/// j.fork(Some(&preserve_fds)).map_err(|_| ())?; +/// } +/// # Ok(()) +/// # } +/// ``` +/// # Errors +/// The `fork` function might not return an error if it fails after forking. A +/// partial jail is not recoverable and will instead result in killing the +/// process. +pub struct Minijail { + jail: *mut minijail, +} + +#[link(name = "c")] +extern "C" { + fn __libc_current_sigrtmax() -> libc::c_int; +} + +fn translate_wait_error(ret: libc::c_int) -> Result<()> { + if ret == 0 { + return Ok(()); + } + if ret == MINIJAIL_ERR_NO_COMMAND as libc::c_int { + return Err(Error::NoCommand); + } + if ret == MINIJAIL_ERR_NO_ACCESS as libc::c_int { + return Err(Error::NoAccess); + } + let sig_base: libc::c_int = MINIJAIL_ERR_SIG_BASE as libc::c_int; + let sig_max_code: libc::c_int = unsafe { __libc_current_sigrtmax() } + sig_base; + if ret > sig_base && ret <= sig_max_code { + return Err(Error::Killed( + (ret - MINIJAIL_ERR_SIG_BASE as libc::c_int) as u8, + )); + } + if ret > 0 && ret <= 0xff { + return Err(Error::ReturnCode(ret as u8)); + } + unreachable!(); +} + +impl Minijail { + /// Creates a new jail configuration. + pub fn new() -> Result<Minijail> { + let j = unsafe { + // libminijail actually owns the minijail structure. It will live until we call + // minijail_destroy. + minijail_new() + }; + if j.is_null() { + return Err(Error::CreatingMinijail); + } + Ok(Minijail { jail: j }) + } + + /// Clones self to a new `Minijail`. Useful because `fork` can only be called once on a + /// `Minijail`. + pub fn try_clone(&self) -> Result<Minijail> { + let jail_out = Minijail::new()?; + unsafe { + // Safe to clone one minijail to the other as minijail_clone doesn't modify the source + // jail(`self`) and leaves a valid minijail in the destination(`jail_out`). + let ret = minijail_copy_jail(self.jail, jail_out.jail); + if ret < 0 { + return Err(Error::ReturnCode(ret as u8)); + } + } + + Ok(jail_out) + } + + // The following functions are safe because they only set values in the + // struct already owned by minijail. The struct's lifetime is tied to + // `struct Minijail` so it is guaranteed to be valid + + pub fn change_uid(&mut self, uid: libc::uid_t) { + unsafe { + minijail_change_uid(self.jail, uid); + } + } + pub fn change_gid(&mut self, gid: libc::gid_t) { + unsafe { + minijail_change_gid(self.jail, gid); + } + } + pub fn change_user(&mut self, user: &str) -> Result<()> { + let user_cstring = CString::new(user).map_err(|_| Error::StrToCString(user.to_owned()))?; + unsafe { + minijail_change_user(self.jail, user_cstring.as_ptr()); + } + Ok(()) + } + pub fn change_group(&mut self, group: &str) -> Result<()> { + let group_cstring = + CString::new(group).map_err(|_| Error::StrToCString(group.to_owned()))?; + unsafe { + minijail_change_group(self.jail, group_cstring.as_ptr()); + } + Ok(()) + } + pub fn set_supplementary_gids(&mut self, ids: &[libc::gid_t]) { + unsafe { + minijail_set_supplementary_gids(self.jail, ids.len(), ids.as_ptr()); + } + } + pub fn keep_supplementary_gids(&mut self) { + unsafe { + minijail_keep_supplementary_gids(self.jail); + } + } + // rlim_t is defined in minijail-sys to be u64 on all platforms, to avoid + // issues on 32-bit platforms. It's also useful to us here to avoid + // libc::rlim64_t, which is not defined at all on Android. + pub fn set_rlimit(&mut self, kind: libc::c_int, cur: rlim_t, max: rlim_t) -> Result<()> { + let errno = unsafe { minijail_rlimit(self.jail, kind, cur, max) }; + if errno == 0 { + Ok(()) + } else { + Err(Error::SetRlimit { errno, kind }) + } + } + pub fn use_seccomp(&mut self) { + unsafe { + minijail_use_seccomp(self.jail); + } + } + pub fn no_new_privs(&mut self) { + unsafe { + minijail_no_new_privs(self.jail); + } + } + pub fn use_seccomp_filter(&mut self) { + unsafe { + minijail_use_seccomp_filter(self.jail); + } + } + pub fn set_seccomp_filter_tsync(&mut self) { + unsafe { + minijail_set_seccomp_filter_tsync(self.jail); + } + } + pub fn parse_seccomp_program<P: AsRef<Path>>(&mut self, path: P) -> Result<()> { + if !path.as_ref().is_file() { + return Err(Error::SeccompPath(path.as_ref().to_owned())); + } + + let buffer = fs::read(path).map_err(Error::ReadProgram)?; + if buffer.len() % std::mem::size_of::<sock_filter>() != 0 { + return Err(Error::WrongProgramSize); + } + let count = buffer.len() / std::mem::size_of::<sock_filter>(); + if count > (!0 as u16) as usize { + return Err(Error::ProgramTooLarge); + } + if buffer.as_ptr() as usize % std::mem::align_of::<sock_filter>() != 0 { + return Err(Error::WrongProgramAlignment); + } + + // Safe cast because we checked that the buffer address is divisible by the alignment of + // sock_filter. + #[allow(clippy::cast_ptr_alignment)] + let header = sock_fprog { + len: count as c_ushort, + filter: buffer.as_ptr() as *mut sock_filter, + }; + unsafe { + minijail_set_seccomp_filters(self.jail, &header); + } + Ok(()) + } + pub fn parse_seccomp_filters<P: AsRef<Path>>(&mut self, path: P) -> Result<()> { + if !path.as_ref().is_file() { + return Err(Error::SeccompPath(path.as_ref().to_owned())); + } + + let pathstring = path + .as_ref() + .as_os_str() + .to_str() + .ok_or_else(|| Error::PathToCString(path.as_ref().to_owned()))?; + let filename = + CString::new(pathstring).map_err(|_| Error::PathToCString(path.as_ref().to_owned()))?; + unsafe { + minijail_parse_seccomp_filters(self.jail, filename.as_ptr()); + } + Ok(()) + } + pub fn log_seccomp_filter_failures(&mut self) { + unsafe { + minijail_log_seccomp_filter_failures(self.jail); + } + } + pub fn use_caps(&mut self, capmask: u64) { + unsafe { + minijail_use_caps(self.jail, capmask); + } + } + pub fn capbset_drop(&mut self, capmask: u64) { + unsafe { + minijail_capbset_drop(self.jail, capmask); + } + } + pub fn set_ambient_caps(&mut self) { + unsafe { + minijail_set_ambient_caps(self.jail); + } + } + pub fn reset_signal_mask(&mut self) { + unsafe { + minijail_reset_signal_mask(self.jail); + } + } + pub fn run_as_init(&mut self) { + unsafe { + minijail_run_as_init(self.jail); + } + } + pub fn namespace_pids(&mut self) { + unsafe { + minijail_namespace_pids(self.jail); + } + } + pub fn namespace_user(&mut self) { + unsafe { + minijail_namespace_user(self.jail); + } + } + pub fn namespace_user_disable_setgroups(&mut self) { + unsafe { + minijail_namespace_user_disable_setgroups(self.jail); + } + } + pub fn namespace_vfs(&mut self) { + unsafe { + minijail_namespace_vfs(self.jail); + } + } + pub fn new_session_keyring(&mut self) { + unsafe { + minijail_new_session_keyring(self.jail); + } + } + pub fn skip_remount_private(&mut self) { + unsafe { + minijail_skip_remount_private(self.jail); + } + } + pub fn namespace_ipc(&mut self) { + unsafe { + minijail_namespace_ipc(self.jail); + } + } + pub fn namespace_net(&mut self) { + unsafe { + minijail_namespace_net(self.jail); + } + } + pub fn namespace_cgroups(&mut self) { + unsafe { + minijail_namespace_cgroups(self.jail); + } + } + pub fn remount_proc_readonly(&mut self) { + unsafe { + minijail_remount_proc_readonly(self.jail); + } + } + pub fn set_remount_mode(&mut self, mode: c_ulong) { + unsafe { minijail_remount_mode(self.jail, mode) } + } + pub fn uidmap(&mut self, uid_map: &str) -> Result<()> { + let map_cstring = + CString::new(uid_map).map_err(|_| Error::StrToCString(uid_map.to_owned()))?; + unsafe { + minijail_uidmap(self.jail, map_cstring.as_ptr()); + } + Ok(()) + } + pub fn gidmap(&mut self, gid_map: &str) -> Result<()> { + let map_cstring = + CString::new(gid_map).map_err(|_| Error::StrToCString(gid_map.to_owned()))?; + unsafe { + minijail_gidmap(self.jail, map_cstring.as_ptr()); + } + Ok(()) + } + pub fn inherit_usergroups(&mut self) { + unsafe { + minijail_inherit_usergroups(self.jail); + } + } + pub fn use_alt_syscall(&mut self, table_name: &str) -> Result<()> { + let table_name_string = + CString::new(table_name).map_err(|_| Error::StrToCString(table_name.to_owned()))?; + let ret = unsafe { minijail_use_alt_syscall(self.jail, table_name_string.as_ptr()) }; + if ret < 0 { + return Err(Error::SetAltSyscallTable { + errno: ret, + name: table_name.to_owned(), + }); + } + Ok(()) + } + pub fn enter_chroot<P: AsRef<Path>>(&mut self, dir: P) -> Result<()> { + let pathstring = dir + .as_ref() + .as_os_str() + .to_str() + .ok_or_else(|| Error::PathToCString(dir.as_ref().to_owned()))?; + let dirname = + CString::new(pathstring).map_err(|_| Error::PathToCString(dir.as_ref().to_owned()))?; + let ret = unsafe { minijail_enter_chroot(self.jail, dirname.as_ptr()) }; + if ret < 0 { + return Err(Error::SettingChrootDirectory(ret, dir.as_ref().to_owned())); + } + Ok(()) + } + pub fn enter_pivot_root<P: AsRef<Path>>(&mut self, dir: P) -> Result<()> { + let pathstring = dir + .as_ref() + .as_os_str() + .to_str() + .ok_or_else(|| Error::PathToCString(dir.as_ref().to_owned()))?; + let dirname = + CString::new(pathstring).map_err(|_| Error::PathToCString(dir.as_ref().to_owned()))?; + let ret = unsafe { minijail_enter_pivot_root(self.jail, dirname.as_ptr()) }; + if ret < 0 { + return Err(Error::SettingPivotRootDirectory( + ret, + dir.as_ref().to_owned(), + )); + } + Ok(()) + } + pub fn mount<P1: AsRef<Path>, P2: AsRef<Path>>( + &mut self, + src: P1, + dest: P2, + fstype: &str, + flags: usize, + ) -> Result<()> { + self.mount_with_data(src, dest, fstype, flags, "") + } + pub fn mount_with_data<P1: AsRef<Path>, P2: AsRef<Path>>( + &mut self, + src: P1, + dest: P2, + fstype: &str, + flags: usize, + data: &str, + ) -> Result<()> { + let src_os = src + .as_ref() + .as_os_str() + .to_str() + .ok_or_else(|| Error::PathToCString(src.as_ref().to_owned()))?; + let src_path = CString::new(src_os).map_err(|_| Error::StrToCString(src_os.to_owned()))?; + let dest_os = dest + .as_ref() + .as_os_str() + .to_str() + .ok_or_else(|| Error::PathToCString(dest.as_ref().to_owned()))?; + let dest_path = + CString::new(dest_os).map_err(|_| Error::StrToCString(dest_os.to_owned()))?; + let fstype_string = + CString::new(fstype).map_err(|_| Error::StrToCString(fstype.to_owned()))?; + let data_string = CString::new(data).map_err(|_| Error::StrToCString(data.to_owned()))?; + let ret = unsafe { + minijail_mount_with_data( + self.jail, + src_path.as_ptr(), + dest_path.as_ptr(), + fstype_string.as_ptr(), + flags as _, + data_string.as_ptr(), + ) + }; + if ret < 0 { + return Err(Error::Mount { + errno: ret, + src: src.as_ref().to_owned(), + dest: dest.as_ref().to_owned(), + fstype: fstype.to_owned(), + flags, + data: data.to_owned(), + }); + } + Ok(()) + } + pub fn mount_dev(&mut self) { + unsafe { + minijail_mount_dev(self.jail); + } + } + pub fn mount_tmp(&mut self) { + unsafe { + minijail_mount_tmp(self.jail); + } + } + pub fn mount_tmp_size(&mut self, size: usize) { + unsafe { + minijail_mount_tmp_size(self.jail, size); + } + } + pub fn mount_bind<P1: AsRef<Path>, P2: AsRef<Path>>( + &mut self, + src: P1, + dest: P2, + writable: bool, + ) -> Result<()> { + let src_os = src + .as_ref() + .as_os_str() + .to_str() + .ok_or_else(|| Error::PathToCString(src.as_ref().to_owned()))?; + let src_path = CString::new(src_os).map_err(|_| Error::StrToCString(src_os.to_owned()))?; + let dest_os = dest + .as_ref() + .as_os_str() + .to_str() + .ok_or_else(|| Error::PathToCString(dest.as_ref().to_owned()))?; + let dest_path = + CString::new(dest_os).map_err(|_| Error::StrToCString(dest_os.to_owned()))?; + let ret = unsafe { + minijail_bind( + self.jail, + src_path.as_ptr(), + dest_path.as_ptr(), + writable as _, + ) + }; + if ret < 0 { + return Err(Error::BindMount { + errno: ret, + src: src.as_ref().to_owned(), + dst: dest.as_ref().to_owned(), + }); + } + Ok(()) + } + + /// Forks and execs a child and puts it in the previously configured minijail. + /// FDs 0, 1, and 2 are overwritten with /dev/null FDs unless they are included in the + /// inheritable_fds list. This function may abort in the child on error because a partially + /// entered jail isn't recoverable. + pub fn run<P: AsRef<Path>, S: AsRef<str>>( + &self, + cmd: P, + inheritable_fds: &[RawFd], + args: &[S], + ) -> Result<pid_t> { + self.run_remap( + cmd, + &inheritable_fds + .iter() + .map(|&a| (a, a)) + .collect::<Vec<(RawFd, RawFd)>>(), + args, + ) + } + + /// Behaves the same as `run()` except `inheritable_fds` is a list of fd + /// mappings rather than just a list of fds to preserve. + pub fn run_remap<P: AsRef<Path>, S: AsRef<str>>( + &self, + cmd: P, + inheritable_fds: &[(RawFd, RawFd)], + args: &[S], + ) -> Result<pid_t> { + let cmd_os = cmd + .as_ref() + .to_str() + .ok_or_else(|| Error::PathToCString(cmd.as_ref().to_owned()))?; + let cmd_cstr = CString::new(cmd_os).map_err(|_| Error::StrToCString(cmd_os.to_owned()))?; + + // Converts each incoming `args` string to a `CString`, and then puts each `CString` pointer + // into a null terminated array, suitable for use as an argv parameter to `execve`. + let mut args_cstr = Vec::with_capacity(args.len()); + let mut args_array = Vec::with_capacity(args.len()); + for arg in args { + let arg_cstr = CString::new(arg.as_ref()) + .map_err(|_| Error::StrToCString(arg.as_ref().to_owned()))?; + args_array.push(arg_cstr.as_ptr()); + args_cstr.push(arg_cstr); + } + args_array.push(null()); + + for (src_fd, dst_fd) in inheritable_fds { + let ret = unsafe { minijail_preserve_fd(self.jail, *src_fd, *dst_fd) }; + if ret < 0 { + return Err(Error::PreservingFd(ret)); + } + } + + let dev_null = fs::OpenOptions::new() + .read(true) + .write(true) + .open("/dev/null") + .map_err(Error::OpenDevNull)?; + // Set stdin, stdout, and stderr to /dev/null unless they are in the inherit list. + // These will only be closed when this process exits. + for io_fd in &[libc::STDIN_FILENO, libc::STDOUT_FILENO, libc::STDERR_FILENO] { + if !inheritable_fds.iter().any(|(_, fd)| *fd == *io_fd) { + let ret = unsafe { minijail_preserve_fd(self.jail, dev_null.as_raw_fd(), *io_fd) }; + if ret < 0 { + return Err(Error::PreservingFd(ret)); + } + } + } + + unsafe { + minijail_close_open_fds(self.jail); + } + + let mut pid = 0; + let ret = unsafe { + minijail_run_pid_pipes( + self.jail, + cmd_cstr.as_ptr(), + args_array.as_ptr() as *const *mut c_char, + &mut pid, + null_mut(), + null_mut(), + null_mut(), + ) + }; + if ret < 0 { + return Err(Error::ForkingMinijail(ret)); + } + Ok(pid) + } + + /// Forks a child and puts it in the previously configured minijail. + /// + /// # Safety + /// `fork` is unsafe because it closes all open FD for this process. That + /// could cause a lot of trouble if not handled carefully. FDs 0, 1, and 2 + /// are overwritten with /dev/null FDs unless they are included in the + /// inheritable_fds list. + /// + /// Also, any Rust objects that own fds may try to close them after the fork. If they belong + /// to a fd number that was mapped to, the mapped fd will be closed instead. + /// + /// This Function may abort in the child on error because a partially + /// entered jail isn't recoverable. + pub unsafe fn fork(&self, inheritable_fds: Option<&[RawFd]>) -> Result<pid_t> { + let m: Vec<(RawFd, RawFd)> = inheritable_fds + .unwrap_or(&[]) + .iter() + .map(|&a| (a, a)) + .collect(); + self.fork_remap(&m) + } + + /// Behaves the same as `fork()` except `inheritable_fds` is a list of fd + /// mappings rather than just a list of fds to preserve. + /// + /// # Safety + /// See `fork`. + pub unsafe fn fork_remap(&self, inheritable_fds: &[(RawFd, RawFd)]) -> Result<pid_t> { + if !is_single_threaded().map_err(Error::CheckingMultiThreaded)? { + // This test will fail during `cargo test` because the test harness always spawns a test + // thread. We will make an exception for that case because the tests for this module + // should always be run in a serial fashion using `--test-threads=1`. + #[cfg(not(test))] + return Err(Error::ForkingWhileMultiThreaded); + } + + for (src_fd, dst_fd) in inheritable_fds { + let ret = minijail_preserve_fd(self.jail, *src_fd, *dst_fd); + if ret < 0 { + return Err(Error::PreservingFd(ret)); + } + } + + let dev_null = fs::OpenOptions::new() + .read(true) + .write(true) + .open("/dev/null") + .map_err(Error::OpenDevNull)?; + // Set stdin, stdout, and stderr to /dev/null unless they are in the inherit list. + // These will only be closed when this process exits. + for io_fd in &[libc::STDIN_FILENO, libc::STDOUT_FILENO, libc::STDERR_FILENO] { + if !inheritable_fds.iter().any(|(_, fd)| *fd == *io_fd) { + let ret = minijail_preserve_fd(self.jail, dev_null.as_raw_fd(), *io_fd); + if ret < 0 { + return Err(Error::PreservingFd(ret)); + } + } + } + + minijail_close_open_fds(self.jail); + + let ret = minijail_fork(self.jail); + if ret < 0 { + return Err(Error::ForkingMinijail(ret)); + } + if ret == 0 { + // Safe because dev_null was remapped. + dev_null.into_raw_fd(); + } + Ok(ret as pid_t) + } + + pub fn wait(&self) -> Result<()> { + let ret: libc::c_int; + // This is safe because it does not modify the struct. + unsafe { + ret = minijail_wait(self.jail); + } + translate_wait_error(ret) + } + + /// Send a SIGTERM to the child process and wait for its return code. + pub fn kill(&self) -> Result<()> { + let ret = unsafe { + // The kill does not change any internal state. + minijail_kill(self.jail) + }; + // minijail_kill waits for the process, so also translate the returned wait error. + translate_wait_error(ret) + } +} + +impl Drop for Minijail { + /// Frees the Minijail created in Minijail::new. + fn drop(&mut self) { + unsafe { + // Destroys the minijail's memory. It is safe to do here because all references to + // this object have been dropped. + minijail_destroy(self.jail); + } + } +} + +// Count the number of files in the directory specified by `path`. +fn count_dir_entries<P: AsRef<Path>>(path: P) -> io::Result<usize> { + Ok(fs::read_dir(path)?.count()) +} + +// Return true if the current thread is the only thread in the process. +fn is_single_threaded() -> io::Result<bool> { + match count_dir_entries("/proc/self/task") { + Ok(1) => Ok(true), + Ok(_) => Ok(false), + Err(e) => Err(e), + } +} + +#[cfg(test)] +mod tests { + use std::process::exit; + + use super::*; + + const SHELL: &str = "/bin/sh"; + const EMPTY_STRING_SLICE: &[&str] = &[]; + + #[test] + fn create_and_free() { + unsafe { + let j = minijail_new(); + assert_ne!(std::ptr::null_mut(), j); + minijail_destroy(j); + } + + let j = Minijail::new().unwrap(); + drop(j); + } + + #[test] + // Test that setting a seccomp filter with no-new-privs works as non-root. + // This is equivalent to minijail0 -n -S <seccomp_policy> + fn seccomp_no_new_privs() { + let mut j = Minijail::new().unwrap(); + j.no_new_privs(); + j.parse_seccomp_filters("src/test_filter.policy").unwrap(); + j.use_seccomp_filter(); + if unsafe { j.fork(None).unwrap() } == 0 { + exit(0); + } + } + + #[test] + // Test that open FDs get closed and that FDs in the inherit list are left open. + fn close_fds() { + unsafe { + // Using libc to open/close FDs for testing. + const FILE_PATH: &[u8] = b"/dev/null\0"; + let j = Minijail::new().unwrap(); + let first = libc::open(FILE_PATH.as_ptr() as *const c_char, libc::O_RDONLY); + assert!(first >= 0); + let second = libc::open(FILE_PATH.as_ptr() as *const c_char, libc::O_RDONLY); + assert!(second >= 0); + let fds: Vec<RawFd> = vec![0, 1, 2, first]; + if j.fork(Some(&fds)).unwrap() == 0 { + assert!(libc::close(second) < 0); // Should fail as second should be closed already. + assert_eq!(libc::close(first), 0); // Should succeed as first should be untouched. + exit(0); + } + } + } + + macro_rules! expect_result { + ($call:expr, $expected:pat) => { + let got = $call; + match got { + $expected => {} + _ => { + panic!("got {:?} expected {:?}", got, stringify!($expected)); + } + } + }; + } + + #[test] + fn wait_success() { + let j = Minijail::new().unwrap(); + j.run("/bin/true", &[1, 2], &EMPTY_STRING_SLICE).unwrap(); + expect_result!(j.wait(), Ok(())); + } + + #[test] + fn wait_killed() { + let j = Minijail::new().unwrap(); + j.run( + SHELL, + &[1, 2], + &[SHELL, "-c", "kill -9 $$ &\n/usr/bin/sleep 5"], + ) + .unwrap(); + expect_result!(j.wait(), Err(Error::Killed(9))); + } + + #[test] + fn wait_returncode() { + let j = Minijail::new().unwrap(); + j.run("/bin/false", &[1, 2], &EMPTY_STRING_SLICE).unwrap(); + expect_result!(j.wait(), Err(Error::ReturnCode(1))); + } + + #[test] + fn wait_noaccess() { + let j = Minijail::new().unwrap(); + j.run("/dev/null", &[1, 2], &EMPTY_STRING_SLICE).unwrap(); + expect_result!(j.wait(), Err(Error::NoAccess)); + } + + #[test] + fn wait_nocommand() { + let j = Minijail::new().unwrap(); + j.run("/bin/does not exist", &[1, 2], &EMPTY_STRING_SLICE) + .unwrap(); + expect_result!(j.wait(), Err(Error::NoCommand)); + } + + #[test] + fn kill_success() { + let j = Minijail::new().unwrap(); + j.run( + Path::new("usr/bin/sleep"), + &[1, 2], + &["/usr/bin/sleep", "5"], + ) + .unwrap(); + const EXPECTED_SIGNAL: u8 = libc::SIGTERM as u8; + expect_result!(j.kill(), Err(Error::Killed(EXPECTED_SIGNAL))); + } + + #[test] + #[ignore] // privileged operation. + fn chroot() { + let mut j = Minijail::new().unwrap(); + j.enter_chroot(".").unwrap(); + if unsafe { j.fork(None).unwrap() } == 0 { + exit(0); + } + } + + #[test] + #[ignore] // privileged operation. + fn namespace_vfs() { + let mut j = Minijail::new().unwrap(); + j.namespace_vfs(); + if unsafe { j.fork(None).unwrap() } == 0 { + exit(0); + } + } + + #[test] + fn run() { + let j = Minijail::new().unwrap(); + j.run("/bin/true", &[], &EMPTY_STRING_SLICE).unwrap(); + } + + #[test] + fn run_clone() { + let j = Minijail::new().unwrap(); + let b = j.try_clone().unwrap(); + // Pass the same FDs to both clones and make sure they don't conflict. + j.run("/bin/true", &[1, 2], &EMPTY_STRING_SLICE).unwrap(); + b.run("/bin/true", &[1, 2], &EMPTY_STRING_SLICE).unwrap(); + } + + #[test] + fn run_string_vec() { + let j = Minijail::new().unwrap(); + let args = vec!["ignored".to_string()]; + j.run(Path::new("/bin/true"), &[], &args).unwrap(); + } +} diff --git a/rust/minijail/src/test_filter.policy b/rust/minijail/src/test_filter.policy new file mode 100644 index 0000000..9f4c943 --- /dev/null +++ b/rust/minijail/src/test_filter.policy @@ -0,0 +1,7 @@ +close: 1 +exit: 1 +futex: 1 +getpid: 1 +lseek: 1 +read: 1 +write: 1 diff --git a/rust/minijail/tests/fork_remap.rs b/rust/minijail/tests/fork_remap.rs new file mode 100644 index 0000000..6cf3415 --- /dev/null +++ b/rust/minijail/tests/fork_remap.rs @@ -0,0 +1,101 @@ +// Copyright 2021 The Chromium OS Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +//! A test of Minijail::fork_remap. +//! +//! It needs to be run on its own because it forks the process and by default cargo test is +//! multi-threaded, and we do not want copies of the other worker threads leaking into the child +//! process. + +use std::fs::{read_link, File, OpenOptions}; +use std::io::{self, Read}; +use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; +use std::path::Path; + +use minijail::Minijail; + +const DEV_NULL: &str = "/dev/null"; +const DEV_ZERO: &str = "/dev/zero"; +const PROC_CMDLINE: &str = "/proc/self/cmdline"; + +fn open_path(path: &str) -> Result<File, io::Error> { + OpenOptions::new() + .read(true) + .write(false) + .open(Path::new(path)) +} + +fn main() { + let mut check_file1 = open_path(DEV_ZERO).unwrap(); + let mut check_file2 = open_path(PROC_CMDLINE).unwrap(); + let j = Minijail::new().unwrap(); + + let mut stdio_expected = String::new(); + let mut file2_expected = String::new(); + for &p in &[0, 1, 2, check_file1.as_raw_fd(), check_file2.as_raw_fd()] { + let path = format!("/proc/self/fd/{}", p); + let target = read_link(Path::new(&path)); + eprintln!("P: {} -> {:?}", p, &target); + if p == 2 { + stdio_expected = target.unwrap().to_string_lossy().to_string(); + } else if p == check_file2.as_raw_fd() { + file2_expected = target.unwrap().to_string_lossy().to_string(); + } + } + + // Swap fd1 and fd2. + let dest_fd1: RawFd = check_file2.as_raw_fd(); + let dest_fd2: RawFd = check_file1.as_raw_fd(); + + if unsafe { + j.fork_remap(&[ + // fd 0 tests stdio mapped to /dev/null. + (2, 1), // One-to-many. + (2, 2), // Identity. + (check_file1.as_raw_fd(), dest_fd1), // Cross-over. + (check_file2.as_raw_fd(), dest_fd2), // Cross-over. + ]) + } + .unwrap() + != 0 + { + j.wait().unwrap(); + eprintln!("Parent done."); + return; + } + + // Safe because we are re-taking ownership of remapped fds after forking. + unsafe { + check_file1.into_raw_fd(); + check_file1 = File::from_raw_fd(dest_fd1); + + check_file2.into_raw_fd(); + check_file2 = File::from_raw_fd(dest_fd2); + } + + for (p, expected) in &[ + (0, DEV_NULL), + (1, &stdio_expected), + (2, &stdio_expected), + (dest_fd1, DEV_ZERO), + (dest_fd2, &file2_expected), + ] { + let path = format!("/proc/self/fd/{}", p); + let target = read_link(Path::new(&path)); + eprintln!(" C: {} -> {:?}", p, &target); + if !matches!(&target, Ok(p) if p == Path::new(expected)) { + panic!(" C: got {:?}; expected Ok({:?})", target, expected); + } + } + + const BUFFER_LEN: usize = 16; + let mut buffer = [0xffu8; BUFFER_LEN]; + check_file1.read_exact(&mut buffer).unwrap(); + assert_eq!(&buffer, &[0u8; BUFFER_LEN]); + + let mut file2_contents = Vec::<u8>::new(); + check_file2.read_to_end(&mut file2_contents).unwrap(); + + eprintln!(" Child done."); +} diff --git a/syscall_filter.c b/syscall_filter.c index 2c389ae..fcdbaa8 100644 --- a/syscall_filter.c +++ b/syscall_filter.c @@ -123,6 +123,13 @@ void append_ret_kill(struct filter_block *head) append_filter_block(head, filter, ONE_INSTR); } +void append_ret_kill_process(struct filter_block *head) +{ + struct sock_filter *filter = new_instr_buf(ONE_INSTR); + set_bpf_ret_kill_process(filter); + append_filter_block(head, filter, ONE_INSTR); +} + void append_ret_trap(struct filter_block *head) { struct sock_filter *filter = new_instr_buf(ONE_INSTR); @@ -154,12 +161,47 @@ void append_allow_syscall(struct filter_block *head, int nr) append_filter_block(head, filter, len); } +void copy_parser_state(struct parser_state *src, struct parser_state *dest) +{ + const char *filename = strdup(src->filename); + if (!filename) + pdie("strdup(src->filename) failed"); + + dest->line_number = src->line_number; + dest->filename = filename; +} + +/* + * Inserts the current state into the array of previous syscall states at the + * index |ind| if it is a newly encountered syscall. Returns true if it is a + * newly encountered syscall and false if it is a duplicate. + */ +bool insert_and_check_duplicate_syscall(struct parser_state **previous_syscalls, + struct parser_state *state, size_t ind) +{ + if (ind >= get_num_syscalls()) { + die("syscall index %zu out of range: %zu total syscalls", ind, + get_num_syscalls()); + } + struct parser_state *prev_state_ptr = previous_syscalls[ind]; + if (prev_state_ptr == NULL) { + previous_syscalls[ind] = calloc(1, sizeof(struct parser_state)); + if (!previous_syscalls[ind]) + die("could not allocate parser_state buffer"); + copy_parser_state(state, previous_syscalls[ind]); + return true; + } + return false; +} + void allow_logging_syscalls(struct filter_block *head) { unsigned int i; + for (i = 0; i < log_syscalls_len; i++) { warn("allowing syscall: %s", log_syscalls[i]); - append_allow_syscall(head, lookup_syscall(log_syscalls[i])); + append_allow_syscall(head, + lookup_syscall(log_syscalls[i], NULL)); } } @@ -303,6 +345,9 @@ int compile_errno(struct parser_state *state, struct filter_block *head, case ACTION_RET_KILL: append_ret_kill(head); break; + case ACTION_RET_KILL_PROCESS: + append_ret_kill_process(head); + break; case ACTION_RET_TRAP: append_ret_trap(head); break; @@ -447,6 +492,9 @@ struct filter_block *compile_policy_line(struct parser_state *state, int nr, case ACTION_RET_KILL: append_ret_kill(head); break; + case ACTION_RET_KILL_PROCESS: + append_ret_kill_process(head); + break; case ACTION_RET_TRAP: append_ret_trap(head); break; @@ -552,6 +600,10 @@ static ssize_t getmultiline(char **lineptr, size_t *n, FILE *stream) /* Merge the lines. */ *n = ret + next_ret + 2; line = realloc(line, *n); + if (!line) { + free(next_line); + return -1; + } line[ret] = ' '; memcpy(&line[ret + 1], next_line, next_ret + 1); free(next_line); @@ -563,6 +615,7 @@ int compile_file(const char *filename, FILE *policy_file, struct filter_block *head, struct filter_block **arg_blocks, struct bpf_labels *labels, const struct filter_options *filteropts, + struct parser_state **previous_syscalls, unsigned int include_level) { /* clang-format off */ @@ -626,6 +679,7 @@ int compile_file(const char *filename, FILE *policy_file, } if (compile_file(filename, included_file, head, arg_blocks, labels, filteropts, + previous_syscalls, include_level + 1) == -1) { compiler_warn(&state, "'@include %s' failed", filename); @@ -657,7 +711,8 @@ int compile_file(const char *filename, FILE *policy_file, } syscall_name = strip(syscall_name); - int nr = lookup_syscall(syscall_name); + size_t ind = 0; + int nr = lookup_syscall(syscall_name, &ind); if (nr < 0) { compiler_warn(&state, "nonexistent syscall '%s'", syscall_name); @@ -680,6 +735,16 @@ int compile_file(const char *filename, FILE *policy_file, goto free_line; } + if (!insert_and_check_duplicate_syscall(previous_syscalls, + &state, ind)) { + if (!filteropts->allow_duplicate_syscalls) + ret = -1; + compiler_warn(&state, "syscall %s redefined here", + lookup_syscall_name(nr)); + compiler_warn(previous_syscalls[ind], + "previous definition here"); + } + /* * For each syscall, add either a simple ALLOW, * or an arg filter block. @@ -752,6 +817,14 @@ int compile_filter(const char *filename, FILE *initial_file, struct filter_block *head = new_filter_block(); struct filter_block *arg_blocks = NULL; + /* + * Create the data structure that will keep track of what system + * calls we have already defined if the option is true. + */ + size_t num_syscalls = get_num_syscalls(); + struct parser_state **previous_syscalls = + calloc(num_syscalls, sizeof(*previous_syscalls)); + /* Start filter by validating arch. */ struct sock_filter *valid_arch = new_instr_buf(ARCH_VALIDATION_LEN); size_t len = bpf_validate_arch(valid_arch); @@ -771,7 +844,8 @@ int compile_filter(const char *filename, FILE *initial_file, allow_logging_syscalls(head); if (compile_file(filename, initial_file, head, &arg_blocks, &labels, - filteropts, 0 /* include_level */) != 0) { + filteropts, previous_syscalls, + 0 /* include_level */) != 0) { warn("compile_filter: compile_file() failed"); ret = -1; goto free_filter; @@ -785,6 +859,9 @@ int compile_filter(const char *filename, FILE *initial_file, case ACTION_RET_KILL: append_ret_kill(head); break; + case ACTION_RET_KILL_PROCESS: + append_ret_kill_process(head); + break; case ACTION_RET_TRAP: append_ret_trap(head); break; @@ -815,6 +892,8 @@ int compile_filter(const char *filename, FILE *initial_file, struct sock_filter *final_filter = calloc(final_filter_len, sizeof(struct sock_filter)); + if (!final_filter) + die("could not allocate final BPF filter"); if (flatten_block_list(head, final_filter, 0, final_filter_len) < 0) { free(final_filter); @@ -842,6 +921,7 @@ free_filter: free_block_list(head); free_block_list(arg_blocks); free_label_strings(&labels); + free_previous_syscalls(previous_syscalls); return ret; } @@ -875,3 +955,16 @@ void free_block_list(struct filter_block *head) free(prev); } } + +void free_previous_syscalls(struct parser_state **previous_syscalls) +{ + size_t num_syscalls = get_num_syscalls(); + for (size_t i = 0; i < num_syscalls; i++) { + struct parser_state *state = previous_syscalls[i]; + if (state) { + free((char *)state->filename); + free(state); + } + } + free(previous_syscalls); +} diff --git a/syscall_filter.h b/syscall_filter.h index 019f3f0..304f8c0 100644 --- a/syscall_filter.h +++ b/syscall_filter.h @@ -9,6 +9,8 @@ #ifndef SYSCALL_FILTER_H #define SYSCALL_FILTER_H +#include <stdbool.h> + #include "bpf.h" #ifdef __cplusplus @@ -29,12 +31,18 @@ struct parser_state { size_t line_number; }; -enum block_action { ACTION_RET_KILL = 0, ACTION_RET_TRAP, ACTION_RET_LOG }; +enum block_action { + ACTION_RET_KILL = 0, + ACTION_RET_TRAP, + ACTION_RET_LOG, + ACTION_RET_KILL_PROCESS, +}; struct filter_options { enum block_action action; int allow_logging; int allow_syscalls_for_logging; + bool allow_duplicate_syscalls; }; struct bpf_labels; @@ -49,6 +57,7 @@ int compile_file(const char *filename, FILE *policy_file, struct filter_block *head, struct filter_block **arg_blocks, struct bpf_labels *labels, const struct filter_options *filteropts, + struct parser_state **previous_syscalls, unsigned int include_level); int compile_filter(const char *filename, FILE *policy_file, @@ -59,8 +68,16 @@ struct filter_block *new_filter_block(void); int flatten_block_list(struct filter_block *head, struct sock_filter *filter, size_t index, size_t cap); void free_block_list(struct filter_block *head); +void free_previous_syscalls(struct parser_state **previous_syscalls); int seccomp_can_softfail(void); +static inline bool allow_duplicate_syscalls(void) +{ +#if defined(ALLOW_DUPLICATE_SYSCALLS) + return true; +#endif + return false; +} #ifdef __cplusplus }; /* extern "C" */ diff --git a/syscall_filter_unittest.cc b/syscall_filter_unittest.cc index 771dced..74f79da 100644 --- a/syscall_filter_unittest.cc +++ b/syscall_filter_unittest.cc @@ -48,11 +48,13 @@ int test_compile_filter( FILE* policy_file, struct sock_fprog* prog, enum block_action action = ACTION_RET_KILL, - enum use_logging allow_logging = NO_LOGGING) { + enum use_logging allow_logging = NO_LOGGING, + bool allow_dup_syscalls = true) { struct filter_options filteropts { .action = action, .allow_logging = allow_logging != NO_LOGGING, .allow_syscalls_for_logging = allow_logging == USE_SIGSYS_LOGGING, + .allow_duplicate_syscalls = allow_dup_syscalls, }; return compile_filter(filename.c_str(), policy_file, prog, &filteropts); } @@ -65,14 +67,23 @@ int test_compile_file( struct bpf_labels* labels, enum block_action action = ACTION_RET_KILL, enum use_logging allow_logging = NO_LOGGING, - unsigned int include_level = 0) { + unsigned int include_level = 0, + bool allow_dup_syscalls = false) { struct filter_options filteropts { .action = action, .allow_logging = allow_logging != NO_LOGGING, .allow_syscalls_for_logging = allow_logging == USE_SIGSYS_LOGGING, + .allow_duplicate_syscalls = allow_dup_syscalls, }; - return compile_file(filename.c_str(), policy_file, head, arg_blocks, labels, - &filteropts, include_level); + size_t num_syscalls = get_num_syscalls(); + struct parser_state **previous_syscalls = + (struct parser_state **)calloc(num_syscalls, + sizeof(struct parser_state *)); + int res = compile_file(filename.c_str(), policy_file, head, arg_blocks, + labels, &filteropts, previous_syscalls, + include_level); + free_previous_syscalls(previous_syscalls); + return res; } struct filter_block* test_compile_policy_line( @@ -88,120 +99,6 @@ struct filter_block* test_compile_policy_line( } // namespace -TEST(util, parse_constant_unsigned) { - char *end; - long int c = 0; - std::string constant; - -#if defined(BITS32) - constant = "0x80000000"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - EXPECT_EQ(0x80000000U, static_cast<unsigned long int>(c)); - -#elif defined(BITS64) - constant = "0x8000000000000000"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - EXPECT_EQ(0x8000000000000000UL, static_cast<unsigned long int>(c)); -#endif -} - -TEST(util, parse_constant_unsigned_toobig) { - char *end; - long int c = 0; - std::string constant; - -#if defined(BITS32) - constant = "0x100000000"; // Too big for 32-bit unsigned long int. - c = parse_constant(const_cast<char*>(constant.data()), &end); - // Error case should return 0. - EXPECT_EQ(0, c); - -#elif defined(BITS64) - constant = "0x10000000000000000"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - // Error case should return 0. - EXPECT_EQ(0, c); -#endif -} - -TEST(util, parse_constant_signed) { - char *end; - long int c = 0; - std::string constant = "-1"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - EXPECT_EQ(-1, c); -} - -TEST(util, parse_constant_signed_toonegative) { - char *end; - long int c = 0; - std::string constant; - -#if defined(BITS32) - constant = "-0x80000001"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - // Error case should return 0. - EXPECT_EQ(0, c); - -#elif defined(BITS64) - constant = "-0x8000000000000001"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - // Error case should return 0. - EXPECT_EQ(0, c); -#endif -} - -TEST(util, parse_constant_complements) { - char* end; - long int c = 0; - std::string constant; - -#if defined(BITS32) - constant = "~0x005AF0FF|~0xFFA50FFF"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - EXPECT_EQ(c, 0xFFFFFF00); - constant = "0x0F|~(0x005AF000|0x00A50FFF)|0xF0"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - EXPECT_EQ(c, 0xFF0000FF); - -#elif defined(BITS64) - constant = "~0x00005A5AF0F0FFFF|~0xFFFFA5A50F0FFFFF"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - EXPECT_EQ(c, 0xFFFFFFFFFFFF0000UL); - constant = "0x00FF|~(0x00005A5AF0F00000|0x0000A5A50F0FFFFF)|0xFF00"; - c = parse_constant(const_cast<char*>(constant.data()), &end); - EXPECT_EQ(c, 0xFFFF00000000FFFFUL); -#endif -} - -TEST(util, parse_parenthesized_expresions) { - char* end; - - const std::vector<const char*> bad_expressions = { - "(1", "1)", "(1)1", "|(1)", "(1)|", "()", - "(", "((", "(()", "(()1", "1(0)", - }; - for (const auto* expression : bad_expressions) { - std::string mutable_expression = expression; - long int c = - parse_constant(const_cast<char*>(mutable_expression.data()), &end); - EXPECT_EQ(reinterpret_cast<const void*>(end), - reinterpret_cast<const void*>(mutable_expression.data())); - // Error case should return 0. - EXPECT_EQ(c, 0) << "For expression: \"" << expression << "\""; - } - - const std::vector<const char*> good_expressions = { - "(3)", "(1)|2", "1|(2)", "(1)|(2)", "((3))", "0|(1|2)", "(0|1|2)", - }; - for (const auto* expression : good_expressions) { - std::string mutable_expression = expression; - long int c = - parse_constant(const_cast<char*>(mutable_expression.data()), &end); - EXPECT_EQ(c, 3) << "For expression: \"" << expression << "\""; - } -} - /* Test that setting one BPF instruction works. */ TEST(bpf, set_bpf_instr) { struct sock_filter instr; @@ -1423,6 +1320,90 @@ TEST(FilterTest, seccomp_mode1) { free(actual.filter); } +TEST(FilterTest, seccomp_mode1_with_check) { + struct sock_fprog actual; + std::string policy = + "read: 1\n" + "write: 1\n" + "rt_sigreturn: 1\n" + "exit: 1\n"; + + FILE* policy_file = write_policy_to_pipe(policy); + ASSERT_NE(policy_file, nullptr); + + int res = test_compile_filter("policy", policy_file, &actual, + ACTION_RET_KILL, NO_LOGGING, false + /* allow duplicate syscalls */); + fclose(policy_file); + + /* + * Checks return value, filter length, and that the filter + * validates arch, loads syscall number, and + * only allows expected syscalls. + */ + ASSERT_EQ(res, 0); + EXPECT_EQ(actual.len, 13); + EXPECT_ARCH_VALIDATION(actual.filter); + EXPECT_EQ_STMT(actual.filter + ARCH_VALIDATION_LEN, + BPF_LD + BPF_W + BPF_ABS, + syscall_nr); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 1, __NR_read); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 3, __NR_write); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 5, + __NR_rt_sigreturn); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 7, __NR_exit); + EXPECT_EQ_STMT(actual.filter + ARCH_VALIDATION_LEN + 9, + BPF_RET + BPF_K, + SECCOMP_RET_KILL); + + free(actual.filter); +} + +/* + * This fails even with allow_duplicate_syscalls set to true because the + * creation of labels for the arguments causes conflicts which cause the + * compile_filter function to fail. + */ +TEST(FilterTest, duplicate_read_with_args) { + struct sock_fprog actual; + std::string policy = + "read: arg0 == 0\n" + "read: arg1 == 1\n" + "write: 1\n" + "rt_sigreturn: 1\n" + "exit: 1\n"; + + FILE* policy_file = write_policy_to_pipe(policy); + ASSERT_NE(policy_file, nullptr); + int res = test_compile_filter("policy", policy_file, &actual); + fclose(policy_file); + + ASSERT_EQ(res, -1); +} + +/* + * This does not fail because only one instance of read defines an argument. + */ +TEST(FilterTest, duplicate_read_with_one_arg) { + struct sock_fprog actual; + std::string policy = + "read: arg0 == 0\n" + "read: 1\n" + "write: 1\n" + "rt_sigreturn: 1\n" + "exit: 1\n"; + + FILE* policy_file = write_policy_to_pipe(policy); + ASSERT_NE(policy_file, nullptr); + int res = test_compile_filter("policy", policy_file, &actual); + fclose(policy_file); + + /* TODO: Don't know how to generate a correct value to validate the filter + * that is generated. */ + ASSERT_EQ(res, 0); + free(actual.filter); +} + TEST(FilterTest, seccomp_mode1_trap) { struct sock_fprog actual; std::string policy = @@ -1522,6 +1503,45 @@ TEST(FilterTest, seccomp_mode1_log_fails) { ASSERT_EQ(res, -1); } +TEST(FilterTest, seccomp_mode1_ret_kill_process) { + struct sock_fprog actual; + std::string policy = + "read: 1\n" + "write: 1\n" + "rt_sigreturn: 1\n" + "exit: 1\n"; + + FILE* policy_file = write_policy_to_pipe(policy); + ASSERT_NE(policy_file, nullptr); + + int res = test_compile_filter("policy", policy_file, &actual, ACTION_RET_KILL_PROCESS, + NO_LOGGING); + fclose(policy_file); + + /* + * Checks return value, filter length, and that the filter + * validates arch, loads syscall number, and + * only allows expected syscalls. + */ + ASSERT_EQ(res, 0); + EXPECT_EQ(actual.len, 13); + EXPECT_ARCH_VALIDATION(actual.filter); + EXPECT_EQ_STMT(actual.filter + ARCH_VALIDATION_LEN, + BPF_LD+BPF_W+BPF_ABS, syscall_nr); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 1, + __NR_read); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 3, + __NR_write); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 5, + __NR_rt_sigreturn); + EXPECT_ALLOW_SYSCALL(actual.filter + ARCH_VALIDATION_LEN + 7, + __NR_exit); + EXPECT_EQ_STMT(actual.filter + ARCH_VALIDATION_LEN + 9, BPF_RET+BPF_K, + SECCOMP_RET_KILL_PROCESS); + + free(actual.filter); +} + TEST(FilterTest, seccomp_read_write) { struct sock_fprog actual; std::string policy = @@ -1685,7 +1705,7 @@ TEST(FilterTest, log) { index = ARCH_VALIDATION_LEN + 1; for (i = 0; i < log_syscalls_len; i++) EXPECT_ALLOW_SYSCALL(actual.filter + (index + 2 * i), - lookup_syscall(log_syscalls[i])); + lookup_syscall(log_syscalls[i], NULL)); index += 2 * log_syscalls_len; @@ -1731,7 +1751,7 @@ TEST(FilterTest, allow_log_but_kill) { index = ARCH_VALIDATION_LEN + 1; for (i = 0; i < log_syscalls_len; i++) EXPECT_ALLOW_SYSCALL(actual.filter + (index + 2 * i), - lookup_syscall(log_syscalls[i])); + lookup_syscall(log_syscalls[i], NULL)); index += 2 * log_syscalls_len; @@ -1754,6 +1774,8 @@ TEST(FilterTest, frequency) { int res = test_compile_filter("policy", policy_file, &actual); fclose(policy_file); EXPECT_EQ(res, 0); + + free(actual.filter); } TEST(FilterTest, include_invalid_token) { @@ -1940,6 +1962,26 @@ TEST(FilterTest, include_same_syscalls) { free(actual.filter); } +TEST(FilterTest, include_same_syscalls_with_check) { + struct sock_fprog actual; + std::string policy = + "read: 1\n" + "write: 1\n" + "rt_sigreturn: 1\n" + "exit: 1\n" + "@include " + source_path("test/seccomp.policy") + "\n"; + + FILE* policy_file = write_policy_to_pipe(policy); + ASSERT_NE(policy_file, nullptr); + + int res = test_compile_filter("policy", policy_file, &actual, + ACTION_RET_KILL, NO_LOGGING, false + /* allow duplicate syscalls */); + fclose(policy_file); + + ASSERT_EQ(res, -1); +} + TEST(FilterTest, include_two) { struct sock_fprog actual; std::string policy = diff --git a/syscall_wrapper.h b/syscall_wrapper.h index ffdf707..7769108 100644 --- a/syscall_wrapper.h +++ b/syscall_wrapper.h @@ -3,4 +3,42 @@ * found in the LICENSE file. */ +#ifndef _SYSCALL_WRAPPER_H_ +#define _SYSCALL_WRAPPER_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Seccomp filter related flags. */ +#ifndef PR_SET_NO_NEW_PRIVS +# define PR_SET_NO_NEW_PRIVS 38 +#endif + +#ifndef SECCOMP_MODE_FILTER +#define SECCOMP_MODE_FILTER 2 /* Uses user-supplied filter. */ +#endif + +#ifndef SECCOMP_SET_MODE_STRICT +# define SECCOMP_SET_MODE_STRICT 0 +#endif +#ifndef SECCOMP_SET_MODE_FILTER +# define SECCOMP_SET_MODE_FILTER 1 +#endif + +#ifndef SECCOMP_FILTER_FLAG_TSYNC +# define SECCOMP_FILTER_FLAG_TSYNC 1 +#endif + +#ifndef SECCOMP_FILTER_FLAG_SPEC_ALLOW +# define SECCOMP_FILTER_FLAG_SPEC_ALLOW (1 << 2) +#endif +/* End seccomp filter related flags. */ + int sys_seccomp(unsigned int operation, unsigned int flags, void *args); + +#ifdef __cplusplus +}; /* extern "C" */ +#endif + +#endif /* _SYSCALL_WRAPPER_H_ */ @@ -22,6 +22,7 @@ #include <linux/securebits.h> +#include "syscall_wrapper.h" #include "util.h" /* @@ -48,6 +49,10 @@ _Static_assert(SECURE_ALL_BITS == 0x55, "SECURE_ALL_BITS == 0x55."); #endif +/* Used by lookup_(user|group) functions. */ +#define MAX_PWENT_SZ (1 << 20) +#define MAX_GRENT_SZ (1 << 20) + int secure_noroot_set_and_locked(uint64_t mask) { return (mask & (SECBIT_NOROOT | SECBIT_NOROOT_LOCKED)) == @@ -384,32 +389,45 @@ int lookup_user(const char *user, uid_t *uid, gid_t *gid) char *buf = NULL; struct passwd pw; struct passwd *ppw = NULL; + /* + * sysconf(_SC_GETPW_R_SIZE_MAX), under glibc, is documented to return + * a suggested starting size for the buffer, so let's try getting this + * size first, and fallback to a default othersise. + */ ssize_t sz = sysconf(_SC_GETPW_R_SIZE_MAX); if (sz == -1) sz = 65536; /* your guess is as good as mine... */ - /* - * sysconf(_SC_GETPW_R_SIZE_MAX), under glibc, is documented to return - * the maximum needed size of the buffer, so we don't have to search. - */ - buf = malloc(sz); - if (!buf) - return -ENOMEM; - getpwnam_r(user, &pw, buf, sz, &ppw); - /* - * We're safe to free the buffer here. The strings inside |pw| point - * inside |buf|, but we don't use any of them; this leaves the pointers - * dangling but it's safe. |ppw| points at |pw| if getpwnam_r(3) - * succeeded. - */ - free(buf); - /* getpwnam_r(3) does *not* set errno when |ppw| is NULL. */ - if (!ppw) - return -1; + do { + buf = malloc(sz); + if (!buf) + return -ENOMEM; + int err = getpwnam_r(user, &pw, buf, sz, &ppw); + /* + * We're safe to free the buffer here. The strings inside |pw| + * point inside |buf|, but we don't use any of them; this leaves + * the pointers dangling but it's safe. + * |ppw| points at |pw| if getpwnam_r(3) succeeded. + */ + free(buf); + if (err == ERANGE) { + /* |buf| was too small, retry with a bigger one. */ + sz <<= 1; + } else if (err != 0) { + /* We got an error not related to the size of |buf|. */ + return -err; + } else if (!ppw) { + /* Not found. */ + return -ENOENT; + } else { + *uid = ppw->pw_uid; + *gid = ppw->pw_gid; + return 0; + } + } while (sz <= MAX_PWENT_SZ); - *uid = ppw->pw_uid; - *gid = ppw->pw_gid; - return 0; + /* A buffer of size MAX_PWENT_SZ is still too small, return an error. */ + return -ERANGE; } /* @@ -420,33 +438,47 @@ int lookup_group(const char *group, gid_t *gid) char *buf = NULL; struct group gr; struct group *pgr = NULL; + /* + * sysconf(_SC_GETGR_R_SIZE_MAX), under glibc, is documented to return + * a suggested starting size for the buffer, so let's try getting this + * size first, and fallback to a default otherwise. + */ ssize_t sz = sysconf(_SC_GETGR_R_SIZE_MAX); if (sz == -1) sz = 65536; /* and mine is as good as yours, really */ - /* - * sysconf(_SC_GETGR_R_SIZE_MAX), under glibc, is documented to return - * the maximum needed size of the buffer, so we don't have to search. - */ - buf = malloc(sz); - if (!buf) - return -ENOMEM; - getgrnam_r(group, &gr, buf, sz, &pgr); - /* - * We're safe to free the buffer here. The strings inside gr point - * inside buf, but we don't use any of them; this leaves the pointers - * dangling but it's safe. pgr points at gr if getgrnam_r succeeded. - */ - free(buf); - /* getgrnam_r(3) does *not* set errno when |pgr| is NULL. */ - if (!pgr) - return -1; + do { + buf = malloc(sz); + if (!buf) + return -ENOMEM; + int err = getgrnam_r(group, &gr, buf, sz, &pgr); + /* + * We're safe to free the buffer here. The strings inside |gr| + * point inside |buf|, but we don't use any of them; this leaves + * the pointers dangling but it's safe. + * |pgr| points at |gr| if getgrnam_r(3) succeeded. + */ + free(buf); + if (err == ERANGE) { + /* |buf| was too small, retry with a bigger one. */ + sz <<= 1; + } else if (err != 0) { + /* We got an error not related to the size of |buf|. */ + return -err; + } else if (!pgr) { + /* Not found. */ + return -ENOENT; + } else { + *gid = pgr->gr_gid; + return 0; + } + } while (sz <= MAX_GRENT_SZ); - *gid = pgr->gr_gid; - return 0; + /* A buffer of size MAX_GRENT_SZ is still too small, return an error. */ + return -ERANGE; } -static int seccomp_action_is_available(const char *wanted) +static bool seccomp_action_is_available(const char *wanted) { if (is_android()) { /* @@ -455,7 +487,7 @@ static int seccomp_action_is_available(const char *wanted) * TODO(crbug.com/978022, jorgelo): Remove once the denial is * fixed. */ - return 0; + return false; } const char actions_avail_path[] = "/proc/sys/kernel/seccomp/actions_avail"; @@ -463,7 +495,7 @@ static int seccomp_action_is_available(const char *wanted) if (!f) { pwarn("fopen(%s) failed", actions_avail_path); - return 0; + return false; } char *actions_avail = NULL; @@ -471,7 +503,7 @@ static int seccomp_action_is_available(const char *wanted) if (getline(&actions_avail, &buf_size, f) < 0) { pwarn("getline() failed"); free(actions_avail); - return 0; + return false; } /* @@ -480,7 +512,9 @@ static int seccomp_action_is_available(const char *wanted) * seccomp actions which include other actions though, so we're good for * now. Eventually we might want to split the string by spaces. */ - return strstr(actions_avail, wanted) != NULL; + bool available = strstr(actions_avail, wanted) != NULL; + free(actions_avail); + return available; } int seccomp_ret_log_available(void) @@ -503,3 +537,9 @@ int seccomp_ret_kill_process_available(void) return ret_kill_process_available; } + +bool seccomp_filter_flags_available(unsigned int flags) +{ + return sys_seccomp(SECCOMP_SET_MODE_FILTER, flags, NULL) != -1 || + errno != EINVAL; +} @@ -59,6 +59,7 @@ int lookup_group(const char *group, gid_t *gid); int seccomp_ret_log_available(void); int seccomp_ret_kill_process_available(void); +bool seccomp_filter_flags_available(unsigned int flags); #ifdef __cplusplus }; /* extern "C" */ diff --git a/test/read_stdin b/test/read_stdin index 29578a6..29578a6 100755..100644 --- a/test/read_stdin +++ b/test/read_stdin diff --git a/tools/Android.bp b/tools/Android.bp index 5e80e12..71bb82d 100644 --- a/tools/Android.bp +++ b/tools/Android.bp @@ -12,6 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "external_minijail_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["external_minijail_license"], +} + python_binary_host { name: "minijail_compile_seccomp_policy", main: "compile_seccomp_policy.py", diff --git a/tools/README.md b/tools/README.md index d056797..e2810bb 100644 --- a/tools/README.md +++ b/tools/README.md @@ -20,9 +20,69 @@ strace -f -e raw=all -o strace.txt -- <program> ./tools/generate_seccomp_policy.py strace.txt > <program>.policy ``` +### Using linux audit logs to generate policy + +*** note +**NOTE**: Certain syscalls made by `minijail0` may be misattributed to the +sandboxed binary and may result in a policy that is overly-permissive. +Please pay some extra attention when manually reviewing the allowable args for +these syscalls: `ioctl`, `socket`, `prctl`, `mmap`, `mprotect`, and `mmap2`. +*** + +Linux kernel v4.14+ support `SECCOMP_RET_LOG`. This allows minijail to log +syscalls via the [audit subsystem][1] (Redhat has a nice overview [here][2]) +instead of blocking them. One caveat of this approach is that `SECCOMP_RET_LOG` +does not log syscall arguments for finer grained filtering. +The audit subsystem itself has a mechanism to log all syscalls. Though a +`SYSCALL` event is more voluminous than a corresponding `SECCOMP` event. +We employ here a combination of both techniques. We rely on `SECCOMP` for all +except the syscalls for which we want finer grained filtering. + +Note that this requires python3 bindings for `auparse` which are generally +available in distro packages named `python3-audit` or `python-audit`. + +#### Per-boot setup of audit rules on DUT + +Set up `audit` rules and an empty seccomp policy for later use. This can be +done in the `pre-start` section of your upstart conf. + +`$UID` is the uid for your process. Using root will lead to logspam. + +As mentioned above, these extra audit rules enable `SYSCALL` auditing which +in turn lets the tool inspect arguments for a pre-selected subset of syscalls. +The list of syscalls here matches the list of keys in `arg_inspection`. + +```shell +for arch in b32 b64; do + auditctl -a exit,always -F uid=$UID -F arch=$arch -S ioctl -S socket \ + -S prctl -S mmap -S mprotect \ + $([ "$arch" = "b32" ] && echo "-S mmap2") -c +done +touch /tmp/empty.policy +``` + +#### Run your program under minijail with an empty policy + +Again, this can be done via your upstart conf. Just be sure to stimulate all +corner cases, error conditions, etc for comprehensive coverage. + +```shell +minijail0 -u $UID -g $GID -L -S /tmp/empty.policy -- <program> +``` + +#### Generate policy using the audit.log + +```shell +./tools/generate_seccomp_policy.py --audit-comm $PROGRAM_NAME audit.log \ + > $PROGRAM_NAME.policy +``` + +Note that the tool can also consume multiple audit logs and/or strace traces to +produce one unified policy. + ## compile_seccomp_policy.py -An external seccomp-bpf compiler that is documented [here][1]. This uses a +An external seccomp-bpf compiler that is documented [here][3]. This uses a slightly different syntax and generates highly-optimized BPF binaries that can be provided to `minijail0`'s `--seccomp-bpf-binary` or `libminijail`'s `minijail_set_secomp_filters()`. This requires the existence of an @@ -63,4 +123,6 @@ This script generates the `constants.json` file from LLVM IR assembly files. This makes it easier to generate architecture-specific `constants.json` files at build-time. -[1]: https://docs.google.com/document/d/e/2PACX-1vQOeYLWmJJrRWvglnMo5cynkUe0gZ9wVsndLLePkJg6dfUXSOUWoveBBeY3u5nQMlEU4dt_vRgj0ifR/pub +[1]: https://people.redhat.com/sgrubb/audit/ +[2]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-system_auditing +[3]: https://docs.google.com/document/d/e/2PACX-1vQOeYLWmJJrRWvglnMo5cynkUe0gZ9wVsndLLePkJg6dfUXSOUWoveBBeY3u5nQMlEU4dt_vRgj0ifR/pub diff --git a/tools/bpf.py b/tools/bpf.py index 75db502..ea495f1 100644 --- a/tools/bpf.py +++ b/tools/bpf.py @@ -69,6 +69,7 @@ SECCOMP_RET_KILL_THREAD = 0x00000000 SECCOMP_RET_TRAP = 0x00030000 SECCOMP_RET_ERRNO = 0x00050000 SECCOMP_RET_TRACE = 0x7ff00000 +SECCOMP_RET_USER_NOTIF = 0x7fc00000 SECCOMP_RET_LOG = 0x7ffc0000 SECCOMP_RET_ALLOW = 0x7fff0000 @@ -132,6 +133,8 @@ def simulate(instructions, arch, syscall_number, *args): return (cost, 'ERRNO', ins.k & SECCOMP_RET_DATA) if ins.k == SECCOMP_RET_TRACE: return (cost, 'TRACE') + if ins.k == SECCOMP_RET_USER_NOTIF: + return (cost, 'USER_NOTIF') if ins.k == SECCOMP_RET_LOG: return (cost, 'LOG') if ins.k == SECCOMP_RET_ALLOW: @@ -220,6 +223,13 @@ class Trace(BasicBlock): super().__init__([SockFilter(BPF_RET, 0x00, 0x00, SECCOMP_RET_TRACE)]) +class UserNotify(BasicBlock): + """A BasicBlock that unconditionally returns USER_NOTIF.""" + + def __init__(self): + super().__init__([SockFilter(BPF_RET, 0x00, 0x00, SECCOMP_RET_USER_NOTIF)]) + + class Log(BasicBlock): """A BasicBlock that unconditionally returns LOG.""" @@ -386,6 +396,8 @@ class AbstractVisitor(abc.ABC): self.visitReturnErrno(block) elif isinstance(block, Trace): self.visitTrace(block) + elif isinstance(block, UserNotify): + self.visitUserNotify(block) elif isinstance(block, Log): self.visitLog(block) elif isinstance(block, Allow): @@ -424,6 +436,10 @@ class AbstractVisitor(abc.ABC): pass @abc.abstractmethod + def visitUserNotify(self, block): + pass + + @abc.abstractmethod def visitLog(self, block): pass @@ -484,6 +500,10 @@ class CopyingVisitor(AbstractVisitor): assert id(block) not in self._mapping self._mapping[id(block)] = Trace() + def visitUserNotify(self, block): + assert id(block) not in self._mapping + self._mapping[id(block)] = UserNotify() + def visitLog(self, block): assert id(block) not in self._mapping self._mapping[id(block)] = Log() @@ -687,7 +707,7 @@ class ArgFilterForwardingVisitor: # want to visit them just yet. if (isinstance(block, KillProcess) or isinstance(block, KillThread) or isinstance(block, Trap) or isinstance(block, ReturnErrno) - or isinstance(block, Trace) or isinstance(block, Log) - or isinstance(block, Allow)): + or isinstance(block, Trace) or isinstance(block, UserNotify) + or isinstance(block, Log) or isinstance(block, Allow)): return block.accept(self.visitor) diff --git a/tools/compile_seccomp_policy.py b/tools/compile_seccomp_policy.py index f3b9eea..f2b714b 100755 --- a/tools/compile_seccomp_policy.py +++ b/tools/compile_seccomp_policy.py @@ -23,6 +23,7 @@ BPF program suitable for use with Minijail in the current architecture. from __future__ import print_function import argparse +import os import sys try: @@ -36,35 +37,39 @@ except ImportError: from minijail import compiler from minijail import parser +CONSTANTS_ERR_MSG = """Could not find 'constants.json' file. +See 'generate_constants_json.py -h'.""" + def parse_args(argv): """Return the parsed CLI arguments for this tool.""" - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument( - '--optimization-strategy', - default=compiler.OptimizationStrategy.BST, - type=compiler.OptimizationStrategy, - choices=list(compiler.OptimizationStrategy)) - parser.add_argument('--include-depth-limit', default=10) - parser.add_argument('--arch-json', default='constants.json') - parser.add_argument( + arg_parser = argparse.ArgumentParser(description=__doc__) + arg_parser.add_argument('--optimization-strategy', + default=compiler.OptimizationStrategy.BST, + type=compiler.OptimizationStrategy, + choices=list(compiler.OptimizationStrategy)) + arg_parser.add_argument('--include-depth-limit', default=10) + arg_parser.add_argument('--arch-json', default='constants.json') + arg_parser.add_argument( '--default-action', type=str, help=('Use the specified default action, overriding any @default ' 'action found in the .policy files. ' - 'This allows the use of permissive actions (allow, log, trace) ' - 'since it is not valid to specify a permissive action in ' - '.policy files. This is useful for debugging.')) - parser.add_argument( + 'This allows the use of permissive actions (allow, log, trace, ' + 'user-notify) since it is not valid to specify a permissive ' + 'action in .policy files. This is useful for debugging.')) + arg_parser.add_argument( '--use-kill-process', action='store_true', help=('Use SECCOMP_RET_KILL_PROCESS instead of ' 'SECCOMP_RET_KILL_THREAD (requires Linux v4.14+).')) - parser.add_argument( - 'policy', help='The seccomp policy.', type=argparse.FileType('r')) - parser.add_argument( - 'output', help='The BPF program.', type=argparse.FileType('wb')) - return parser.parse_args(argv) + arg_parser.add_argument('policy', + help='The seccomp policy.', + type=argparse.FileType('r')) + arg_parser.add_argument('output', + help='The BPF program.', + type=argparse.FileType('wb')) + return arg_parser.parse_args(argv), arg_parser def main(argv=None): @@ -73,7 +78,10 @@ def main(argv=None): if argv is None: argv = sys.argv[1:] - opts = parse_args(argv) + opts, arg_parser = parse_args(argv) + if not os.path.exists(opts.arch_json): + arg_parser.error(CONSTANTS_ERR_MSG) + parsed_arch = arch.Arch.load_from_json(opts.arch_json) policy_compiler = compiler.PolicyCompiler(parsed_arch) if opts.use_kill_process: diff --git a/tools/compiler_unittest.py b/tools/compiler_unittest.py index ae4c1e5..b1592d2 100755 --- a/tools/compiler_unittest.py +++ b/tools/compiler_unittest.py @@ -271,6 +271,14 @@ class CompileFilterStatementTests(unittest.TestCase): block.simulate(self.arch.arch_nr, self.arch.syscalls['read'], 0)[1], 'TRACE') + def test_user_notify(self): + """Accept lines that notify unconditionally.""" + block = self._compile('read: user-notify') + + self.assertEqual( + block.simulate(self.arch.arch_nr, self.arch.syscalls['read'], + 0)[1], 'USER_NOTIF') + def test_log(self): """Accept lines that log unconditionally.""" block = self._compile('read: log') diff --git a/tools/generate_constants_json.py b/tools/generate_constants_json.py index 814c4ae..6b38022 100755 --- a/tools/generate_constants_json.py +++ b/tools/generate_constants_json.py @@ -41,6 +41,9 @@ _TABLE_ENTRY_CONTENTS = re.compile(r'.*?(null|@[a-zA-Z0-9.]+).* (-?\d+)') ParseResults = collections.namedtuple('ParseResults', ['table_name', 'table_entries']) +HELP_EPILOG = """Generate LLVM IR: clang -S -emit-llvm libconstants.gen.c libsyscalls.gen.c +""" + def parse_llvm_ir(ir): """Parses a single LLVM IR file.""" @@ -78,7 +81,7 @@ def main(argv=None): if argv is None: argv = sys.argv[1:] - parser = argparse.ArgumentParser(description=__doc__) + parser = argparse.ArgumentParser(description=__doc__, epilog=HELP_EPILOG) parser.add_argument('--output', help='The path of the generated constants.json file.', type=argparse.FileType('w'), @@ -100,8 +103,8 @@ def main(argv=None): constants_json['arch_nr'] = constants_json['constants']['MINIJAIL_ARCH_NR'] constants_json['bits'] = constants_json['constants']['MINIJAIL_ARCH_BITS'] - # It is a bit more complicated to generate the arch_name, since the constants - # can only output numeric values. Use a hardcoded mapping instead. + # It is a bit more complicated to generate the arch_name, since the + # constants can only output numeric values. Use a hardcoded mapping instead. if constants_json['arch_nr'] == 0xC000003E: constants_json['arch_name'] = 'x86_64' elif constants_json['arch_nr'] == 0x40000003: diff --git a/tools/generate_seccomp_policy.py b/tools/generate_seccomp_policy.py index 2cfb611..3654123 100755 --- a/tools/generate_seccomp_policy.py +++ b/tools/generate_seccomp_policy.py @@ -18,15 +18,22 @@ # This script will take any number of trace files generated by strace(1) # and output a system call filtering policy suitable for use with Minijail. -"""Helper tool to generate a minijail seccomp filter from strace output.""" +"""Tool to generate a minijail seccomp filter from strace or audit output.""" from __future__ import print_function import argparse import collections +import os import re import sys +# auparse may not be installed and is currently optional. +try: + import auparse +except ImportError: + auparse = None + NOTICE = """# Copyright (C) 2018 The Android Open Source Project # @@ -55,23 +62,90 @@ SOCKETCALLS = { 'setsockopt', 'shutdown', 'socket', 'socketpair', } +# List of private ARM syscalls. These can be found in any ARM specific unistd.h +# such as Linux's arch/arm/include/uapi/asm/unistd.h. +PRIVATE_ARM_SYSCALLS = { + 983041: 'ARM_breakpoint', + 983042: 'ARM_cacheflush', + 983043: 'ARM_usr26', + 983044: 'ARM_usr32', + 983045: 'ARM_set_tls', +} + ArgInspectionEntry = collections.namedtuple('ArgInspectionEntry', ('arg_index', 'value_set')) +# pylint: disable=too-few-public-methods +class BucketInputFiles(argparse.Action): + """Buckets input files using simple content based heuristics. + + Attributes: + audit_logs: Mutually exclusive list of audit log filenames. + traces: Mutually exclusive list of strace log filenames. + """ + def __call__(self, parser, namespace, values, option_string=None): + audit_logs = [] + traces = [] + + strace_line_re = re.compile(r'[a-z]+[0-9]*\(.+\) += ') + audit_line_re = re.compile(r'type=(SYSCALL|SECCOMP)') + + for filename in values: + if not os.path.exists(filename): + parser.error(f'Input file {filename} not found.') + with open(filename, mode='r', encoding='utf8') as input_file: + for line in input_file.readlines(): + if strace_line_re.search(line): + traces.append(filename) + break + if audit_line_re.search(line): + audit_logs.append(filename) + break + else: + # Treat it as an strace log to retain legacy behaviour and + # also just in case the strace regex is imperfect. + traces.append(filename) + + setattr(namespace, 'audit_logs', audit_logs) + setattr(namespace, 'traces', traces) +# pylint: enable=too-few-public-methods + + def parse_args(argv): """Returns the parsed CLI arguments for this tool.""" parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument('--frequency', nargs='?', type=argparse.FileType('w'), + parser.add_argument('--verbose', action='store_true', + help='output informational messages to stderr') + parser.add_argument('--frequency', type=argparse.FileType('w'), help='frequency file') - parser.add_argument('--policy', nargs='?', type=argparse.FileType('w'), + parser.add_argument('--policy', type=argparse.FileType('w'), default=sys.stdout, help='policy file') - parser.add_argument('traces', nargs='+', help='The strace logs.') - return parser.parse_args(argv) + parser.add_argument('input-logs', action=BucketInputFiles, + help='strace and/or audit logs', nargs='+') + parser.add_argument('--audit-comm', type=str, metavar='PROCESS_NAME', + help='relevant process name from the audit.log files') + opts = parser.parse_args(argv) + + if opts.audit_logs and not auparse: + parser.error('Python bindings for the audit subsystem were not found.\n' + 'Please install the python3-audit (sometimes python-audit)' + ' package for your distro to process audit logs: ' + f'{opts.audit_logs}') + + if opts.audit_logs and not opts.audit_comm: + parser.error(f'--audit-comm is required when using audit logs as input:' + f' {opts.audit_logs}') + + if not opts.audit_logs and opts.audit_comm: + parser.error('--audit-comm was specified yet none of the input files ' + 'matched our hueristic for an audit log') + + return opts def get_seccomp_bpf_filter(syscall, entry): - """Return a minijail seccomp-bpf filter expression for the syscall.""" + """Returns a minijail seccomp-bpf filter expression for the syscall.""" arg_index = entry.arg_index arg_values = entry.value_set atoms = [] @@ -87,8 +161,7 @@ def get_seccomp_bpf_filter(syscall, entry): else: atoms.extend(['arg2 in ~PROT_EXEC', 'arg2 in ~PROT_WRITE']) arg_values = set() - atoms.extend('arg%d == %s' % (arg_index, arg_value) - for arg_value in arg_values) + atoms.extend(f'arg{arg_index} == {arg_value}' for arg_value in arg_values) return ' || '.join(atoms) @@ -98,7 +171,7 @@ def parse_trace_file(trace_filename, syscalls, arg_inspection): ('x86' in trace_filename and '64' not in trace_filename)) - with open(trace_filename) as trace_file: + with open(trace_filename, encoding='utf8') as trace_file: for line in trace_file: matches = LINE_RE.match(line) if not matches: @@ -108,6 +181,13 @@ def parse_trace_file(trace_filename, syscalls, arg_inspection): if uses_socketcall and syscall in SOCKETCALLS: syscall = 'socketcall' + # strace omits the 'ARM_' prefix on all private ARM syscalls. Add + # it manually here as a workaround. These syscalls are exclusive + # to ARM so we don't need to predicate this on a trace_filename + # based heuristic for the arch. + if f'ARM_{syscall}' in PRIVATE_ARM_SYSCALLS.values(): + syscall = f'ARM_{syscall}' + syscalls[syscall] += 1 args = [arg.strip() for arg in args.split(',')] @@ -117,6 +197,92 @@ def parse_trace_file(trace_filename, syscalls, arg_inspection): arg_inspection[syscall].value_set.add(arg_value) +def parse_audit_log(audit_log, audit_comm, syscalls, arg_inspection): + """Parses one audit.log file generated by the Linux audit subsystem.""" + + unknown_syscall_re = re.compile(r'unknown-syscall\((?P<syscall_num>\d+)\)') + + au = auparse.AuParser(auparse.AUSOURCE_FILE, audit_log) + # Quick validity check for whether this parses as a valid audit log. The + # first event should have at least one record. + if not au.first_record(): + raise ValueError(f'Unable to parse audit log file {audit_log.name}') + + # Iterate through events where _any_ contained record matches + # ((type == SECCOMP || type == SYSCALL) && comm == audit_comm). + au.search_add_item('type', '=', 'SECCOMP', auparse.AUSEARCH_RULE_CLEAR) + au.search_add_item('type', '=', 'SYSCALL', auparse.AUSEARCH_RULE_OR) + au.search_add_item('comm', '=', f'"{audit_comm}"', + auparse.AUSEARCH_RULE_AND) + + # auparse_find_field(3) will ignore preceding fields in the record and + # at the same time happily cross record boundaries when looking for the + # field. This helper method always seeks the cursor back to the first + # field in the record and stops searching before crossing over to the + # next record; making the search far less error prone. + # Also implicitly seeks the internal 'cursor' to the matching field + # for any subsequent calls like auparse_interpret_field. + def _find_field_in_current_record(name): + au.first_field() + while True: + if au.get_field_name() == name: + return au.get_field_str() + if not au.next_field(): + return None + + while au.search_next_event(): + # The event may have multiple records. Loop through all. + au.first_record() + for _ in range(au.get_num_records()): + event_type = _find_field_in_current_record('type') + comm = _find_field_in_current_record('comm') + # Some of the records in this event may not be relevant + # despite the event-specific search filter. Skip those. + if (event_type not in ('SECCOMP', 'SYSCALL') or + comm != f'"{audit_comm}"'): + au.next_record() + continue + + if not _find_field_in_current_record('syscall'): + raise ValueError(f'Could not find field "syscall" in event of ' + f'type {event_type}') + # Intepret the syscall field that's under our 'cursor' following the + # find. Interpreting fields yields human friendly names instead + # of integers. E.g '16' -> 'ioctl'. + syscall = au.interpret_field() + + # TODO(crbug/1172449): Add these syscalls to upstream + # audit-userspace and remove this workaround. + # This is redundant but safe for non-ARM architectures due to the + # disjoint set of private syscall numbers. + match = unknown_syscall_re.match(syscall) + if match: + syscall_num = int(match.group('syscall_num')) + syscall = PRIVATE_ARM_SYSCALLS.get(syscall_num, syscall) + + if ((syscall in arg_inspection and event_type == 'SECCOMP') or + (syscall not in arg_inspection and event_type == 'SYSCALL')): + # Skip SECCOMP records for syscalls that require argument + # inspection. Similarly, skip SYSCALL records for syscalls + # that do not require argument inspection. Technically such + # records wouldn't exist per our setup instructions but audit + # sometimes lets a few records slip through. + au.next_record() + continue + elif event_type == 'SYSCALL': + arg_field_name = f'a{arg_inspection[syscall].arg_index}' + if not _find_field_in_current_record(arg_field_name): + raise ValueError(f'Could not find field "{arg_field_name}"' + f'in event of type {event_type}') + # Intepret the arg field that's under our 'cursor' following the + # find. This may yield a more human friendly name. + # E.g '5401' -> 'TCGETS'. + arg_inspection[syscall].value_set.add(au.interpret_field()) + + syscalls[syscall] += 1 + au.next_record() + + def main(argv=None): """Main entrypoint.""" @@ -136,9 +302,20 @@ def main(argv=None): 'mprotect': ArgInspectionEntry(2, set([])), # int prot } + if opts.verbose: + # Print an informational message to stderr in case the filetype detection + # heuristics are wonky. + print('Generating a seccomp policy using these input files:', + file=sys.stderr) + print(f'Strace logs: {opts.traces}', file=sys.stderr) + print(f'Audit logs: {opts.audit_logs}', file=sys.stderr) + for trace_filename in opts.traces: parse_trace_file(trace_filename, syscalls, arg_inspection) + for audit_log in opts.audit_logs: + parse_audit_log(audit_log, opts.audit_comm, syscalls, arg_inspection) + # Add the basic set if they are not yet present. basic_set = [ 'restart_syscall', 'exit', 'exit_group', 'rt_sigreturn', @@ -168,13 +345,14 @@ def main(argv=None): for syscall in sorted_syscalls: if syscall in arg_inspection: - arg_filter = get_seccomp_bpf_filter(syscall, arg_inspection[syscall]) + arg_filter = get_seccomp_bpf_filter(syscall, + arg_inspection[syscall]) else: arg_filter = ALLOW - print('%s: %s' % (syscall, arg_filter), file=opts.policy) + print(f'{syscall}: {arg_filter}', file=opts.policy) if opts.frequency is not None: - print('%s: %s' % (syscall, syscalls[syscall]), - file=opts.frequency) + print(f'{syscall}: {syscalls[syscall]}', file=opts.frequency) + if __name__ == '__main__': sys.exit(main(sys.argv[1:])) diff --git a/tools/parser.py b/tools/parser.py index a2ba336..0db0f62 100644 --- a/tools/parser.py +++ b/tools/parser.py @@ -63,7 +63,7 @@ _TOKEN_SPECIFICATION = ( ('RETURN', r'\breturn\b'), ('ACTION', r'\ballow\b|\bkill-process\b|\bkill-thread\b|\bkill\b|\btrap\b|' - r'\btrace\b|\blog\b' + r'\btrace\b|\blog\b|\buser-notify\b' ), ('IDENTIFIER', r'[a-zA-Z_][a-zA-Z_0-9-@]*'), ) @@ -370,6 +370,7 @@ class PolicyParser: # | 'kill-thread' # | 'kill' # | 'trap' + # | 'user-notify' # ; def _parse_default_action(self, tokens): if not tokens: @@ -386,6 +387,8 @@ class PolicyParser: return self._kill_action if action_token.value == 'trap': return bpf.Trap() + if action_token.value == 'user-notify': + return bpf.UserNotify() return self._parser_state.error( 'invalid permissive default action', token=action_token) @@ -396,6 +399,7 @@ class PolicyParser: # | 'trap' # | 'trace' # | 'log' + # | 'user-notify' # | 'return' , single-constant # ; def parse_action(self, tokens): @@ -415,6 +419,8 @@ class PolicyParser: return bpf.Trap() if action_token.value == 'trace': return bpf.Trace() + if action_token.value == 'user-notify': + return bpf.UserNotify() if action_token.value == 'log': return bpf.Log() elif action_token.type == 'NUMERIC_CONSTANT': diff --git a/tools/parser_unittest.py b/tools/parser_unittest.py index e76b697..1570e51 100755 --- a/tools/parser_unittest.py +++ b/tools/parser_unittest.py @@ -352,6 +352,10 @@ class ParseFilterTests(unittest.TestCase): parser.Filter(None, bpf.Trace()), ]) self.assertEqual( + self.parser.parse_filter(self._tokenize('user-notify')), [ + parser.Filter(None, bpf.UserNotify()), + ]) + self.assertEqual( self.parser.parse_filter(self._tokenize('log')), [ parser.Filter(None, bpf.Log()), ]) @@ -149,12 +149,24 @@ void do_log(int priority, const char *format, ...) dprintf(logging_config.fd, "\n"); } -int lookup_syscall(const char *name) +/* + * Returns the syscall nr and optionally populates the index in the pointer + * |ind| if it is non-NULL. + */ +int lookup_syscall(const char *name, size_t *ind) { + size_t ind_tmp = 0; const struct syscall_entry *entry = syscall_table; - for (; entry->name && entry->nr >= 0; ++entry) - if (!strcmp(entry->name, name)) + for (; entry->name && entry->nr >= 0; ++entry) { + if (!strcmp(entry->name, name)) { + if (ind != NULL) + *ind = ind_tmp; return entry->nr; + } + ind_tmp++; + } + if (ind != NULL) + *ind = -1; return -1; } @@ -434,7 +446,8 @@ char *path_join(const char *external_path, const char *internal_path) /* One extra char for '/' and one for '\0', hence + 2. */ pathlen = strlen(external_path) + strlen(internal_path) + 2; path = malloc(pathlen); - snprintf(path, pathlen, "%s/%s", external_path, internal_path); + if (path) + snprintf(path, pathlen, "%s/%s", external_path, internal_path); return path; } @@ -16,6 +16,8 @@ #include <syslog.h> #include <unistd.h> +#include "libsyscalls.h" + #ifdef __cplusplus extern "C" { #endif @@ -142,7 +144,12 @@ static inline bool debug_logging_allowed(void) { #endif } -int lookup_syscall(const char *name); +static inline size_t get_num_syscalls(void) +{ + return syscall_table_size; +} + +int lookup_syscall(const char *name, size_t *ind); const char *lookup_syscall_name(int nr); long int parse_single_constant(char *constant_str, char **endptr); diff --git a/util_unittest.cc b/util_unittest.cc index ab4805a..35a99e5 100644 --- a/util_unittest.cc +++ b/util_unittest.cc @@ -13,6 +13,7 @@ #include <gtest/gtest.h> +#include "bpf.h" #include "util.h" namespace { @@ -158,3 +159,202 @@ TEST(environment, copy_and_modify) { minijail_free_env(env); } + +TEST(parse_single_constant, formats) { + char *end; + long int c = 0; + std::string constant; + + // Check base 10 works. + constant = "1234"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(1234, c); + + // Check base 16 works. + constant = "0x1234"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(0x1234, c); + + // Check base 8 works. + constant = "01234"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(01234, c); +} + +TEST(parse_constant, unsigned) { + char *end; + long int c = 0; + std::string constant; + +#if defined(BITS32) + constant = "0x80000000"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(0x80000000U, static_cast<unsigned long int>(c)); + +#elif defined(BITS64) + constant = "0x8000000000000000"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(0x8000000000000000UL, static_cast<unsigned long int>(c)); + +#else +# error "unknown bits!" +#endif +} + +TEST(parse_constant, unsigned_toobig) { + char *end; + long int c = 0; + std::string constant; + +#if defined(BITS32) + constant = "0x100000000"; // Too big for 32-bit unsigned long int. + c = parse_constant(const_cast<char*>(constant.data()), &end); + // Error case should return 0. + EXPECT_EQ(0, c); + +#elif defined(BITS64) + constant = "0x10000000000000000"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + // Error case should return 0. + EXPECT_EQ(0, c); + +#else +# error "unknown bits!" +#endif +} + +TEST(parse_constant, signed) { + char *end; + long int c = 0; + std::string constant = "-1"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(-1, c); +} + +TEST(parse_constant, signed_toonegative) { + char *end; + long int c = 0; + std::string constant; + +#if defined(BITS32) + constant = "-0x80000001"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + // Error case should return 0. + EXPECT_EQ(0, c); + +#elif defined(BITS64) + constant = "-0x8000000000000001"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + // Error case should return 0. + EXPECT_EQ(0, c); + +#else +# error "unknown bits!" +#endif +} + +TEST(parse_constant, complements) { + char* end; + long int c = 0; + std::string constant; + +#if defined(BITS32) + constant = "~0x005AF0FF|~0xFFA50FFF"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(c, 0xFFFFFF00); + constant = "0x0F|~(0x005AF000|0x00A50FFF)|0xF0"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(c, 0xFF0000FF); + +#elif defined(BITS64) + constant = "~0x00005A5AF0F0FFFF|~0xFFFFA5A50F0FFFFF"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(c, 0xFFFFFFFFFFFF0000UL); + constant = "0x00FF|~(0x00005A5AF0F00000|0x0000A5A50F0FFFFF)|0xFF00"; + c = parse_constant(const_cast<char*>(constant.data()), &end); + EXPECT_EQ(c, 0xFFFF00000000FFFFUL); + +#else +# error "unknown bits!" +#endif +} + +TEST(parse_constant, parenthesized_expresions) { + char* end; + + const std::vector<const char*> bad_expressions = { + "(1", "1)", "(1)1", "|(1)", "(1)|", "()", + "(", "((", "(()", "(()1", "1(0)", + }; + for (const auto* expression : bad_expressions) { + std::string mutable_expression = expression; + long int c = + parse_constant(const_cast<char*>(mutable_expression.data()), &end); + EXPECT_EQ(reinterpret_cast<const void*>(end), + reinterpret_cast<const void*>(mutable_expression.data())); + // Error case should return 0. + EXPECT_EQ(c, 0) << "For expression: \"" << expression << "\""; + } + + const std::vector<const char*> good_expressions = { + "(3)", "(1)|2", "1|(2)", "(1)|(2)", "((3))", "0|(1|2)", "(0|1|2)", + }; + for (const auto* expression : good_expressions) { + std::string mutable_expression = expression; + long int c = + parse_constant(const_cast<char*>(mutable_expression.data()), &end); + EXPECT_EQ(c, 3) << "For expression: \"" << expression << "\""; + } +} + +TEST(parse_size, complete) { + size_t size; + + ASSERT_EQ(0, parse_size(&size, "42")); + ASSERT_EQ(42U, size); + + ASSERT_EQ(0, parse_size(&size, "16K")); + ASSERT_EQ(16384U, size); + + ASSERT_EQ(0, parse_size(&size, "1M")); + ASSERT_EQ(1024U * 1024, size); + + uint64_t gigabyte = 1024ULL * 1024 * 1024; + ASSERT_EQ(0, parse_size(&size, "3G")); + ASSERT_EQ(3U, size / gigabyte); + ASSERT_EQ(0U, size % gigabyte); + + ASSERT_EQ(0, parse_size(&size, "4294967294")); + ASSERT_EQ(3U, size / gigabyte); + ASSERT_EQ(gigabyte - 2, size % gigabyte); + +#if __WORDSIZE == 64 + uint64_t exabyte = gigabyte * 1024 * 1024 * 1024; + ASSERT_EQ(0, parse_size(&size, "9E")); + ASSERT_EQ(9U, size / exabyte); + ASSERT_EQ(0U, size % exabyte); + + ASSERT_EQ(0, parse_size(&size, "15E")); + ASSERT_EQ(15U, size / exabyte); + ASSERT_EQ(0U, size % exabyte); + + ASSERT_EQ(0, parse_size(&size, "18446744073709551614")); + ASSERT_EQ(15U, size / exabyte); + ASSERT_EQ(exabyte - 2, size % exabyte); + + ASSERT_EQ(-ERANGE, parse_size(&size, "16E")); + ASSERT_EQ(-ERANGE, parse_size(&size, "19E")); + ASSERT_EQ(-EINVAL, parse_size(&size, "7GTPE")); +#elif __WORDSIZE == 32 + ASSERT_EQ(-ERANGE, parse_size(&size, "5G")); + ASSERT_EQ(-ERANGE, parse_size(&size, "9G")); + ASSERT_EQ(-ERANGE, parse_size(&size, "9E")); + ASSERT_EQ(-ERANGE, parse_size(&size, "7GTPE")); +#endif + + ASSERT_EQ(-EINVAL, parse_size(&size, "")); + ASSERT_EQ(-EINVAL, parse_size(&size, "14u")); + ASSERT_EQ(-EINVAL, parse_size(&size, "14.2G")); + ASSERT_EQ(-EINVAL, parse_size(&size, "-1G")); + ASSERT_EQ(-EINVAL, parse_size(&size, "; /bin/rm -- ")); +} |